Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Jefo
Založen: 02. 07. 2011 Příspěvky: 58
|
Zaslal: 22. září 2015, 17:29:22 Předmět: Algorimus na zmenu šírky kresby |
|
|
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 |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 24. září 2015, 12:34:09 Předmět: Re: Algorimus na zmenu šírky kresby |
|
|
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 |
|
Návrat nahoru |
|
|
Jefo
Založen: 02. 07. 2011 Příspěvky: 58
|
Zaslal: 24. září 2015, 19:38:00 Předmět: |
|
|
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 |
|
|
|
|
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