Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich benötige in einem Spiel, das ich entwickle, für die Rotation von Polygonen zur Kollisionsabfrage recht viel eine Rotationsmethode.
Java:
/**
* Rotiert den Punkt r um angle Grad um den Punkt. r nimmt den neuen Wert an
* @param r Pnkt der Gedregt wird
* @param u Punkt um den Gedreht wird
* @param angle Gradwert der Drehung
*/
public static void rotatePoint(Point2D r, Point2D u, float angle) {
double tmpx;
double tmpy;
double tmp = Math.toRadians(angle);
double cosAng = Math.cos(tmp);
double sinAng = Math.sin(tmp);
//Ursprung auf u schieben
tmp = tmpx = r.getX() - u.getX();
tmpy = r.getY() - u.getY();
//Um Ursprung drehen
tmpx = tmpx*cosAng-tmpy*sinAng; //http://de.wikipedia.org/wiki/Drehmatrix
tmpy = tmpy*cosAng+tmp*sinAng;
//Ursprung zurückschieben
tmpx += u.getX();
tmpy += u.getY();
r.setLocation(tmpx, tmpy);
}
Gibt es da offensichtlichkeiten durch die ich das ganze beschleunigen kann ??
Es läuft zwar auch so, aber nunja... es interessiert mich, ob das noch besser geht^^
Oder gibt es zur Rotation von Polygonen eventuell noch Tricks ? Ich mach das derzeit einfach Punkt für Punkt.
Hmnaja... verwende eine dreidimensionale Rotationsmatrix mit homogenen Koordinaten.
:shock:
(Bullshit labern ist schon was feines )
Aber im ernst: Wenn du das so für alle Punkte aufrufst, wird da für jeden Punkt neu der Sinus und Cosinus ausgerechnet, obwohl ja alle Punkte um den gleichen Punkt gedreht werden, und die Sinüsse und Consinüsse für alle gleich sind.
Ein Ansatz wäre AffineTransform (Java Platform SE 6) : Damit kann man eine Matrix erstellen, die diese Operation (also verschieben, rotieren und zurückverschieben) beschreibt.
Diese Matrix wird EINmal ausgrechnet und aufgestellt, und dann werden der Reihe nach alle Punkte durch die gleiche Matrix genudelt... (und deswegen kann man bei Quake ruckelfrei durch eine virtuelle Welt laufen ... dort allerdings mit 4x4-Matrizen )
Eventuell ist es schneller, die Werte für sin und cos von 0° bis 360° mit einer gewissen Schrittweite in eine Tabelle zu packen und die Werte dazwischen linear zu interpolieren. Die Umwandlung in Radiant kannst du dir dann auch sparen. Ob das wirklich etwas bringt, musst du aber nachmessen, sicher ist das nicht.
Die Sache mit der AffineTransform klingt sehr gut, werd ich mal ausprobieren.
Ich würde also einen AffineTransfrom erstellen, den rotieren und dann mit transform die Punkte rotieren.
Ob sich dann die Tabelle noch lohnt... ich werds mal schauen, sin und cos braucht man ja doch recht häufig da könnte es sich lohnen. Eventuell.
Ein direktes Lookup in einer Tabelle könnte schneller sein, aber wenn man zusätlich noch interpolieren muss, wird es mit ziemlicher Sicherheit langsamer als die (native) Math.sin. Wenn Math.sin nicht im Endeffekt in Hardware läuft, haben sich die Leute, die die geschrieben haben, da nämlich bestimmt auch ihre Gedanken gemacht