AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Koordinaten zwischen zwei Punkten

Ein Thema von Delphi-Narr · begonnen am 12. Feb 2010 · letzter Beitrag vom 14. Feb 2010
Antwort Antwort
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#1

Koordinaten zwischen zwei Punkten

  Alt 12. Feb 2010, 19:58
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!
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#2

Re: Koordinaten zwischen zwei Punkten

  Alt 12. Feb 2010, 20:12
Hallo,

---> Winkelfunktionen,

in diesem Fall reicht Pythagoras

Abstand = Wurzel((20^2)/2) = 14,142135, gerundet : 14
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Koordinaten zwischen zwei Punkten

  Alt 12. Feb 2010, 23:54
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Koordinaten zwischen zwei Punkten

  Alt 13. Feb 2010, 10:24
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
Miniaturansicht angehängter Grafiken
pointonline_296.jpg  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Koordinaten zwischen zwei Punkten

  Alt 13. Feb 2010, 10:28
Hier sollte der Bresenham Algo hilfreich sein
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: Koordinaten zwischen zwei Punkten

  Alt 13. Feb 2010, 11:18
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
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Koordinaten zwischen zwei Punkten

  Alt 13. Feb 2010, 18:00
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Koordinaten zwischen zwei Punkten

  Alt 13. Feb 2010, 18:21
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...
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Koordinaten zwischen zwei Punkten

  Alt 13. Feb 2010, 22:24
Achja sorry, du musst die letzte Zeile so umändern:
  Result := Point( Round( X1 + dX*Abstand ), Round( Y1 + dY*Abstand ) );
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Koordinaten zwischen zwei Punkten

  Alt 14. Feb 2010, 12:19
Danke, klappt jetzt wunderbar!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 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