argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: Компютърна графика  (Прочетена 5051 пъти)

smm

  • Неактивен Неактивен
  • Публикации: 101
Компютърна графика
« -: 10.12.2006, 08:59:10 »

Става дума за проекта по графика, който правя на Джава. Направих групиране на фигурите с масиви, обаче не знам как да направя да се въртят около общ център. Пробвах с намиране на макс. и мин. X и  Y, но когато се опитам да групирам още фигури, ми дава грешка. А има ли в Джава някаква фигура(или нещо подобно), в която да вкарам групата и така да намеря центъра на ротация на всичките, както и ограждащия им правоъгъглник?
« Последна редакция: 11.12.2006, 20:25:47 от smm »
Активен

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
Re: Групиране на фигури
« Отговор #1 -: 10.12.2006, 12:34:50 »

Здравей smm,

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

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

поздрави:
Атанас Чанев
Активен

Stilgar

  • Неактивен Неактивен
  • Публикации: 843
Re: Групиране на фигури
« Отговор #2 -: 11.12.2006, 03:11:49 »

nie da ne sme iasnovidci che da ti znaem koda i da razberem shto ti dava greshka
Активен
"Човек винаги трябва да си прави background" - Lia

smm

  • Неактивен Неактивен
  • Публикации: 101
Re: Групиране на фигури
« Отговор #3 -: 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?
Активен

smm

  • Неактивен Неактивен
  • Публикации: 101
Re: Групиране на фигури
« Отговор #4 -: 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);
      }
    }
  }
Активен

Stilgar

  • Неактивен Неактивен
  • Публикации: 843
Re: Групиране на фигури
« Отговор #5 -: 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
Активен
"Човек винаги трябва да си прави background" - Lia

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
Re: Групиране на фигури
« Отговор #6 -: 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 :)
Активен

Sayos

  • Неактивен Неактивен
  • Публикации: 1366
  • The Dark side
Re: Групиране на фигури
« Отговор #7 -: 11.12.2006, 14:58:27 »

smm, ето и моето предложение за ротация слагаш си пръста където искаш в/у екрана, след това казваш на някой да ти завърти монитора около пръста и ето ти ротация!
Активен

smm

  • Неактивен Неактивен
  • Публикации: 101
Re: Групиране на фигури
« Отговор #8 -: 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?
Активен

Tosh

  • Неактивен Неактивен
  • Публикации: 249
  • Filmmaker
    • Изследванията на Тодор Арнаудов
Re: Групиране на фигури
« Отговор #9 -: 11.12.2006, 15:32:18 »

Става дума за проекта по графика, който правя на Джава. Направих групиране на фигурите с масиви, обаче не знам как да направя да се въртят около общ център. Пробвах с намиране на макс. и мин. X и  Y, но когато се опитам да групирам още фигури, ми дава грешка. А има ли в Джава някаква фигура(или нещо подобно), в която да вкарам групата и така да намеря центъра на ротация на всичките, както и ограждащия им правоъгъглник?

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

Ако смяташ центъра като средно на мин и макс координати, фигурите ще се измятат по различен начин на всяко ново завъртане.
Активен
Творчество и изследвания:
http://twenkid.com
http://artificial-mind.blogspot.com

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die
Re: Групиране на фигури
« Отговор #10 -: 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
« Последна редакция: 11.12.2006, 19:56:58 от JOKe »
Активен

smm

  • Неактивен Неактивен
  • Публикации: 101
Re: Компютърна графика
« Отговор #11 -: 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...
Активен

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
Re: Компютърна графика
« Отговор #12 -: 11.12.2006, 22:44:26 »

За първия пост с код:

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

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

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

поздрави:
а.
Активен

Stilgar

  • Неактивен Неактивен
  • Публикации: 843
Re: Компютърна графика
« Отговор #13 -: 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
Активен
"Човек винаги трябва да си прави background" - Lia

smm

  • Неактивен Неактивен
  • Публикации: 101
Re: Компютърна графика
« Отговор #14 -: 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.
Активен

smm

  • Неактивен Неактивен
  • Публикации: 101
Re: Компютърна графика
« Отговор #15 -: 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?
« Последна редакция: 12.12.2006, 11:44:38 от smm »
Активен

Stilgar

  • Неактивен Неактивен
  • Публикации: 843
Re: Компютърна графика
« Отговор #16 -: 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?
Активен
"Човек винаги трябва да си прави background" - Lia

smm

  • Неактивен Неактивен
  • Публикации: 101
Re: Компютърна графика
« Отговор #17 -: 12.12.2006, 14:23:35 »

Qsno. A za inverseTransform nqkoy moje li da pomogne? Pri men neshto ne se poluchava.
Активен

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis
Re: Компютърна графика
« Отговор #18 -: 12.12.2006, 14:58:43 »

smm,

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

а.
Активен

smm

  • Неактивен Неактивен
  • Публикации: 101
Re: Компютърна графика
« Отговор #19 -: 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.
Активен