argon bulletin board

Факултети => Факултет по математика и информатика => Темата е започната от: smm в 10.12.2006, 08:59:10

Титла: Компютърна графика
Публикувано от: smm в 10.12.2006, 08:59:10
Става дума за проекта по графика, който правя на Джава. Направих групиране на фигурите с масиви, обаче не знам как да направя да се въртят около общ център. Пробвах с намиране на макс. и мин. X и  Y, но когато се опитам да групирам още фигури, ми дава грешка. А има ли в Джава някаква фигура(или нещо подобно), в която да вкарам групата и така да намеря центъра на ротация на всичките, както и ограждащия им правоъгъглник?
Титла: Re: Групиране на фигури
Публикувано от: artanis в 10.12.2006, 12:34:50
Здравей smm,

Потърси във форума теми за курса по графика (или отворен код). Предоставил съм си моя проект преди време. Групирането го направих с дървета, а не с масив. Там има и неща за ротация, ако искаш хвърли един поглед.

Иначе каква грешка ти дава? Опитай се да дебъгнеш. А за Джава конкретно, прати малко код и къде точно ти дава грешката. Тук има много хора, които програмират на този език и предполагам, че ще ти кажат къде грешиш.

поздрави:
Атанас Чанев
Титла: Re: Групиране на фигури
Публикувано от: Stilgar в 11.12.2006, 03:11:49
nie da ne sme iasnovidci che da ti znaem koda i da razberem shto ti dava greshka
Титла: Re: Групиране на фигури
Публикувано от: smm в 11.12.2006, 08:53:13
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?
Титла: Re: Групиране на фигури
Публикувано от: smm в 11.12.2006, 08:59:46
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);
      }
    }
  }
Титла: Re: Групиране на фигури
Публикувано от: Stilgar в 11.12.2006, 12:03:07
i kva e "greshkata"
obiknoveno "greshkite" v Java si pishat kakvi se i se narichat exceptioni

na koi red i prochie
Титла: Re: Групиране на фигури
Публикувано от: JOKe в 11.12.2006, 14:51:30
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 :)
Титла: Re: Групиране на фигури
Публикувано от: Sayos в 11.12.2006, 14:58:27
smm, ето и моето предложение за ротация слагаш си пръста където искаш в/у екрана, след това казваш на някой да ти завърти монитора около пръста и ето ти ротация!
Титла: Re: Групиране на фигури
Публикувано от: smm в 11.12.2006, 15:19:36
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?
Титла: Re: Групиране на фигури
Публикувано от: Tosh в 11.12.2006, 15:32:18
Става дума за проекта по графика, който правя на Джава. Направих групиране на фигурите с масиви, обаче не знам как да направя да се въртят около общ център. Пробвах с намиране на макс. и мин. X и  Y, но когато се опитам да групирам още фигури, ми дава грешка. А има ли в Джава някаква фигура(или нещо подобно), в която да вкарам групата и така да намеря центъра на ротация на всичките, както и ограждащия им правоъгъглник?

Най-"хубавият" център, който се смята автоматично за една фигура ( група = множество фигури ), е средноаритметичните координати на всички върхове.

Ако смяташ центъра като средно на мин и макс координати, фигурите ще се измятат по различен начин на всяко ново завъртане.
Титла: Re: Групиране на фигури
Публикувано от: JOKe в 11.12.2006, 19:55:20
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
Титла: Re: Компютърна графика
Публикувано от: smm в 11.12.2006, 20:29:56
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...
Титла: Re: Компютърна графика
Публикувано от: artanis в 11.12.2006, 22:44:26
За първия пост с код:

Аз не мога да разбера две неща:

1. Защо точките са ти от тип double?
2. Защо обхождаш списък с рекурсивно извикване (в края на функцията)?

Сега предложението ми. Защо не си направиш обект група от фигури, който да съдържа списъка, също да има полета център и нещо като rotationАngle.

поздрави:
а.
Титла: Re: Компютърна графика
Публикувано от: Stilgar в 12.12.2006, 00:43:26
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
Титла: Re: Компютърна графика
Публикувано от: smm в 12.12.2006, 08:26:40
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.
Титла: Re: Компютърна графика
Публикувано от: smm в 12.12.2006, 09:30:47
Tova za inverseTransform ne shte da se polu4i. Nqkoy moje li da pokaje kakvo trqbva da se promeni vyv funkciqta selectObject?
Титла: Re: Компютърна графика
Публикувано от: Stilgar в 12.12.2006, 11:43:54
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?
Титла: Re: Компютърна графика
Публикувано от: smm в 12.12.2006, 14:23:35
Qsno. A za inverseTransform nqkoy moje li da pomogne? Pri men neshto ne se poluchava.
Титла: Re: Компютърна графика
Публикувано от: artanis в 12.12.2006, 14:58:43
smm,

Никой не може да ти помогне, освен ако не кажеш какво точно не ти се получава и от коя библиотека е функцията inverseTransform (ако е от някаква стандартна библиотека). Дори не си казал дали използваш OpenGL (би трябвало това да използваш), коя версия и т.н. Тези, които пишат във форума не са гадатели.

а.
Титла: Re: Компютърна графика
Публикувано от: smm в 12.12.2006, 15:49:59
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.
Титла: Re: Компютърна графика
Публикувано от: artanis в 13.12.2006, 22:30:37
Здрасти,

Не съм запознат с тази библиотека. Може старите координати да ги пазиш някъде и като избираш да се рисуват те. Опитай се да дебъгнеш.

поздрави:
а.
Титла: Re: Компютърна графика
Публикувано от: smm в 14.12.2006, 07:25:21
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.  :-(
Титла: Re: Компютърна графика
Публикувано от: smm в 14.12.2006, 07:26:50
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.
Титла: Re: Компютърна графика
Публикувано от: smm в 14.12.2006, 09:32:31
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.
Титла: Re: Компютърна графика
Публикувано от: artanis в 14.12.2006, 19:35:28
Поздравления!

Когато аз си правих проекта ползвах GL4Javа. Това не е стандартна библиотека, но може да се дръпне от сайта на проекта.

Успех на изпита!

а.
Титла: Re: Компютърна графика
Публикувано от: smm в 15.12.2006, 16:42:36
Blagodarq na vsi4ki, koito mi pomognaha! :bravo:
Титла: Re: Компютърна графика
Публикувано от: snej в 26.12.2006, 15:08:02
 :cry:  Така като гледам скоро няма да си взема изпита по КГ .....  :cry:  Нищо не разбирам за жалост  .....  Някой може ли да ми каже какви са изискванията на А.Пенев относно проекта, че не съм слушала внимателно пак  :-)
Титла: Re: Компютърна графика
Публикувано от: JOKe в 26.12.2006, 20:10:42
мисля че ги има в помагалото :+)
а иначе карам на спомен все пак
трябва да може да се рисуват 3 фигури
едната от тях задължително трябва да е елипса.
трябва да могат да си сменят цветовете поне по 3 начина
трябва да могат да се групират поне по 3 начина
трябва да могат да се избират , да се ротират , местят и разтягат.
групирането трябва да е иерархично т.е. група в група и като ънгрупираш трябва да е както трябва нали да се разпадат на съставните си части.
трябва да могат да се записва цялото нещо в файл което си нарисувал/ла и да се запазват там цветове разтягания както и групите.
друго нензам кво имаше .. :)
Титла: Re: Компютърна графика
Публикувано от: Ivelinka в 26.12.2006, 23:29:30
Ето това съм записала на упражненията http://store4.data.bg/ivelinag/grafika/ .
Дано да успееш да разбереш какво съм писала, че пиша грозно и може да имам правописни грешки  :-D

// сега видях, че нещо не се отварят. ама дата.бг какво искаш, до утре може и да се оправи
Титла: Re: Компютърна графика
Публикувано от: snej в 28.12.2006, 17:19:52
 :-) Мерси за информацията .... Ами да ви питам още нещо, някой сдобил ли се е с упражненията, които са към ръководството, че страницата която е посочена в рък. не се отваря. А не съм ходила към университета да ги искам от А.Пенев. Мерси още веднъж .   :-)