Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Koordinaten zwischen zwei Punkten (https://www.delphipraxis.net/147635-koordinaten-zwischen-zwei-punkten.html)

Delphi-Narr 12. Feb 2010 19:58


Koordinaten zwischen zwei Punkten
 
Hallo,
gibt es eine Funktion, die mir eine Koordinate zwischen zwei anderen ausgibt, die auf einer geraden Linie liegt?

Also ich gebe die Punkte 0|0 und 100|100 an und möchte eine (gerundete) Koordinate haben, die einen Abstand von 20 Pixeln von Punkt 1 hat.

Liebe Grüße!

markus5766h 12. Feb 2010 20:12

Re: Koordinaten zwischen zwei Punkten
 
Hallo,

---> Winkelfunktionen,

in diesem Fall reicht Pythagoras

Abstand = Wurzel((20^2)/2) = 14,142135, gerundet : 14

Aphton 12. Feb 2010 23:54

Re: Koordinaten zwischen zwei Punkten
 
Ne gibts noch nicht,
Delphi-Quellcode:
type
  TPointF = record
    X: Single;
    Y: Single;
  end;

function PointF( const X, Y: Single ): TPointF;
begin
  Result.X := X;
  Result.Y := Y;
end;

function PointOnLine(var vStart, vEnd: TPointF; const Percentage: Byte): TPointF;
var
  vSE : TPointF;
  d  : Single;
begin
  d      := (Percentage mod 101) / 100;
  vSE    := PointF( vEnd.X - vStart.X, vEnd.Y - vStart.Y );
  Result := PointF( vStart.X + vSE.X*d, vStart.X + vSE.Y*d );
end;
Jetzt aber ...

MfG

Delphi-Narr 13. Feb 2010 10:24

Re: Koordinaten zwischen zwei Punkten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hm, und wie soll ich die dann aufrufen? Ich möchte ja keinen Prozentwert angeben, sondern einen absoluten Wert...
Und TPointF kann man ja nicht im LineTo einbauen.

Hier mal mein Lösungsansatz:

Delphi-Quellcode:
function TForm1.PointOnLine(X1,Y1,X2,Y2,Abstand:integer):TPoint;
var V:real; //Verhältnis zwischen AB und AD
    AB,BD,AD,AE,CE,x,y:integer;
begin

AD:=X1-X2;
BD:=Y1-Y2;
AB:=(Round(sqrt(sqr(AD)+sqr(BD))));
if AD<>0 then V:=AB/AD else V:=1;
CE:=Round(BD/V);
AE:=Round(Sqrt(sqr(Abstand)-sqr(CE)));
x:=Round(X1+AE);
y:=Round(Y1+CE);

Result:=Point(X,Y);
end;
Ich lad mal ein Bild hoch, was die Punkte benennt

mkinzler 13. Feb 2010 10:28

Re: Koordinaten zwischen zwei Punkten
 
Hier sollte der Bresenham Algo hilfreich sein

jfheins 13. Feb 2010 11:18

Re: Koordinaten zwischen zwei Punkten
 
Ich würde es so machen:
1. Entfernung zwischen A und B ausrechnen. (nennen wir sie dx und dy und ds = sqrt(dx^2+dy^2) - also die schräge länge)
2. Punkt finden. Dazu das Verhältnis bilden, zwischen ds und x und jeweils mit dx und dy miltiplizieren.

Also:

dx = B.x - A.x;
dy = B.y - A.y;
ds = sqrt(dx*dx + dy*dy);
C.x = A.x + dx * X / ds;
C.y = A.y + dy * X / ds;

Am Ende kannst du dann noch runden ;)

Aphton 13. Feb 2010 18:00

Re: Koordinaten zwischen zwei Punkten
 
Zitat:

Zitat von Delphi-Narr
Hm, und wie soll ich die dann aufrufen? Ich möchte ja keinen Prozentwert angeben, sondern einen absoluten Wert...
Und TPointF kann man ja nicht im LineTo einbauen.

Hier mal mein Lösungsansatz:

Delphi-Quellcode:
function TForm1.PointOnLine(X1,Y1,X2,Y2,Abstand:integer):TPoint;
var V:real; //Verhältnis zwischen AB und AD
    AB,BD,AD,AE,CE,x,y:integer;
begin

AD:=X1-X2;
BD:=Y1-Y2;
AB:=(Round(sqrt(sqr(AD)+sqr(BD))));
if AD<>0 then V:=AB/AD else V:=1;
CE:=Round(BD/V);
AE:=Round(Sqrt(sqr(Abstand)-sqr(CE)));
x:=Round(X1+AE);
y:=Round(Y1+CE);

Result:=Point(X,Y);
end;
Ich lad mal ein Bild hoch, was die Punkte benennt

1. Dann modifiziere meinen Code so, dass >vSE< normalisiert wird (dh Länge=1 hat) und anschließend multiplizierst du es anstatt mit dx mit dem Wert, den du haben willst.
2. Per Round() kannst du Float-Werte nach Integer umwandeln

edit:
Delphi-Quellcode:
function TForm1.PointOnLine(const X1,Y1,X2,Y2,Abstand: Integer): TPoint;
ver
  dX, dY,
  dL: Single;
begin
  dX := X2-X1;
  dY := Y2-Y1;
  dL := SQRT( dX*dX + dY*dY );
  if dL = 0 then
    dL := 1;
  dX := dX / dL;
  dY := dY / dL;
  Result := Point( Round( dX*Abstand ), Round( dY*Abstand ) );
end;
MfG

Delphi-Narr 13. Feb 2010 18:21

Re: Koordinaten zwischen zwei Punkten
 
Delphi-Quellcode:
MoveTo(200,200);
P:=(PointOnLine(200,200,Mouse.cursorpos.x,Mouse.cursorpos.y,150));
LineTo(P.x,P.y);
Wenn ich das ganze so mache, dann ist das Ergebnis aber keine Linie, die vom Punkt 200|200 in Richtung des Mauszeigers geht...

Aphton 13. Feb 2010 22:24

Re: Koordinaten zwischen zwei Punkten
 
Achja sorry, du musst die letzte Zeile so umändern:
Delphi-Quellcode:
  Result := Point( Round( X1 + dX*Abstand ), Round( Y1 + dY*Abstand ) );

Delphi-Narr 14. Feb 2010 12:19

Re: Koordinaten zwischen zwei Punkten
 
Danke, klappt jetzt wunderbar!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz