2017-11-18 3 views
1

Ich bin in diesem course eingeschrieben und sie haben diese Funktion von ihrem Code example und ich verstehe nicht, wie diese besondere funktioniert.JavaScript - Ich verstehe nicht, wie diese Kollisionserkennung Funktion funktioniert

function circRectsOverlap(x0, y0, w0, h0, cx, cy, r) { 
    var testX=cx; 
    var testY=cy; 
    if (testX < x0) testX=x0; 
    if (testX > (x0+w0)) testX=(x0+w0); 
    if (testY < y0) testY=y0; 
    if (testY > (y0+h0)) testY=(y0+h0); 
    return (((cx-testX)*(cx-testX)+(cy-testY)*(cy-testY))< r*r); 
} 

Die ersten vier Argumente sind die x- und y-Position, Breite und Höhe des Rechtecks, während die letzten drei die X- und Y-Position und der Radius des Kreises, in der Leinwand sind.

Wenn sich das Rechteck und der Kreis berühren, gibt die Funktion true zurück, daher kommt es zu einer Kollision.

Antwort

3

Es scheint, dass testX und testY die Koordinaten des nächstgelegenen Punktes zum Mittelpunkt des vom Rechteck eingeschlossenen Kreises werden. Die vier if-Tests "klemmen" diese Werte an den Kanten des Rechtecks, sollte der Mittelpunkt des Kreises in jeder Dimension außerhalb davon liegen. Es kann hilfreich sein, den Fall zu betrachten, in dem der Kreis innerhalb des Rechtecks ​​zentriert ist - alle ifs sind falsch und testX und testY sind die Koordinaten des Mittelpunkts des Kreises. Der Test in der return-Anweisung verwendet den Satz des Pythagoras, um zu bestimmen, ob der Testpunkt innerhalb des Radius des Kreises liegt.

+1

Ich verstehe etwas, aber nicht vollständig. Warum überprüft es, ob die Hypotenuse kleiner ist als r * r? –

+0

Wenn der nächstgelegene Punkt des Rechtecks ​​näher am Mittelpunkt des Kreises liegt als sein Radius, überlappen sie sich irgendwo. Der Abstand zwischen dem nächsten Punkt auf dem Rechteck und dem Mittelpunkt des Kreises beträgt (cx-testX) * (cx-testX) + (cy-testY) * (cy-testY), das Radius-Quadrat ist r * r . Der Autor war wahrscheinlich einfacher zu schreiben als die JavaScript-Funktion Math.sqrt() auf der linken Seite zu verwenden und sie kleiner als r zu machen (was völlig äquivalent ist). –

Verwandte Themen