![]() |
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! |
Re: Koordinaten zwischen zwei Punkten
Hallo,
---> Winkelfunktionen, in diesem Fall reicht Pythagoras Abstand = Wurzel((20^2)/2) = 14,142135, gerundet : 14 |
Re: Koordinaten zwischen zwei Punkten
Ne gibts noch nicht,
Delphi-Quellcode:
Jetzt aber ...
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; MfG |
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:
Ich lad mal ein Bild hoch, was die Punkte benennt
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; |
Re: Koordinaten zwischen zwei Punkten
Hier sollte der
![]() |
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 ;) |
Re: Koordinaten zwischen zwei Punkten
Zitat:
2. Per Round() kannst du Float-Werte nach Integer umwandeln edit:
Delphi-Quellcode:
MfG
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; |
Re: Koordinaten zwischen zwei Punkten
Delphi-Quellcode:
Wenn ich das ganze so mache, dann ist das Ergebnis aber keine Linie, die vom Punkt 200|200 in Richtung des Mauszeigers geht...
MoveTo(200,200);
P:=(PointOnLine(200,200,Mouse.cursorpos.x,Mouse.cursorpos.y,150)); LineTo(P.x,P.y); |
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 ) );
|
Re: Koordinaten zwischen zwei Punkten
Danke, klappt jetzt wunderbar!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz