.[ ČeskéHry.cz ].
Algorimus na zmenu šírky kresby

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Jefo



Založen: 02. 07. 2011
Příspěvky: 58

PříspěvekZaslal: 22. září 2015, 17:29:22    Předmět: Algorimus na zmenu šírky kresby Odpovědět s citátem

Ahoj,
doposial pracujem na svojom grafickom editore. Potreboval by som zmeniť šírku vybranej kresby ktorá sa skladá z čiar, elíps, alebo obdlžnikov. Pri volbe select a klikaní na objekty a držaní ctrl sa všetky graficke objekty pridaju do objektu shape a vyselektujú sa.
Vyzerá to takto:



Objektom sa dá meníť velkosť nasledovným algoritmom:
kód:

public void OnMouseDragged(int x, int y)
    {
        if(state == JResizeableState.Left_Res_Width)
        {
            for(int i = 0;i < myArray.size();i++)
            {
               
                JMyGraphicsObject gro = myArray.get(i);
               
                if(selRect != null)
                {
                      gro.setX0(gro.getX0() + x - (int)(selRect.getX()));
                      gro.setX1((int)(selRect.getX()-x) + gro.getX1());
                     
                      gro.Delete();
                      gro.Draw();
                }
            }
                OrderBounds();
               
               
        }
    }



Vyselektovaná oblasť sa dá zmenšovať a zväčšovať.Problém mám v tom že sa sidce objekty zmenšujú ale nemenia sa vzdialenosti medzi nimi. Môžte si to vyskúšať tu uloz.to. Program ktorý som tam zavesil má ešte chyby ktoré som neopravil a padá tak pozor pri selektovaní a zmenšovaní objektu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 608

PříspěvekZaslal: 24. září 2015, 12:34:09    Předmět: Re: Algorimus na zmenu šírky kresby Odpovědět s citátem

No ano, samozřejmě, protože ty jenom posouváš kraje objektu.

řekněme, že rectangle je definovaný koncovými body (x0y0 je min a x1y1 je max) (tj. původní výběr):
x0 y0 x1 y1

nový je definovaný (tj. aktuální modifikovaný)
x0' y0' x1' y1'

tzn. že libovolný bod (px, py) pak můžeš jednoduše tranformovat třeba takto:
(počítám, že pracuješ s celými čísly)

px' = x0' + (px - x0) * (x1' - x0') / (x1 - x0)
py' = y0' + (py - y0) * (y1' - y0') / (y1 - y0)

na to si uděláš fci a pak jednoduše transformuješ krajové body bounding rectanglů těch objektů.
(doufám, že tam nemám někde typo Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Jefo



Založen: 02. 07. 2011
Příspěvky: 58

PříspěvekZaslal: 24. září 2015, 19:38:00    Předmět: Odpovědět s citátem

Zapísal som to zatial takto:
kód:

public void OnMouseDraged(int x, int y)
    {
        if(state == JResizableState.Left_Res_Width)
        {
           
            for(int i = 0;i < myArray.size();i++)
            {
               
                JMyGraphicsObject gro = myArray.get(i);
               
                if(selRect != null)
                {
                      int pomX0 = x - (int)(selRect.getX());
                      int pomX1 = x - (int)(selRect.getX()+selRect.getWidth());
                     
                      int pomY0 =  (y - (int)(selRect.getY()));
                      int pomY1 = (y - (int)(selRect.getY()+ selRect.getHeight()));
                     
                        if(gro.getX0() < gro.getX1())
                        {
                           int px0 = pomX0 + (gro.getX0() - (int)selRect.getX()) * (pomX1 - pomX0) / (int)(selRect.getWidth());
                           int py0 = pomY0 + (gro.getY0() - (int)selRect.getY()) * (pomY1 - pomY0) / (int)(selRect.getHeight());
                           gro.setX0(px0);
                           gro.setY0(py0);
                        }
                       
                      gro.Delete();
                      gro.Draw();
                }
            }
         OrderBounds();
               
        }
    }

Treba pri transformacii x0 a y0 transformovať aj pozíciu x1 a y1 ako px1 a py1 ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna