it-swarm.com.de

Kombinierter Bereich überlappender Kreise

Ich bin kürzlich auf ein Problem gestoßen, bei dem ich vier Kreise (Mittelpunkte und Radius) hatte und die Fläche der Vereinigung dieser Kreise berechnen musste.

Beispielbild:

Für zwei Kreise ist es ziemlich einfach,

Ich kann einfach den Bruchteil der einzelnen Kreise berechnen, der sich nicht innerhalb der Dreiecke befindet, und dann die Fläche der Dreiecke berechnen.

Aber gibt es einen klugen Algorithmus, den ich verwenden kann, wenn mehr als zwei Kreise vorhanden sind?

106
Anton Hansson

Finden Sie alle Kreiskreuzungen am äußeren Umfang (z. B. B, D, F, H in der folgenden Abbildung). Verbinden Sie sie mit den Mittelpunkten der entsprechenden Kreise, um ein Polygon zu bilden. Die Fläche der Vereinigung der Kreise ist die Fläche des Polygons + die Fläche der Kreisscheiben, die durch aufeinanderfolgende Schnittpunkte definiert werden, und der Kreismittelpunkt dazwischen. Sie müssen auch alle Löcher berücksichtigen.

circle overlap

93
Ants Aasma

Ich bin mir sicher, dass es einen cleveren Algorithmus gibt, aber hier ist ein dummer Algorithmus, um nicht erst danach suchen zu müssen;

  • legen Sie einen Begrenzungsrahmen um die Kreise.
  • zufällige Punkte innerhalb des Begrenzungsrahmens erzeugen;
  • finden Sie heraus, ob sich der Zufallspunkt innerhalb eines Kreises befindet.
  • berechne den Bereich durch einfache Addition und Division (proportion_of_points_inside * area_of_bounding_box).

Sicher ist es dumm, aber:

  • sie können eine so genaue Antwort erhalten, wie Sie möchten, erzeugen Sie einfach mehr Punkte.
  • es funktioniert für alle Formen, für die Sie den Unterschied zwischen innen und außen berechnen können.
  • es wird schön parallelisieren, so dass Sie alle Ihre Kerne verwenden können.
31

Bei einer anderen Lösung als der vorherigen Lösung können Sie mithilfe eines Quadtrees eine Schätzung mit beliebiger Genauigkeit erstellen.

Dies funktioniert auch für jede Formvereinigung, wenn Sie erkennen können, ob ein Quadrat innerhalb oder außerhalb der Form liegt oder die Form schneidet. 

Jede Zelle hat einen der Zustände: leer, voll, teilweise

Der Algorithmus besteht darin, die Kreise im Quadtree mit einer niedrigen Auflösung "zu zeichnen" (z. B. 4 Zellen als leer markiert). Jede Zelle ist entweder:

  • in mindestens einem Kreis, dann markieren Sie die Zelle als voll,
  • außerhalb aller Kreise die Zelle als leer markieren,
  • sonst kennzeichnen Sie die Zelle als partiell.

Wenn dies abgeschlossen ist, können Sie eine Schätzung der Fläche berechnen: Die vollen Zellen geben die untere Grenze, die leeren Zellen die höhere Grenze, die Teilzellen geben den maximalen Flächenfehler an.

Wenn der Fehler für Sie zu groß ist, verfeinern Sie die Teilzellen, bis Sie die richtige Genauigkeit erhalten.

Ich denke, dass dies einfacher zu implementieren ist als die geometrische Methode, die eine Vielzahl von Sonderfällen erfordert.

16
fa.

Ants Aasmas Antwort gab die Grundidee, aber ich wollte es etwas konkreter machen. Schauen Sie sich die fünf Kreise unten an und wie sie zerlegt wurden.

Example

  • Die blauen Punkte sind Kreismittelpunkte.
  • Die roten Punkte sind Kreisgrenzpunkte.
  • Die roten Punkte mit weißem Innenraum sind Kreisgrenzpunkte, die nicht in anderen Kreisen enthalten sind .

Das Identifizieren dieser drei Arten von Punkten ist einfach. Konstruieren Sie nun eine Diagrammdatenstruktur, bei der die Knoten die blauen Punkte und die roten Punkte mit weißem Innenraum sind. Platzieren Sie für jeden Kreis einen Rand zwischen der Kreismitte (blauer Punkt) und jedem Schnittpunkt (rote Punkte mit weißem Inneren) an der Grenze.

Dadurch wird die Kreisvereinigung in einen Satz von Polygonen (blau schattiert) und kreisförmige Tortenstücke (grün schattiert) zerlegt, die paarweise voneinander getrennt sind und die ursprüngliche Vereinigung (dh eine Partition) abdecken. Da jedes Stück hier leicht berechnet werden kann, können Sie den Bereich der Vereinigung berechnen, indem Sie die Flächen des Stücks summieren.

15
Timothy Shields

Ich liebe die Annäherung an den Fall von zwei sich überschneidenden Kreisen - so würde ich eine leichte Variation derselben Herangehensweise für das komplexere Beispiel verwenden. 

Dies könnte einen besseren Einblick in die Verallgemeinerung des Algorithmus für eine größere Anzahl von halbüberlappenden Kreisen geben. 

Der Unterschied hier ist, dass ich zunächst mit der Verknüpfung der Zentren beginne (es gibt also einen Scheitelpunkt zwischen dem Mittelpunkt der Kreise und nicht zwischen den Stellen, an denen sich die Kreise schneiden).

(in der Praxis lohnt sich vielleicht die Monte-Carlo-Methode)

alt text http://secretGeek.net/image/triangles_1667310.png

12
Leon Bambrick

Wenn Sie eine diskrete (im Gegensatz zu einer kontinuierlichen Antwort) wünschen, können Sie etwas Ähnliches wie einen Pixel-Painting-Algorithmus tun.

Zeichnen Sie die Kreise auf ein Gitter und färben Sie dann jede Zelle des Gitters ein, wenn sie größtenteils in einem Kreis enthalten ist (d. H. Mindestens 50% ihrer Fläche liegt innerhalb eines Kreises). Tun Sie dies für das gesamte Raster (wo das Raster den gesamten Bereich abdeckt, der von den Kreisen abgedeckt wird), und zählen Sie dann die Anzahl der farbigen Zellen im Raster.

4
David R Tribble

Hmm, sehr interessantes Problem. Mein Ansatz wäre wahrscheinlich etwas in der Richtung der folgenden:

  • Erarbeiten Sie einen Weg, um herauszufinden, was die Kreuzungsbereiche zwischen einer beliebigen Anzahl von Kreisen sind, d. H. Wenn ich drei Kreise habe, muss ich in der Lage sein, herauszufinden, was der Schnittpunkt zwischen diesen Kreisen ist. Die "Monte-Carlo" -Methode wäre eine gute Annäherung ( http://local.wasp.uwa.edu.au/~pbourke/geometry/circlearea/ ).
  • Beseitigen Sie alle Kreise, die vollständig in einem anderen größeren Kreis enthalten sind (siehe Radius und Modul des Abstands zwischen der Mitte der beiden Kreise). Ich glaube nicht, dass dies zwingend ist.
  • Wählen Sie 2 Kreise (nennen Sie sie A und B) und berechnen Sie die Gesamtfläche anhand der folgenden Formel:

(Dies gilt für jede Form, sei es Kreis oder auf andere Weise)

area(A∪B) = area(A) + area(B) - area(A∩B)

Wobei A ∪ B eine Vereinigung B und A ∩ B bedeutet, dass A sich mit B überschneidet (Sie können dies vom ersten Schritt an berechnen.

  • Fügen Sie nun weitere Kreise hinzu und berechnen Sie den Bereich, der als Summe/Subtraktion von Kreisbereichen und Schnittpunkten zwischen Kreisen hinzugefügt wird. Für 3 Kreise (nennen Sie den zusätzlichen Kreis C) berechnen wir die Fläche mit der folgenden Formel:

(Dies ist dasselbe wie oben, wo A durch A∪B ersetzt wurde.)

area((A∪B)∪C) = area(A∪B) + area(C) - area((A∪B)∩C)

Wo area(A∪B) wir gerade gearbeitet haben und area((A∪B)∩C) gefunden werden kann:

area((A∪B)nC) = area((A∩C)∪(B∩C)) = area(A∩C) + area(A∩B) - area((A∩C)∩(B∩C)) = area(A∩C) + area(A∩B) - area(A∩B∩C)

Wo Sie wieder ein Gebiet (A∩B∩C) von oben finden können.

Das knifflige Bit ist der letzte Schritt - je mehr Kreise hinzugefügt werden, desto komplexer wird es. Ich glaube, dass es eine Erweiterung gibt, um den Bereich einer Kreuzung mit einer endlichen Union zu berechnen, oder alternativ können Sie ihn rekursiv ausarbeiten.

Auch in Bezug auf die Verwendung von Monte-Carlo zur Annäherung an das Iterationsgebiet glaube ich, dass es möglich ist, den Schnittpunkt einer beliebigen Anzahl von Kreisen auf den Schnittpunkt von 4 dieser Kreise zu reduzieren, was genau berechnet werden kann (keine Ahnung, wie dies zu tun ist jedoch).

Es gibt wahrscheinlich einen besseren Weg, dies zu tun - die Komplexität steigt signifikant (möglicherweise exponentiell, aber ich bin mir nicht sicher) für jeden zusätzlichen Kreis, der hinzugefügt wird.

3
Justin

Ich habe an einem Problem der Simulation von überlappenden Sternfeldern gearbeitet und versucht, die tatsächlichen Sternenzahlen aus den tatsächlichen Plattenbereichen in dichten Feldern zu schätzen, wo die größeren hellen Sterne schwächere maskieren können. Ich hatte auch gehofft, dies durch eine strenge formale Analyse tun zu können, konnte jedoch keinen Algorithmus für die Aufgabe finden. Ich löste es, indem ich die Sternfelder auf blauem Hintergrund als grüne Scheiben erzeugte, deren Durchmesser durch einen Wahrscheinlichkeitsalgorithmus bestimmt wurde. Eine einfache Routine kann sie koppeln, um zu sehen, ob es eine Überlappung gibt (das Sternpaar wird gelb). Eine Pixelanzahl der Farben erzeugt dann die beobachtete Fläche, die mit der theoretischen Fläche verglichen werden soll. Dies erzeugt dann eine Wahrscheinlichkeitskurve für die wahren Zählwerte. Brute Force vielleicht, aber es scheint zu funktionieren.
http://www.2from.com/images/simulated_star_field.gif

3
user213660

Es gibt effiziente Lösungen für dieses Problem mit sogenannten Leistungsdiagrammen. Dies ist jedoch eine sehr schwere Mathematik und nicht etwas, das ich ohne weiteres anpacken möchte. Um eine "einfache" Lösung zu finden, suchen Sie nach Line-Sweep-Algorithmen. Das Grundprinzip besteht darin, dass Sie die Figur in Streifen aufteilen, wobei die Berechnung der Fläche in jedem Streifen relativ einfach ist.

Zeichnen Sie also in der Figur, die alle Kreise ohne abgeriebene Kreise enthält, an jeder Position eine horizontale Linie, die entweder die Oberseite eines Kreises, die Unterseite eines Kreises oder der Schnittpunkt von zwei Kreisen ist. Beachten Sie, dass innerhalb dieser Streifen alle Bereiche, die Sie berechnen müssen, gleich aussehen: ein "Trapez", bei dem zwei Seiten durch Kreissegmente ersetzt werden. Wenn Sie also herausfinden können, wie Sie eine solche Form berechnen, tun Sie dies einfach für alle einzelnen Formen und fügen Sie diese zusammen. Die Komplexität dieses naiven Ansatzes ist O (N ^ 3), wobei N die Anzahl der Kreise in der Figur ist. Mit etwas geschickten Datenstruktur könnten Sie diese Line-Sweep-Methode auf O (N ^ 2 * log (N)) verbessern. Wenn Sie dies jedoch nicht wirklich tun müssen, lohnt sich die Mühe wahrscheinlich nicht.

2
Steve Thomas

Ich fand diesen Link, der nützlich sein kann. Es scheint jedoch keine endgültige Antwort zu geben . Google answers . Eine andere Referenz für drei Kreise ist Harukis Theorem . Dort gibt es auch eine Zeitung.

1
Greg Reynolds

Hier ist ein Algorithmus, der in der Praxis einfach zu implementieren sein sollte und angepasst werden könnte, um einen beliebig kleinen Fehler zu erzeugen:

  1. Annähern Sie jeden Kreis durch ein reguläres Polygon, das an demselben Punkt zentriert ist
  2. Berechnen Sie das Polygon, das die Vereinigung der angenäherten Kreise darstellt
  3. Berechnen Sie die Fläche des zusammengeführten Polygons

Die Schritte 2 und 3 können mit Standardalgorithmen aus der Computergeometrie durchgeführt werden, die leicht zu finden sind.

Je mehr Seiten Sie für jedes angenäherte Polygon verwenden, desto genauer ist Ihre Antwort. Sie können sich mit eingeschriebenen und umschriebenen Polygonen annähern, um eine genaue Antwort zu erhalten.

1
PeterAllenWebb

Je nachdem, welches Problem Sie lösen möchten, reicht es möglicherweise aus, um eine obere und eine untere Schranke zu erhalten. Eine obere Grenze ist einfach, nur die Summe aller Kreise. Für eine untere Grenze können Sie einen einzelnen Radius auswählen, sodass sich keiner der Kreise überlappt. Um dies zu verbessern, finden Sie für jeden Kreis den größten Radius (bis zum tatsächlichen Radius), damit er sich nicht überlappt. Es sollte auch ziemlich trivial sein, alle vollständig überlappenden Kreise zu entfernen (Alle diese Kreise erfüllen | P_a - P_b | <= r_a), wobei P_a der Mittelpunkt des Kreises A ist, P_b der Mittelpunkt des Kreises B ist und r_a der Radius von A ist ) und dies übertrifft sowohl die Ober- als auch die Untergrenze. Sie könnten auch eine bessere Obergrenze erhalten, wenn Sie Ihre Paarformel für beliebige Paare verwenden und nicht nur die Summe aller Kreise. Es gibt möglicherweise eine gute Möglichkeit, die "besten" Paare auszuwählen (die Paare, die zu einer minimalen Gesamtfläche führen).

Mit einer oberen und einer unteren Grenze können Sie vielleicht einen Monte-carlo-Ansatz besser abstimmen, aber es fällt Ihnen nichts Konkretes ein. Eine weitere Option (wiederum abhängig von Ihrer Anwendung) besteht darin, die Kreise zu rastern und Pixel zu zählen. Es ist im Grunde der Monte-Carlo-Ansatz mit fester Verteilung.

1
fryguybob

Dies kann mit Green's Theorem gelöst werden, mit einer Komplexität von n ^ 2log (n) . Wenn Sie mit dem Green's Theorem nicht vertraut sind und mehr darüber wissen möchten, finden Sie hier die Video und Notizen von der Khan Academy. Aber für unser Problem halte ich meine Beschreibung für ausreichend.

Entschuldigung für die Links zu den Fotos, da ich keine Bilder veröffentlichen kann. (Nicht genügend Reputationspunkte)

Allgemeine Gleichung des Satzes von Green

Wenn ich L und M so setze

Bedingung

dann ist die RHS einfach der Bereich der Region R und kann durch Lösen des geschlossenen Integrals oder der LHS erhalten werden, und genau dies werden wir tun.

Alle Gewerkschaften können in solche disjunkte Kreise unterteilt werden, die sich schneiden

Die Integration entlang des Pfades im Gegenuhrzeigersinn ergibt also die Area der Region und die Integration entlang des Uhrzeigersinns ergibt ein Negativ der Area. So

AreaOfUnion = (Integration entlang roter Bögen im Gegenuhrzeigersinn + Integration entlang blauer Bögen im Uhrzeigersinn)

Der coole Trick ist jedoch, wenn für jeden Kreis, wenn wir die Bögen integrieren, die sich nicht in einem anderen Kreis befinden, wir die erforderliche Fläche erhalten, d. JOB ERLEDIGT!!!

Sogar die Fälle, in denen sich ein Kreis nicht mit einem anderen schneidet, werden übernommen Sorge um.

Hier ist der GitHub-Link zu meinem C++ - Code

0
Deepesh Thakur