![]() |
Voronoi-Diagramme
Zur Zeit befasse ich mich mit Voronoi-Diagrammen.
Ein brute-force-Ansatz zum Füllen der Zellen ist ja recht schnell geschrieben, was mir aber fehlt ist ein Algorhitmus zur Bestimmung der Eckpunkte des jeweiligen Hüll-Polygons. Hat jemand soetwas in seinem Fundus? |
AW: Voronoi-Diagramme
Ich wage mal zu bezweifeln, dass es da einen expliziten Algo für gibt. Alle Voronoi bzw. Delauney Algos die ich bisher gesehen habe basieren in einer oder anderer Weise immer auf inkrementellen Verfahren. Bei letzterem hat man nachher zwar wirklich Punkte an der Hand, aber soweit ich weiß sind die zwei Algos zwar dual zueinander, aber man kann nicht auf einfache Weise von der Triangulierung auf die Eckpunkte des bei Voroni enstehendes "Gitters" überführen. Das Einzige was mir da einfiele wäre nachträgliche Vektorisierung. Zwar unelegant, auflösungsabhängig und nicht wirklich präzise, aber mir fällt im Moment nichts schlaueres ein.
|
AW: Voronoi-Diagramme
Leider nichts in Delphi, aber vielleicht ist hier was für dich dabei.
![]() ![]() ![]() |
AW: Voronoi-Diagramme
@Medium
Die nachträglich Vektorisierung wird u. a. auch dadurch schwierig, dass der brute-force-Ansatz keine glatten Kanten erzeugt sondern teilweise starke Treppen. Man könnte versuchen, die Stellen zu finden, an denen drei oder mehr Farben aneinander treffen (Sonderfall Ränder), dann weiß mann aber immer noch nicht, welche solcher Punkte zu welcher Zelle gehören. @Rollo 62 Danke für die Links, nach einer ersten Prüfung bringen sie mich aber nicht weiter. |
AW: Voronoi-Diagramme
Der Algorithmus auf Wikipedia hilft dir nicht?
![]() Was hast du denn an Daten? |
AW: Voronoi-Diagramme
Zitat:
Na, wenn da z. B. steht "Berechne KH(P') //Mit geeignetem Algorithmus" dann fehlt mir halt der geeignete Alogrhitmus (und nicht nur an dieser Stelle). Ich bin mir nicht sicher, was du mit 'Daten' meinst. Ich habe natürlich die Koordinaten der 'Zellkerne ('sites') und die Farben der jeweiligen Zellen (jeweils Farbe des Kerns). |
AW: Voronoi-Diagramme
Vielleicht helfen diese Links?
![]() ![]() ![]() ![]() Aber das war jetzt nur gegoogelt + das hast du wahrscheinlich auch gemacht. Ach ja: ![]() |
AW: Voronoi-Diagramme
Zitat:
Aber ich werde mal einen neuen Anlauf nehmen - mittlerweile weiß ich ja schon einiges mehr über das Thema. edit: Es bleibt dabei - dieser Code erzeugt keine korrekten Ergebnisse. |
AW: Voronoi-Diagramme
Liste der Anhänge anzeigen (Anzahl: 2)
Dieser Ansatz dürfte langsamer als die Polygon Methode von RosettaCode.org sein, aber sie tut's - glaube ich :-D
Delphi-Quellcode:
procedure TformMain.DrawVoronoi(AImage: TImage; const AP, ACells: Integer; ADistanceType: TDistanceType);
var px, py: array of Integer; LColor: array of TColor; LImg: TBitmap; n, i, x, y, j: Integer; d1, d2: Double; function GetDistance(const x1, x2, y1, y2, AP: Integer; const ADistanceType: TDistanceType): Double; begin case ADistanceType of dtManhattan: Result := Abs(x1 - x2) + Abs(y1 - y2); dtMinkovski: Result := Power(Power(Abs(x1 - x2), AP) + Power(Abs(y1 - y2), AP), (1 / AP)); else Result := Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); // dtEuclidian end; end; begin LImg := nil; try LImg := TBitmap.Create; LImg.Width := AImage.Width; LImg.Height := AImage.Height; SetLength(px, ACells); SetLength(py, ACells); SetLength(LColor, ACells); // Zufällige Zellen/Sites erzeugen for i := 0 to ACells - 1 do begin px[i] := RandomRange(1, AImage.Width-1); // nicht direkt auf dem Rand py[i] := RandomRange(1, AImage.Height-1); LColor[i] := GenerateRandomColor; end; // In x und y Richtung die Entfernungen ermitteln, Farbe der am nächsten liegenden Zelle bestimmen for x := 0 to AImage.Width - 1 do begin for y := 0 to AImage.Height - 1 do begin n := 0; for i := 0 to ACells - 1 do begin d1 := GetDistance(px[i], x, py[i], y, AP, ADistanceType); d2 := GetDistance(px[n], x, py[n], y, AP, ADistanceType); if d1 < d2 then n := i; end; LImg.Canvas.Pixels[x, y]:=LColor[n]; end; end; // Zelle/Site zeichnen for j := 0 to ACells - 1 do begin LImg.Canvas.Pen.Color := clBlack; LImg.Canvas.Brush.Color := clBlack; LImg.Canvas.Rectangle(px[j] - 2, py[j] - 2, px[j] + 2, py[j] + 2); end; AImage.Picture.Assign(LImg); finally LImg.Free; end; end; |
AW: Voronoi-Diagramme
Vielen Dank, dass du dir die Mühe gemacht hast!
Aber ... das ist eine Umsetzung des brute-Force-Ansatzes. D. h. du prüfst für jedes Pixel, welcher Kern am nächsten liegt und färbst es dementsprechend ein. Das jeweilige Hüll-Poligon einer Zelle wird aber nicht ermittelt. Du setzt Zellen (Cells) und Sites gleich, das sind sie aber nicht. Sites sind die einzelnen 'Kerne', Cells die sie umgebene Fläche. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz