AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Punkt in Polygon einfügen [GELÖST]

Punkt in Polygon einfügen [GELÖST]

Ein Thema von Root2k · begonnen am 26. Okt 2011 · letzter Beitrag vom 27. Okt 2011
 
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#1

Punkt in Polygon einfügen [GELÖST]

  Alt 26. Okt 2011, 13:43
Hallo,

ich entwickle momentan ein kleines Zeichenprogramm, welches u.a. eine Bereichsfunktion beinhaltet.
Diese funktioniert wie folgt:

- Der Benutzer klick 3 Mal auf den Zeichenbereich (z.B. an Position A [10 | 10] ; B [20 | 20] ; C [30 | 15])
- Das Programm speichert die Koordinaten (Array) und berechnet daraus eine geschlossene Kurve/Spline mit mehreren Zwischenpunkten (Polygon/Ellipse).

Nachdem das alles erledigt ist, kann der Benutzer weitere Punkte (durch Klicks) einfügen. Das Programm fügt diese dann in die Liste ein und berechnet eine neue Kurve/Spline. Allerdings wird der neue Punkt immer an letzter Stelle eingefügt.
Das ist genau das Problem: Wenn jetzt der Punkt D bei [15 | 15] liegt, berechnet meine Methode eine Kurve über die Punkte mit der Reihenfolge A, B, C, D.
Das ergibt allerdings eine 8:
1.jpg

Hier wäre es aber besser, wenn die Kurve die Reihenfolge A, D, B, C verwenden würde.

Hat von Euch vielleicht jemand eine Idee wie ich mir berechnen lassen kann, wo der Punkt in das Array eingefügt werden soll?
Bin gerade etwas ratlos...

Das ist übrigens der Code für die Berechnung der Kurve (nicht von mir - Autor aber nicht mehr gefunden):

Delphi-Quellcode:
procedure CalcCubicCurve(const points: tArrayOfFixedPoint;
  const steps: cardinal; const closed: boolean; var curve: tArrayOfFixedPoint);

  function CubicPoint(v1, v2, v3, v4: Integer; t: single): Integer;
  begin
    result := Round(v2 + t * ((-v1 + v3) + t * ((2 * v1 - 2 * v2 + v3 - v4) + t
      * (-v1 + v2 - v3 + v4))));
  end;

var
  ni, si, ci, hp, lc: Integer;
  p1, p2, p3, p4: tFixedPoint;
begin
  // writeln (tst, 'Gr32_Ext.CalcCubicCurve: steps=',steps,' closed=', closed);
  hp := High(points);
  if hp < 1 then
    exit; // ===>
  if closed then
  begin // closed curve ?
    lc := hp + 1;
    p2 := points[hp];
  end
  else
  begin // curve is not closed
    lc := hp;
    p2 := points[0];
  end;
  p3 := points[0];
  p4 := points[1];

  SetLength(curve, lc * Integer(steps) + 1);
  curve[0] := points[0];
  ci := 1;
  for ni := 1 to lc do
  begin
    p1 := p2; // shift curve points
    p2 := p3;
    p3 := p4;
    if closed then
      p4 := points[(ni + 1) mod (hp + 1)]
    else if ni + 1 <= hp then
      p4 := points[ni + 1];

    // calculate interpolation points
    for si := 1 to steps do
    begin
      curve[ci].X := CubicPoint(p1.X, p2.X, p3.X, p4.X, si / steps);
      curve[ci].Y := CubicPoint(p1.Y, p2.Y, p3.Y, p4.Y, si / steps);
      // writeln (tst, ci:3, curve[ci].x shr 16 :7, curve[ci].y div 65536:7);
      inc(ci);
    end;
  end;
end;

Geändert von Root2k (27. Okt 2011 um 07:51 Uhr)
  Mit Zitat antworten Zitat
 

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:17 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