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:
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;