argon bulletin board
Факултети => Факултет по математика и информатика => Темата е започната от: smm в 10.12.2006, 08:59:10
-
Става дума за проекта по графика, който правя на Джава. Направих групиране на фигурите с масиви, обаче не знам как да направя да се въртят около общ център. Пробвах с намиране на макс. и мин. X и Y, но когато се опитам да групирам още фигури, ми дава грешка. А има ли в Джава някаква фигура(или нещо подобно), в която да вкарам групата и така да намеря центъра на ротация на всичките, както и ограждащия им правоъгъглник?
-
Здравей smm,
Потърси във форума теми за курса по графика (или отворен код). Предоставил съм си моя проект преди време. Групирането го направих с дървета, а не с масив. Там има и неща за ротация, ако искаш хвърли един поглед.
Иначе каква грешка ти дава? Опитай се да дебъгнеш. А за Джава конкретно, прати малко код и къде точно ти дава грешката. Тук има много хора, които програмират на този език и предполагам, че ще ти кажат къде грешиш.
поздрави:
Атанас Чанев
-
nie da ne sme iasnovidci che da ti znaem koda i da razberem shto ti dava greshka
-
Syjalqvam, 4e ne pratih kod. Eto:
public void findXY(ArrayList arr, double maxX, double maxY, double minX, double minY) {
maxX = ((Figure) arr.get(0)).shape.getBounds().getMaxX();
maxY = ((Figure) arr.get(0)).shape.getBounds().getMaxY();
minX = ((Figure) arr.get(0)).shape.getBounds().getMinX();
minY = ((Figure) arr.get(0)).shape.getBounds().getMinY();
for (int i = 1; i < arr.size(); i++) {
((BaseObject) arr.get(i)).isSelected = true;
double newMaxX = ((Figure) arr.get(i)).shape.getBounds().getMaxX();
double newMaxY = ((Figure) arr.get(i)).shape.getBounds().getMaxY();
double newMinX = ((Figure) arr.get(i)).shape.getBounds().getMinX();
double newMinY = ((Figure) arr.get(i)).shape.getBounds().getMinY();
if (newMaxX > maxX) {
maxX = newMaxX;
}
if (newMaxY > maxY) {
maxY = newMaxY;
}
if (newMinX < minX) {
minX = newMinX;
}
if (newMinY < minY) {
minY = newMinY;
}
if (arr.get(i) instanceof Group) {
findXY(((Group) arr.get(i)).group, maxX, maxY, minX, minY);
}
}
}
Greshktata mi q dava , ne kogato se opitam da grupiram oshte figuri, naprotiv, grupiraneto stava, no ako deselectiram figurite i se opitam da gi selektiram otnovo dava gre6ka. Da pratq li oshte kod, za da stane po-qsno?
-
public void selectObject(ArrayList arr, int x, int y) {
for (int i = arr.size() - 1; i > -1; i--) {
if (arr.get(i) instanceof Figure) {
AffineTransform rotate = AffineTransform.getRotateInstance(((Figure) arr.get(i)).angle,
((Figure) arr.get(i)).rotatex, ((Figure) arr.get(i)).rotatey);
double oldPoint[] = new double[] {x, y, x, y};
double newPoint[] = new double[] {x, y, x, y};
try {
rotate.inverseTransform(oldPoint, 0, newPoint, 0, 1);
}
catch (NoninvertibleTransformException ex) {
}
AffineTransform move = AffineTransform.getTranslateInstance(((Figure) arr.get(i)).movex,
((Figure) arr.get(i)).movey);
try {
move.inverseTransform(oldPoint, 2, newPoint, 2, 1);
}
catch (NoninvertibleTransformException ex1) {
}
if (((Figure) arr.get(i)).shape.contains(newPoint[0], newPoint[1]) ||
((Figure) arr.get(i)).shape.contains(newPoint[2], newPoint[3])) {
((Figure) arr.get(i)).isSelected = true;
break;
}
}
else if (arr.get(i) instanceof Group) {
boolean isGroup = isGrouped(((Group) arr.get(i)).group, x, y);
if (isGroup == true) {
((BaseObject) arr.get(i)).isSelected = true;
findXY(((Group) arr.get(i)).group, maxX, maxY, minX, minY);
}
}
}
}
public boolean isGrouped(ArrayList arr, int x, int y) {
for (int i = 0; i < arr.size(); i++) {
if (arr.get(i) instanceof Group) {
boolean isUnderGroup = isGrouped(((Group) arr.get(i)).group, x, y);
if (isUnderGroup == true) {
return true;
}
}
else {
AffineTransform rotate = AffineTransform.getRotateInstance(((Figure) arr.get(i)).angle,
((Figure) arr.get(i)).rotatex, ((Figure) arr.get(i)).rotatey);
double oldPoint[] = new double[] {x, y, x, y};
double newPoint[] = new double[] {x, y, x, y};
try {
rotate.inverseTransform(oldPoint, 0, newPoint, 0, 1);
}
catch (NoninvertibleTransformException ex) {
}
AffineTransform move = AffineTransform.getTranslateInstance(((Figure) arr.get(i)).movex,
((Figure) arr.get(i)).movey);
try {
move.inverseTransform(oldPoint, 2, newPoint, 2, 1);
}
catch (NoninvertibleTransformException ex1) {
}
if (((Figure) arr.get(i)).shape.contains(newPoint[0], newPoint[1]) ||
((Figure) arr.get(i)).shape.contains(newPoint[2], newPoint[3])) {
((Figure) arr.get(i)).isSelected = true;
return true;
}
}
}
return false;
}
public void findXY(ArrayList arr, double maxX, double maxY, double minX, double minY) {
maxX = ((Figure) arr.get(0)).shape.getBounds().getMaxX();
maxY = ((Figure) arr.get(0)).shape.getBounds().getMaxY();
minX = ((Figure) arr.get(0)).shape.getBounds().getMinX();
minY = ((Figure) arr.get(0)).shape.getBounds().getMinY();
for (int i = 1; i < arr.size(); i++) {
((BaseObject) arr.get(i)).isSelected = true;
double newMaxX = ((Figure) arr.get(i)).shape.getBounds().getMaxX();
double newMaxY = ((Figure) arr.get(i)).shape.getBounds().getMaxY();
double newMinX = ((Figure) arr.get(i)).shape.getBounds().getMinX();
double newMinY = ((Figure) arr.get(i)).shape.getBounds().getMinY();
if (newMaxX > maxX) {
maxX = newMaxX;
}
if (newMaxY > maxY) {
maxY = newMaxY;
}
if (newMinX < minX) {
minX = newMinX;
}
if (newMinY < minY) {
minY = newMinY;
}
if (arr.get(i) instanceof Group) {
findXY(((Group) arr.get(i)).group, maxX, maxY, minX, minY);
}
}
}
-
i kva e "greshkata"
obiknoveno "greshkite" v Java si pishat kakvi se i se narichat exceptioni
na koi red i prochie
-
smm : slushai sq HACK
predpolagam A. Penev nqma da se syrdi :)
kato pusnesh rotate...
praskai edin message molq izberete tochka za centar na rotaciqta :)
clickash nqkade praskash edna MOSHNA chervena tochka
i vyrtish sichko okolo nego :+)
se pak tova ceh Photoshop si namira tochkata nishto ne znachi imash rotaciq i to okolo obsht centar nali taka :)
ako go napriash kakto kazvam de; )
prsoto ostavqsh otgovornosta za obshtiq centar na potrebitelq
daje potrebitelq bi triialo da se kefi :)
-
smm, ето и моето предложение за ротация слагаш си пръста където искаш в/у екрана, след това казваш на някой да ти завърти монитора около пръста и ето ти ротация!
-
Greshkata mi q dava v metoda selectObject na reda, na koyto izvikvam metoda findXY. Kolkoto do zadavane na to4ka za rotaciq, A.Penev edva li mnogo shte se kefi na tova. Iskam da pitam oshte neshto. V metoda selectObject, kakto i v isGroped sym izpolzval inverseTransform za obryshtane na translaciqta i rotaciqta, no samo za ednata transformaciq deystva. Ako iskam da selektiram nqkoq figura, si ukazva staroto mqsto, a ne novoto. Ako napraimer narisuvam elipsa i q premestq, ukazva se novoto mqsto, no ako naprimer q zavyrtq sled tova, si ukazva predishnoto mqsto. Nqkoi znae li kak da opravq tova?
-
Става дума за проекта по графика, който правя на Джава. Направих групиране на фигурите с масиви, обаче не знам как да направя да се въртят около общ център. Пробвах с намиране на макс. и мин. X и Y, но когато се опитам да групирам още фигури, ми дава грешка. А има ли в Джава някаква фигура(или нещо подобно), в която да вкарам групата и така да намеря центъра на ротация на всичките, както и ограждащия им правоъгъглник?
Най-"хубавият" център, който се смята автоматично за една фигура ( група = множество фигури ), е средноаритметичните координати на всички върхове.
Ако смяташ центъра като средно на мин и макс координати, фигурите ще се измятат по различен начин на всяко ново завъртане.
-
da tosh otgovori
a inache smm
za inversTransform
sled kato q invertnesh transformirash masiv ot 2 stoinosti tam x i v nov masiv nali ?
af.transform mai beshe metoda..
sled kato transformirash tezi 2 to4ki v novite 2 ot pyrvata transformaciq e novopoluchenite gi transformirai spriamo sledvashtata
ima razbira se i izrudski nachin vinagi moje da poluchish samata matrica na vsqka ot transformaciite i da si transformirash 2te glupavi to4ki opa tq e edna tochka e.getX() e.getY() rychno.
p.s. bih ti preporachal ako iskash temata ti da e polezna i na drugi da smenish zaglavieto tai kato tuk stava vapros za obsht centar pri rotaciq na grupirani ili na mnojestveno selectnati figuri.
ne govorim tochnoza grupirane
-
OK. Smenih zaglavieto na "Kompiutyrna grafika", vseki koyto se zanimava s proekta, shte se seti za kakvo stava duma, oshte poveche che mnogo kolegi gi skysaha i sega bi trqbvalo da se vpregnat pove4e da rabotqt po proekta... Kolkoto do srednoaritmeti4nite koordinati na vyrhovete, dosega ne se bqh se6tal za tova. Shte vidq kakvo shte se poluchi...
-
За първия пост с код:
Аз не мога да разбера две неща:
1. Защо точките са ти от тип double?
2. Защо обхождаш списък с рекурсивно извикване (в края на функцията)?
Сега предложението ми. Защо не си направиш обект група от фигури, който да съдържа списъка, също да има полета център и нещо като rotationАngle.
поздрави:
а.
-
shte ni svetnesh li kvo e suobshtenieto v exceptiona shtoto me murzi da ti cheta i da ti osmisliam celia koT puk i podoziram che ako ne kajesh kakva e greshkata shte ia podmina tochno kakto ti si ia podminal
-
Syobshtenieto v exceptiona e ClassCastException i so4i reda, na koyto izvikvam metoda findXY. Masiva go obhojdam rekursivno, poneje v nego (grupata) moje da ima drug masiv(podgrupa). To4kite pyrvona4alno gi deklarirah kato int, oba4e JBuilder-a mi dava 4e trqbva da sa ot tip double.
-
Tova za inverseTransform ne shte da se polu4i. Nqkoy moje li da pokaje kakvo trqbva da se promeni vyv funkciqta selectObject?
-
predpolagam che greshkata ti e v tova:
(Group) arr.get(i)
po niakakuv povod objecta koito vadish ot lista ne moje da se castne do group (veroiatno ne e grupa znam li?
moje li v toia list da imash figura koiato ne e grupa?
-
Qsno. A za inverseTransform nqkoy moje li da pomogne? Pri men neshto ne se poluchava.
-
smm,
Никой не може да ти помогне, освен ако не кажеш какво точно не ти се получава и от коя библиотека е функцията inverseTransform (ако е от някаква стандартна библиотека). Дори не си казал дали използваш OpenGL (би трябвало това да използваш), коя версия и т.н. Тези, които пишат във форума не са гадатели.
а.
-
Mnogo se izvinqvam. Ne, ne izpolzvam OpenGL, a Graphics2D. InverseTransform e ot klasa AffineTransform za obryshtane na matricata na preobrazovanie. Eto i malko kod:
public void selectObject(ArrayList arr, int x, int y) {
for (int i = arr.size() - 1; i > -1; i--) {
int j = i + 1;
if (arr.get(i) instanceof Figure) {
AffineTransform move = AffineTransform.getTranslateInstance( ( (Figure)
arr.get(i)).movex,
( (Figure) arr.get(i)).movey);
AffineTransform rotate = AffineTransform.getRotateInstance( ( (Figure)
arr.get(i)).angle,
( (Figure) arr.get(i)).rotatex, ( (Figure) arr.get(i)).rotatey);
double oldPoint1[] = new double[] {x, y};
double newPoint1[] = new double[] {x, y};
double oldPoint2[] = new double[] {newPoint1[0], newPoint1[1]};
double newPoint2[] = new double[] {newPoint1[0], newPoint1[1]};
try {
move.inverseTransform(oldPoint1, 0, newPoint1, 0, 1);
}
catch (NoninvertibleTransformException e) {
}
try {
rotate.inverseTransform(oldPoint2, 0, newPoint2, 0, 1);
}
catch (NoninvertibleTransformException e) {
}
if (((Figure) arr.get(i)).shape.contains(newPoint2[0], newPoint2[1])) {
((Figure) arr.get(i)).isSelected = true;
break;
}
}
else if (arr.get(i) instanceof Group) {
boolean isGroup = isGrouped(((Group) arr.get(i)).group, x, y);
if (isGroup) {
((BaseObject) arr.get(i)).isSelected = true;
findXY(((Group) arr.get(i)).group, maxX, maxY, minX, minY);
}
}
}
}
Zna4i pri selektirane i ukzavane na primitiv, si pokazva staroto mqsto, t.e. predi transformaciqta. Naiden nali kaza, 4e to4kite polu4eni pri invertirane na ednata transformaciq, trqbva da transormiram sprqmo sledvashtata transformaciq. Az tova se i opitah da napravq v poso4niq po-gore kod. Oba4e samo pri rotaciqta novoto mqsto se ukazva, no pri mestene- ne. Za rotaciq itranslaciq izpolzvam AffineTransform.
-
Здрасти,
Не съм запознат с тази библиотека. Може старите координати да ги пазиш някъде и като избираш да се рисуват те. Опитай се да дебъгнеш.
поздрави:
а.
-
Blagodarq ti mnogo! Tova za centyra na rotaciq, koeto Tosh kaza, stana, za koeto mnogo mu blagodarq! :bravo: Az ve4e syjalqvam 4e ne napravih proekta s OpenGL, no ve4e e kysno, poneje ostavat samo nqkolko dena do izpita. :-(
-
Artanis, a kak moga da si importna bibliotekata gl4? Pri men ne se polu4ava, qvno q nqmam. Ot universitetata mi bqha zapisali JBuilder-a, qvno tazi biblioteka na vyrvi s nego.
-
Upsqh da opravq problema s ukazvaneto pri transformaciite! :sun: Okaza se, 4e vtoriq masiv s novite to4ki trqbva da go deklariram sled kato transformiram to4kata ot pyrvata transformaciq.
-
Поздравления!
Когато аз си правих проекта ползвах GL4Javа. Това не е стандартна библиотека, но може да се дръпне от сайта на проекта.
Успех на изпита!
а.
-
Blagodarq na vsi4ki, koito mi pomognaha! :bravo:
-
:cry: Така като гледам скоро няма да си взема изпита по КГ ..... :cry: Нищо не разбирам за жалост ..... Някой може ли да ми каже какви са изискванията на А.Пенев относно проекта, че не съм слушала внимателно пак :-)
-
мисля че ги има в помагалото :+)
а иначе карам на спомен все пак
трябва да може да се рисуват 3 фигури
едната от тях задължително трябва да е елипса.
трябва да могат да си сменят цветовете поне по 3 начина
трябва да могат да се групират поне по 3 начина
трябва да могат да се избират , да се ротират , местят и разтягат.
групирането трябва да е иерархично т.е. група в група и като ънгрупираш трябва да е както трябва нали да се разпадат на съставните си части.
трябва да могат да се записва цялото нещо в файл което си нарисувал/ла и да се запазват там цветове разтягания както и групите.
друго нензам кво имаше .. :)
-
Ето това съм записала на упражненията http://store4.data.bg/ivelinag/grafika/ .
Дано да успееш да разбереш какво съм писала, че пиша грозно и може да имам правописни грешки :-D
// сега видях, че нещо не се отварят. ама дата.бг какво искаш, до утре може и да се оправи
-
:-) Мерси за информацията .... Ами да ви питам още нещо, някой сдобил ли се е с упражненията, които са към ръководството, че страницата която е посочена в рък. не се отваря. А не съм ходила към университета да ги искам от А.Пенев. Мерси още веднъж . :-)