Schnell Kreis Kollisionserkennung
Ich versuche zu schreiben, eine Methode, die berechnet, ob sich zwei Kreise überschneiden. Ich habe kommen mit dem folgenden, und ich bin nur neugierig zu wissen, ob es trotzdem, könnte es sein, weiter optimieren.
private static boolean isCollision(Point2D p1, float r1, Point2D p2, float r2)
{
float a,dx, dy;
a = (r1+r2) * (r1+r2);
dx = (float) (p1.getX() - p2.getX());
dy = (float) (p1.getY() - p2.getY());
if (a > (dx*dx) + (dy*dy))
{
return true;
}
return false;
}
InformationsquelleAutor der Frage Oli | 2009-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hmm. Das sieht ziemlich gut so weit wie die Mathematik geht. Einige kleinere Punkte auf, wie man die Java-Seite schneller und terser:
if (foo) { return true; } else { return false; }?
Nur tunreturn foo;
!Einer verbesserten version, dann:
(Beachten Sie, wenn Ihr code ist ganz float-Basis, Sie können das gleiche tun mit
Point2D.Float
undfloat
s).InformationsquelleAutor der Antwort Zarkonnen
Überlappen oder schneiden?
Wenn schneiden, vergessen Sie nicht über den Fall, wo die Kreise sich nicht überschneiden, weil Sie in jedem anderen.
Wenn es überschneidungen, die ich nicht wirklich sehen, wie Sie konnte, optimieren Sie weiter; Sie sind zu vergleichen die Punkt-Abstände, die der Summe der Radien, mit Abstand quadriert, um zu vermeiden, eine Quadratwurzel. Scheint nicht, wie es keine Fetten Links zu trimmen.
InformationsquelleAutor der Antwort Jason S
Tun, die Sie wirklich brauchen, um gerecht für alle möglichen Point2D Umsetzung? Wenn Sie nicht haben, wird es sparen Sie ein virtuelles call:
Wenn Sie können, das eine oder andere entscheiden, anstatt catering für beide.
Das problem mit perf Fragen ist, dass Sie wirklich tun müssen, Messen die Wirkungen, von denen mal jemand gepostet hat, die gleiche Antwort, wie nicht unterstützte Meinung.
InformationsquelleAutor der Antwort Pete Kirkham
Ich weiß nicht ob das relevant ist in Ihrem Fall, aber wenn Sie überprüfen möchten, um überlappungen zwischen Ihrem Kreis und viele andere Kreisen (sagen wir mal Tausende von Kreisen), Sie können versuchen, Sie zu organisieren Sie Ihre Kreise im quad-trees (siehe http://en.wikipedia.org/wiki/Quadtree) und eine Baum-look-up (basierend auf dem Begrenzungsrechteck Ihre Kreis) im quad-Baum.
InformationsquelleAutor der Antwort Patrick
Ihren Algorithmus kann weiter optimiert werden durch die Berechnung der rechteckigen Grenzen der einzelnen Kreis und sehen, wenn Sie sich überschneiden. Wenn Sie nicht überlappen, dann nur false zurück. Dies vermeidet Multiplikation für diejenigen Kreise, die die rechteckigen Grenzen nicht überlappen (dh, Sie sind nicht nahe beieinander). Addition/Subtraktion für die rechteckige gebunden Berechnung günstiger ist als die Multiplikation.
Dies ist das Muster, das Java-2D verwendet. Sehen Form.getBounds()
InformationsquelleAutor der Antwort Steve Kuo
Es nicht machen Ihren code schneller, aber ich würde bevorzugen:
InformationsquelleAutor der Antwort Xn0vv3r