AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Voronoi-Diagramme

Ein Thema von striderx · begonnen am 28. Mai 2019 · letzter Beitrag vom 30. Mai 2019
Antwort Antwort
Benutzerbild von timog
timog

Registriert seit: 26. Sep 2006
Ort: Landkreis Oldenburg (Oldb)
117 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

AW: Voronoi-Diagramme

  Alt 29. Mai 2019, 19:37
Dieser Ansatz dürfte langsamer als die Polygon Methode von RosettaCode.org sein, aber sie tut's - glaube ich

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;
Angehängte Grafiken
Dateityp: png Voronoi.PNG (11,8 KB, 29x aufgerufen)
Angehängte Dateien
Dateityp: 7z Voronoi.7z (52,4 KB, 13x aufgerufen)
Timo
Real Programmers are surprised when the odometers in their cars don't turn from 99999 to 9999A.
  Mit Zitat antworten Zitat
striderx

Registriert seit: 11. Feb 2007
Ort: Bergisch Gladbach
207 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Voronoi-Diagramme

  Alt 29. Mai 2019, 20:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von timog
timog

Registriert seit: 26. Sep 2006
Ort: Landkreis Oldenburg (Oldb)
117 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Voronoi-Diagramme

  Alt 30. Mai 2019, 08:21
Du setzt Zellen (Cells) und Sites gleich, das sind sie aber nicht. Sites sind die einzelnen 'Kerne', Cells die sie umgebene Fläche.
Danke

Bist Du bei der Recherche auch über James Kirby's Seite gestolpert?

Dort wird das Voronoi Diagramm und die Delaunay-Triangulierung dargestellt. Das Voronoi ist offen, von Linien begrenzt und kein geschlossenes Polygon, aber die Eckpunkte sollten vorhanden sein - vielleicht hilft das weiter?

Ansonsten: Der Quellcode ist Delphi 2.0 (Filedatum von 2000), verwendet MemAlloc und hat ein TMetaFile Speicherleck. Es können auch keine Punkte außerhalb der ersten begrenzenden Zellkerne ergänzt werden und scheint auch einigen Overhead (Lists.pas) mitzubringen...
Angehängte Grafiken
Dateityp: png Delaunay.PNG (9,7 KB, 27x aufgerufen)
Timo
Real Programmers are surprised when the odometers in their cars don't turn from 99999 to 9999A.
  Mit Zitat antworten Zitat
striderx

Registriert seit: 11. Feb 2007
Ort: Bergisch Gladbach
207 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Voronoi-Diagramme

  Alt 30. Mai 2019, 18:43
Bist Du bei der Recherche auch über James Kirby's Seite gestolpert?
Das kannte ich noch nicht. Aber ich muss gestehen, ich habe nicht die leiseste Idee, was der Typ da macht.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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