Hm...also
ich habe nun eine Klasse geschrieben, welche einem aus so einem Bild und einer Koordinate die Ränder des Polygons wo der Punkt drin ist als Bitmap ausgibt....Mit beispielprogramm
[Siehe Anhang
]
Zu der Ausgabe der Bitmaps:
Ich weiss, es gibt wenig was noch unschöner ist als diese Pointer-Misshandlung da...
Aber anders habe ich es irgendwie nicht hingekriegt
Wer es sauber schafft kann es mir bitte per PN schicken....
nun bleibt das Problem, die Punkte auf einer Geraden zu eliminieren...
Hat da irgendjemand eine Idee zu?
[Edit]
Also die Bitmaps werden jetzt vernünftig kopiert...bleibt das eleminieren der geraden...
[Edit2]
könnte man es nicht so machen, das man jeden Pixel des Rands mit jedem anderen der übrig bleibt vergleicht, und immer solange einen weiter geht, bis nicht mehr alle pixel dazwischen auf einer direkten linie zwischen den beiden punkten liegen?
dann löscht man alle die dazwischen lagen, und fängt mit dem gefundenen endpunkt wieder an.
das ganze macht man dann solange bis der endpunkt wieder der anfangspunkt ist...
Das probier ich mal aus
(Bresenham hab ich schon gefunden
)
[Edit3]
Ist das eine vernünftige Übersetzung des
Wikipedia-Codes?
Delphi-Quellcode:
procedure Swap(var X, Y: Integer);
var T: Integer;
begin
T:=X;
X:=Y;
Y:=T;
end;
procedure Line(X0, Y0, X1, Y1: Integer; var Points: TPoints);
var Steep: Boolean;
DX, DY, E, DE, YStep: Integer;
Y, X: Integer;
begin
Steep:=Abs(Y1-Y0) > Abs(X1-X0);
if Steep then
begin
Swap(X0,Y0);
Swap(X1,Y1);
end;
if X0>X1 then
begin
Swap(X0,X1);
Swap(Y0,Y1);
end;
DX:=X1-X0;
DY:=Abs(Y1-Y0);
E:=0;
DE:=DY;
Y:=Y0;
SetLength(Points,X1-X0+1);
if Y0<Y1 then YStep:=1 else YStep:=-1;
for X:=X0 to X1 do
begin
if Steep then
begin
Points[X-X0].X:=X;
Points[X-X0].Y:=Y;
end
else
begin
Points[X-X0].X:=Y;
Points[X-X0].Y:=X;
end;
E:=E+DE;
if E SHL 1 >= DX then
begin
Y:=Y+YStep;
E:=E-DX;
end;
end;
end;