Obracanie figur w okol wlasnej osi

0

Problem jest wrecz trywialny
korzystajac ze wzorow na przeksztalcanie geometryczne wiadomo ze
x' = x * cos(a) - y* sin(a)
y' = x * sin(a) + y* cos(a)

wszystkie przeksztalcebnia umieszczam ladnie w petli

for (int i=0;i<4;i++)
{
//extract point
 x = points[i][0]-points[4][0];
 y = points[i][1]-points[4][1];
//rotate
x = (int) Math.round(x*cos-y*sin);
y = (int) Math.round(y*cos+x*sin);
//set up new point
points[i][0] = points[4][0]+x;
points[i][1] = points[4][1]+y;
}
 

mam 5 punktow zapisanych w macierzy pierwsze 4 to wierzcholki prostokata a ostatni to srodek w okol ktorego go obracam
kod w teorii dziala, w praktyce jednak pojawia sie problem, obracana figura maleje i po kilku pelnych obrotach znika
jak temu zapobiec

0
  1. Poniższy kod jest błędny:
x = (int) Math.round(x*cos-y*sin);
y = (int) Math.round(y*cos+x*sin);

W drugim wzorze używasz nowej wartości x, a powinieneś użyć starej.

int pom = x;
x = (int) Math.round(x*cos-y*sin);
y = (int) Math.round(y*cos+pom*sin);

  1. Żeby zmniejszyć błędy zaokrągleń lepiej by zmienne x,y były typu double. Rzutowanie na typ int rób podczas rysowania.
double pom = x;
x = Math.round(x*cos-y*sin);
y = Math.round(y*cos+pom*sin);
g.drawLine((int).....);
0

dzieki, dziala
aczkolwiek zrobilem to korzystajac z funkcji AffineTransform.getRotateInstance()

ale
w onu przypadkach mam podobny efekt, z prostokata otrzymuje jakas figure trapezoidalna
masz jakis pomysl jak na to zaradzic?

0

Przyjrzałem się dokładniej Twoim wzorom. Miały błędy nie tylko programistyczne, również matematyczne.

        double cos=Math.cos(angle);
        double sin=Math.sin(angle);
        double temp=x;
        x=x*cos-y*sin;
        y=temp*sin+y*cos;
0

Ja bym jeszcze dodał do poprzedniej odpowiedzi - aby wyrobić sobie nawyk poprawnego nazywania zmiennych, które zmieniają się w czasie. Nawet jeżeli zmienne muszą się głupio nazywać, to i tak jest to lepsze niż nazywanie czegoś czym nie jest. To całkowicie i u źródła zlikwiduje możliwość pojawiania się takich paskudnych bugów. Na przykład bazując na poprzednim kodzie:

//loop
final double oldX = x;
final double oldY = y;
double cos=Math.cos(angle);
double sin=Math.sin(angle);
//...
//... Tu może być nawet cała kupa zagmatwanego kodu. Ale pomyłki z użyciem x i y nie wpłyną na wynik obliczeń.
//...
x = oldX * cos - oldY * sin;
y = oldX * sin + oldY * cos;

1 użytkowników online, w tym zalogowanych: 0, gości: 1