Delphi-Quellcode:
function Abstand (const p1, p2, p3: TPoint): double;
var
p4: TPoint;
lambda: double;
begin
lambda := (sqr(p1.x)-p1.x*(p2.x+p3.x)+p2.x*p3.x+(p1.y-p2.y)*(p1.y-p3.y))/(sqr(p1.x)-2*p1.x*p2.x+sqr(p2.x)+sqr((p1.y-p2.y)));
p4.x := p1.x+lambda*(p2.x-p1.x);
p4.y := p1.y+lambda*(p2.y-p1.y);
Result := sqrt(sqr(p3.x-p4.x)+sqr(p3.y-p4.y));
end;
Zitat von
Torpedo:
Kann sein dass Delphi hier mit Integer rechnet (wegen TPoint), dann kommt das falsche raus. Ansonsten sollte es stimmen.
Ja, ist so, so geht es:
Delphi-Quellcode:
function Abstand (const x1, y1, x2, y2, x3, y3: Integer): double;
var
x4, y4: double;
lambda: double;
begin
lambda := (sqr(x1)-x1*(x2+x3)+x2*x3+(y1-y2)*(y1-y3))/(sqr(x1)-2*x1*x2+sqr(x2)+sqr((y1-y2)));
x4 := x1+lambda*(x2-x1);
y4 := y1+lambda*(y2-y1);
Result := sqrt(sqr(x3-x4)+sqr(y3-y4));
end;
Funktioniert super! Jetzt hab' ich noch'n Verständnisproblem. Die Abweichung von 0 wird hier mathematisch angegeben. Kann ich die Werte in Pixel umrechnen? Wie kann ich Toleranzen definieren?
Bsp.:
P1(0,0), P2(200,200); P3(100,101)
Die function liefert: 0,707..
Das heißt der Punkt liegt mathematisch (numerisch) nicht exakt zwischen P1 und P2, jetzt hab' ich aber keine pixelmäßige Vorstellung der Abweichung (heißt das ca. 70% eines Pixels Abweichung?).
[edit]
Hab's jetzt so und funktioniert wunderbar. Nochmals ein drittes Dankeschön an die ganzen Antworten!
Delphi-Quellcode:
function TSpieler.FreieSicht(const x1,y1,x2,y2,dicke,spielernummer: Integer): boolean;
var
x3, y3: integer;
x4, y4, lambda: double;
begin
x3 := mdaten.daten[spielernummer].X;
y3 := mdaten.daten[spielernummer].Y;
lambda := (sqr(x1)-x1*(x2+x3)+x2*x3+(y1-y2)*(y1-y3))/(sqr(x1)-2*x1*x2+sqr(x2)+sqr((y1-y2)));
x4 := x1+lambda*(x2-x1);
y4 := y1+lambda*(y2-y1);
// edit: (Danke für den Hinweis @Nikolas)
{if not (((x3 >= x1) and (x3 <= x2)) or ((x3 <= x1) and (x3 >= x2))) then
begin
result := false;
exit;
end;} // <-- nö, passt au no net
{ muss mal doch genauer überlegen, wie man die Eingrenzung durchführen muss; }
// /edit
if round(sqrt(sqr(x3-x4)+sqr(y3-y4))) <= dicke then
result := true
else
result := false;
end;
[/edit]
Gruß
Calculon
--