Ich hab grad ein Problem mehr gefunden.. -> senkrechte Linien sind möglich. Allerdings ist das kein wirkliches Problem. Wenn die x werte von start- und endpunkt gleich sind wird einfach ne andere Routine aufgerufen.
Da das schweizersystem scheinbar nicht so einfach ist wie zuerst gedacht.. Vllt doch noch mal die konventionelle variante:
Zitat:
d.h. ich würde als allererstes die Steigung der Linie ausrechnen. Dann müsste man den y-Achsenabschnitt ermitteln (bei dem Ursprung oben links wird der negativ)
und dann für x=start.x bis end.x alle Punkte der Linie mittels f(x)=m*x+b errechnen. Wenn ein Punkt errechnet wurde wird dieser mit dem Punkt an den geklickt wurde verglichen. Sollte es einen Treffer geben wird die Prozedur abgebrochen und der Wert der Funktion als "true" zurückgegeben. Wenn es keinen Treffer gab wird der nächste Punkt geprüft.
Delphi-Quellcode:
function checkpointonline(start.x, start.y, ende.x,ende.y,p.x,p.y):boolean;
var x: extended;
b,i,a: integer;
begin
m := (end.y-start.y)/(end.x-start.x);
b:= round(end.y-(m*end.x);
for i:=-(toleranz+stifdicke) to toleranz+stiftdicke do
begin
for a:=-(toleranz+stifdicke) to toleranz+stiftdicke do
begin
if (p.y+i)=round((p.x+a)*m+b) then
begin
result:=true;
exit;
end
else result:=false;
end;
end;
end;
Problem bei diesem Algorithmus könnte sein, dass das ziemlich langsam wird bei längeren Linien und vorallem vielen Linien die überprüft werden sollen.