Wenn Sie einen Kreis mit Mittelpunkt (center_x, center_y)
und Radius haben radius
, wie testen Sie, ob sich ein bestimmter Punkt mit Koordinaten (x, y)
innerhalb des Kreises befindet?
309
Wenn Sie einen Kreis mit Mittelpunkt (center_x, center_y)
und Radius haben radius
, wie testen Sie, ob sich ein bestimmter Punkt mit Koordinaten (x, y)
innerhalb des Kreises befindet?
Antworten:
Im Allgemeinen
x
undy
muss befriedigen(x - center_x)^2 + (y - center_y)^2 < radius^2
.Bitte beachten Sie, dass Punkte, die die obige Gleichung mit
<
ersetzt durch erfüllen,==
als Punkte auf dem Kreis betrachtet werden und die Punkte, die die obige Gleichung mit<
ersetzt durch erfüllen,>
als außerhalb des Kreises betrachtet werden.quelle
<=
Punkte innerhalb des Kreises oder an seiner Kante gefunden werden.Mathematisch gesehen ist Pythagoras wahrscheinlich eine einfache Methode, wie viele bereits erwähnt haben.
Computergestützt gibt es schnellere Wege. Definieren:
Wenn ein Punkt eher außerhalb dieses Kreises liegt, stellen Sie sich ein Quadrat vor, das so um ihn herum gezeichnet ist, dass seine Seiten Tangenten an diesen Kreis sind:
Stellen Sie sich nun einen quadratischen Diamanten vor, der innerhalb dieses Kreises so gezeichnet ist, dass seine Eckpunkte diesen Kreis berühren:
Jetzt haben wir den größten Teil unseres Raums abgedeckt und nur ein kleiner Bereich dieses Kreises bleibt zwischen unserem Quadrat und dem zu testenden Diamanten. Hier kehren wir wie oben zu Pythagoras zurück.
Wenn es wahrscheinlicher ist, dass sich ein Punkt innerhalb dieses Kreises befindet, kehren Sie die Reihenfolge der ersten drei Schritte um:
Alternative Methoden stellen sich ein Quadrat innerhalb dieses Kreises anstelle eines Diamanten vor, dies erfordert jedoch etwas mehr Tests und Berechnungen ohne Rechenvorteil (inneres Quadrat und Diamanten haben identische Flächen):
Aktualisieren:
Für Leistungsinteressierte habe ich diese Methode in c implementiert und mit -O3 kompiliert.
Ich habe Ausführungszeiten von erhalten
time ./a.out
Ich habe diese Methode implementiert, eine normale Methode und eine Dummy-Methode, um den Timing-Overhead zu bestimmen.
Normal: 21.3s This: 19.1s Overhead: 16.5s
Es scheint also, dass diese Methode in dieser Implementierung effizienter ist.
quelle
inCircleN
Sie unnötiges ABS. Wahrscheinlich ohne ABS Unterschied zwischeninCircle
undinCircleN
wäre kleiner.Mit Pythagoras können Sie den Abstand zwischen Ihrem Punkt und dem Zentrum messen und feststellen, ob er unter dem Radius liegt:
EDIT (Hutspitze zu Paul)
In der Praxis ist das Quadrieren oft viel billiger als die Quadratwurzel und da wir nur an einer Bestellung interessiert sind, können wir natürlich auf die Quadratwurzel verzichten:
Außerdem bemerkte Jason, dass
<=
dies durch ersetzt werden sollte<
und dies je nach Verwendung tatsächlich sinnvoll sein kannobwohl ich glaube, dass es nicht im streng mathematischen Sinne wahr ist. Ich stehe korrigiert.quelle
**
oder^
. Der schnellste Weg, dies zu tun, wenn Sie nur x ^ 2 oder x ^ 3 benötigen, besteht darin, es "manuell" zu tun :x*x
.Dies ist effizienter und lesbarer. Es vermeidet die kostspielige Quadratwurzeloperation. Ich habe auch eine Überprüfung hinzugefügt, um festzustellen, ob der Punkt innerhalb des Begrenzungsrechtecks des Kreises liegt.
Die Rechteckprüfung ist nur mit vielen Punkten oder vielen Kreisen erforderlich. Wenn sich die meisten Punkte innerhalb von Kreisen befinden, verlangsamt die Prüfung des Begrenzungsrechtecks die Dinge tatsächlich!
Berücksichtigen Sie wie immer Ihren Anwendungsfall.
quelle
Berechnen Sie die Entfernung
das ist in C # ... konvertieren für die Verwendung in Python ...
quelle
Sie sollten prüfen, ob der Abstand vom Mittelpunkt des Kreises zum Punkt kleiner als der Radius ist, d. H.
quelle
Wie oben erwähnt - verwenden Sie den euklidischen Abstand.
quelle
Finden Sie den Abstand zwischen dem Mittelpunkt des Kreises und den angegebenen Punkten. Wenn der Abstand zwischen ihnen kleiner als der Radius ist, befindet sich der Punkt innerhalb des Kreises. Wenn der Abstand zwischen ihnen gleich dem Radius des Kreises ist, liegt der Punkt auf dem Umfang des Kreises. Wenn der Abstand größer als der Radius ist, liegt der Punkt außerhalb des Kreises.
quelle
Die folgende Gleichung ist ein Ausdruck, der prüft, ob sich ein Punkt innerhalb eines gegebenen Kreises befindet, wobei xP & yP die Koordinaten des Punktes sind, xC & yC die Koordinaten des Mittelpunkts des Kreises sind und R der Radius dieses gegebenen Kreises ist.
Wenn der obige Ausdruck wahr ist, liegt der Punkt innerhalb des Kreises.
Unten finden Sie eine Beispielimplementierung in C #:
quelle
Dies ist die gleiche Lösung wie von Jason Punyon erwähnt , enthält jedoch ein Pseudocode-Beispiel und einige weitere Details. Ich sah seine Antwort, nachdem ich dies geschrieben hatte, aber ich wollte meine nicht entfernen.
Ich denke, der am einfachsten verständliche Weg ist, zuerst den Abstand zwischen dem Mittelpunkt des Kreises und dem Punkt zu berechnen. Ich würde diese Formel verwenden:
Vergleichen Sie dann einfach das Ergebnis dieser Formel, den Abstand (
d
), mit demradius
. Wenn der Abstand (d
) kleiner oder gleich dem Radius (r
) ist, befindet sich der Punkt innerhalb des Kreises (am Rand des Kreises, wennd
undr
gleich sind).Hier ist ein Pseudocode-Beispiel, das leicht in jede Programmiersprache konvertiert werden kann:
Wo
circle_x
undcircle_y
ist die Mittelpunktskoordinate des Kreises,r
ist der Radius des Kreises undx
undy
ist die Koordinaten des Punktes.quelle
Meine Antwort in C # als vollständige Lösung zum Ausschneiden und Einfügen (nicht optimiert):
Verwendungszweck:
quelle
Wie bereits erwähnt, können wir Folgendes verwenden, um zu zeigen, ob sich der Punkt im Kreis befindet
Um es grafisch darzustellen, können wir verwenden:
quelle
Ich habe den folgenden Code für Anfänger wie mich verwendet :).
öffentliche Klasse incirkel {
quelle
Wenn Sie in die Welt des 3D einsteigen und überprüfen möchten, ob sich ein 3D-Punkt in einer Einheitskugel befindet, tun Sie am Ende etwas Ähnliches. Für die Arbeit in 2D müssen lediglich 2D-Vektoroperationen verwendet werden.
quelle
Ich weiß, dass dies einige Jahre nach der am besten bewerteten Antwort ist, aber ich habe es geschafft, die Berechnungszeit um 4 zu verkürzen.
Sie müssen nur die Pixel aus 1/4 des Kreises berechnen und dann mit 4 multiplizieren.
Dies ist die Lösung, die ich erreicht habe:
quelle
Hier ist der einfache Java-Code zur Lösung dieses Problems:
und die Mathematik dahinter: /math/198764/how-to-know-if-a-point-is-inside-a-circle
quelle
PHP
quelle