Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 2 Objekte entfernung berechnen mit dem Mittelpunkt (https://www.delphipraxis.net/72520-2-objekte-entfernung-berechnen-mit-dem-mittelpunkt.html)

mimi 2. Jul 2006 09:13


2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Hallo,
ich möchte gerne von zwei objekten die entfernung berechnen, das habe ich mir so vorgestellt:
1. ich berechne den mittelpunkt von den zwei objekten:
Delphi-Quellcode:
// Vom zuletzt makierten objekt
  sm.x:=TFigure(obj.Items[selobj]).Style.LastPos.X div 2;
  sm.y:=TFigure(obj.Items[selobj]).Style.LastPos.y div 2;
// und von einenm anderen objekt

  for i:=0 to obj.count-1 do begin
    if (TFigure(obj.Items[i]).Style.isSel = True) and (i <> SelObj) then begin
      sm1.x:=TFigure(obj.Items[i]).Style.LastPos.X div 2;
      sm1.y:=TFigure(obj.Items[i]).Style.LastPos.y div 2;
    end;
  end;
das problem ist jetzt: ich möchte die entfernung haben vom zuletzt makierten objekt und zu den andren objekt und zwar von beiden ränder aus... ich dachte das könnte ich irgenwie über die winkel machen nur ich weiß leider nicht genau wie.
Lastpos ist der rechte rand vom objekt

Könnte mir da jemmand etwas Helfen ? vielen dank im vorraus.

Maximus 2. Jul 2006 09:16

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Wenn mich nicht alles täuscht müsste das doch über den Satz des Pythagoras (schreibt man den so?) zu lösen sein.

Code:
dif.x = sm.x - sm1.x
dif.y = sm.y - sm1.y

Entfernung = Wurzel(dif.x² + dif.y²)
MFG
Maximus

TheAn00bis 2. Jul 2006 09:20

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Den Abstand der Mittelpunkte zu berechnen ist kein Problem, einfach x1-x2 und y1-y2 und dann Pythagoras.
//Edit: So, wie es Maximus macht. ;)

Um aber vom Rand aus zugehen muss man wissen, welche Form die Objekte haben.

mimi 2. Jul 2006 09:39

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Vielen Dank für die schnelle antwort, jedoch hat es nicht funktioniert, weil die werte waren immer zu klein:
Delphi-Quellcode:
var
  i:integer;
  sm,sm1,diff:TPoint;

  m1,m2:Extended;
begin
  sm.x:=TFigure(obj.Items[selobj]).Style.LastPos.X div 2;
  sm.y:=TFigure(obj.Items[selobj]).Style.LastPos.y div 2;
  // und von einenm anderen objekt

  for i:=0 to obj.count-1 do begin
    if (TFigure(obj.Items[i]).Style.isSel = True) and (i <> SelObj) then begin
      sm1.x:=TFigure(obj.Items[i]).Style.LastPos.X div 2;
      sm1.y:=TFigure(obj.Items[i]).Style.LastPos.y div 2;
      diff.X:=sm1.x-sm.x;
      diff.y:=sm1.y-sm.y;

      m1:=Sqrt(diff.x*2) + (diff.y*2);
    end;
  end;
  Label2.Caption:=FloatToStr(m1);
Bei den Objekten haldelt es sich um Vieecke

TheAn00bis 2. Jul 2006 09:44

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Delphi-Quellcode:
m1:=Sqrt(diff.x*2) + (diff.y*2);
ist nicht äquivalent zu

Delphi-Quellcode:
m1:=Sqrt(diff.x*diff.x) + (diff.y*diff.y);
:P

mimi 2. Jul 2006 09:52

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Delphi-Quellcode:
Entfernung = Wurzel(dif.x² + dif.y²)
was hat den die kleine zwei zu bedeuten ?

ich dachte einfach mal 2 nehmen oder nicht ?

Khabarakh 2. Jul 2006 09:56

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Zitat:

Zitat von TheAn00bis
Delphi-Quellcode:
m1:=Sqrt(diff.x*2) + (diff.y*2);
ist nicht äquivalent zu

Delphi-Quellcode:
m1:=Sqrt(diff.x*diff.x) + (diff.y*diff.y);
:P

Und auch das ist Quatsch, da es natürlich
Delphi-Quellcode:
m1 := Sqrt(diff.x * diff.x + diff.y * diff.y);
oder gleich
Delphi-Quellcode:
m1 := Sqrt(Sqr(diff.x) + Sqr(diff.y));
heißen muss.

Zitat:

Zitat von mimi
was hat den die kleine zwei zu bedeuten ?

ich dachte einfach mal 2 nehmen oder nicht ?

Öhm - nicht ganz. Ein hochgestellter Term ist das Zeichen für Potenzieren, in diesem Falle der Spezialfall Quadrierung.

mimi 2. Jul 2006 10:07

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
entwerde verstehe ich das ergbnis nicht oder die formel funtkioniert noch nicht:
die werte sind viel zu hoch jetzt.
ich habe das jetzt so:
Delphi-Quellcode:
 for i:=0 to obj.count-1 do begin
    if (TFigure(obj.Items[i]).Style.isSel = True) and (i <> SelObj) then begin
      sm1.x:=TFigure(obj.Items[i]).Style.LastPos.X div 2;
      sm1.y:=TFigure(obj.Items[i]).Style.LastPos.y div 2;
      diff.X:=sm1.x-sm.x;
      diff.y:=sm1.y-sm.y;

      m1 := Sqrt(Sqr(diff.x) + Sqr(diff.y));
    end;
  end;

Der_Unwissende 2. Jul 2006 10:23

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Hi,
der Satz den du hier siehst, der bezieht sich einfach nur auf ein rechtwinkliges Dreieck. Mal dir einfach ein Koordinatensystem auf, zeichne dort zwei Objekte ein (mit Koordinaten). Nun wählst du die Punkte, deren Abstand zueinander du möchtest. Du zeichnest jetzt einmal die X Differenz der Punkte als Gerade parallel zu der X-Achse und die Y Differenz parallel zur Y Achse. Das ist dein rechter Winkel. Jetzt verbindest du noch die beiden Punkte direkt und du hast ein Dreieck.
Für dieses Dreieck gilt nun (sagt der Satz):
Die Summe der Kathetenquadrate (das sind die beiden Linien, mit dem rechten Winkel) ist gleich der Summe des Hypothenusenquadrats (die Linie gegenüber dem rechten Winkel oder auch die Linie die die beiden Punkte direkt verbindet). Da du hier die Quadrate betrachtest, aber nur die "länge" der letzten Linie möchtest, ziehst du hier also die Wurzel.

Das ist genau das, was du berechnest, sqr(diffX) + sqr(diffY) ist gerade die Summe der Kathetenquadrate, sqrt ist dann die Wurzel daraus und damit stimmt auch der Wert.

Gruß Der Unwissende

mimi 2. Jul 2006 10:26

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
und wie kann ich es umstellen auf ein viereck ?

TheAn00bis 2. Jul 2006 11:11

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab mir gerade mal überlegt, wie ich es machen würde, aber mein Weg ist ziemlich aufwändig. Leider ist mir wirklich kein leichterer Weg eingefallen. (grobe Skizze meiner Lösung s. Anhang)
Es würde mich wirklich interessieren, wie das leichter zu lösen ist.

jfheins 2. Jul 2006 11:22

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Bei dieser Konstellation würde ich es so machen::

x-länge = x-abstand - 0.5*Seite_Viereck1 - 0.5*Seite_Viereck2;

y-länge = y-abstand/x-abstand * x-länge;

länge = sqrt(sqr(x-länge) + sqr(y-länge));

länge, x-länge, y-länge auf g bezogen ;)

Eichhoernchen 2. Jul 2006 11:53

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Wie wäre es mit:
Geradengleichung g aufstellen. In die gleichung den Rand von Object A einsetzen = Schnittpunkt von g und Rand.
Dann nochmal den Rand von Object B einsetzen und dann mit Pythagoras den abstand zwischen den 2 Schnittpunken berechnen.

Also

Delphi-Quellcode:
var MitteA, MitteB, SchnittA, SchnittB : TPoint;
    m, entf : integer;
MitteA.X := ObjectA.left + ObjectA.width div 2;
MitteA.Y := ObjectA.Top + ObjectA.Height div 2;
MitteB.X := ObjectB.left + ObjectB.width div 2;
MitteB.Y := ObjectB.Top + ObjectB.Height div 2;
m := ((MitteB.Y - MitteA.Y) / (MitteB.X - MitteA.X));
SchnittA.Y := (m * ObjectA.rand.X ) - (m*MitteA.X) + MitteA.Y;
SchnittA.X := ObjectA.rand.X;
SchnittB.Y := (m * ObjectB.rand.X) - (m*MitteA.X) + MitteA.Y;
SchnittB.X := ObjectB.rand.X;
entf := sqrt( sqr(SchnittB.X-SchnittA.X) + sqr(SchnittB.Y-SchnittA.Y) );
Nach der 2-Punkte Formel: y - y1 = ((y2 - y1) / (x2 - x1)) * (x - x1)


Hoffe das klappt!

mimi 2. Jul 2006 12:53

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Mir ist da noch eine andere lösung eingfallen doch diese hat auch nicht funkioniert und zwar wollte ich folgendes machen:

Zuerst rechne ich den mittelpunk aus, dann
rechne ich mir die größe für x und y aus teile sie durch 2

das mache ich mit allen objekten.
wenn ich fertig bin muss ich normalerweise doch nur noch:
Mittelpunk1-Mittelpunk2-Größe1-Größe2 rechnen doch das klapp leider nich hier mein qullcode:
Delphi-Quellcode:
var
  i:integer;
  sm,sm1:TPoint;
  s1,s2:TPoint;
  m,s:Integer;
begin
  sm.x:=TFigure(obj.Items[selobj]).Style.LastPos.X div 2;
  sm.y:=TFigure(obj.Items[selobj]).Style.LastPos.y div 2;
  S1.X:=(TFigure(obj.Items[selobj]).Style.LastPos.X-TFigure(obj.Items[selobj]).Style.FirstPos.X) div 2;
  S1.Y:=(TFigure(obj.Items[selobj]).Style.LastPos.Y-TFigure(obj.Items[selobj]).Style.FirstPos.Y) div 2;
  // und von einenm anderen objekt

  for i:=0 to obj.count-1 do begin
    if (TFigure(obj.Items[i]).Style.isSel = True) and (i <> SelObj) then begin
      with TFigure(obj.Items[i]).Style do begin
        sm1.x:=LastPos.X div 2; sm1.y:=LastPos.y div 2;
        S2.X:=(LastPos.X-FirstPos.X) div 2;
        S2.Y:=(LastPos.Y-FirstPos.Y) div 2;
      end;

    end;
  end;
//    Label2.Caption:=FloatToStr((Sm1.X-sm.X) / 3 )
  m:=sm.X-sm1.X; s:=S1.X+s2.X;
  Label2.Caption:=IntToStr(s-m);
ich werde mir gleich mal eure vorschläge anschauen !!!
Edit:
@TheAn00bis
ungefähr so habe ich es mir auch vorgstellt *G*

mimi 2. Jul 2006 13:15

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
Ich habe es GESCHAFT..... es gibt zwar noch ein paar schönheitsfehler aber die löse ich auch noch:
Delphi-Quellcode:
var
  i:integer;
  sm,sm1:TPointExt;
  s1,s2:TPointExt;
  m,s:Extended;
begin
  with TFigure(obj.Items[selobj]).Style do begin
    S1.X:=(LastPos.X-FirstPos.X) / 2;
    S1.Y:=(LastPos.Y-FirstPos.Y) / 2;
    sm.x:=FirstPos.X + s1.x;
    sm.y:=FirstPos.y + s1.y;
  end;
  // und von einenm anderen objekt

  for i:=0 to obj.count-1 do begin
    if (TFigure(obj.Items[i]).Style.isSel = True) and (i <> SelObj) then begin
      with TFigure(obj.Items[i]).Style do begin
        S2.X:=(LastPos.X-FirstPos.X) / 2;
        S2.Y:=(LastPos.Y-FirstPos.Y) / 2;
        sm1.x:=FirstPos.X + s2.X;
        sm1.y:=FirstPos.y + S2.y;
      end;

    end;
  end;
//    Label2.Caption:=FloatToStr((Sm1.X-sm.X) / 3 )
  m:=(sm.X)-sm1.X; s:=S1.X+s2.X;
  Label2.Caption:=FloatToStr((s-m));
  m:=(sm.y)-sm1.y; s:=S1.y+s2.y;
  Label3.Caption:=FloatToStr((s-m));
mit diesem code kann die entfernung von mittelpunk a zu mittelpunk b erechnet werden.
ich werde daraus noch eine funktion bauen(wegen der übersichtlichkeit)....

mimi 2. Jul 2006 16:09

Re: 2 Objekte entfernung berechnen mit dem Mittelpunkt
 
es schien zu klappen doch irgenwie brecht er die forschleife bzw. die funktion vorzeitig ab und ich weiß nicht warum:
Delphi-Quellcode:
function GetDir1(ObjIndex:Integer):TPointExt;
var
  i:integer;
  sm,sm1:TPointExt;
  s1,s2:TPointExt;
  m,s:Extended;
  e,o1:TPointExt;
begin

  with TFigure(obj.Items[ObjIndex]).Style do begin
    S1.X:=(LastPos.X-FirstPos.X) / 2;
    S1.Y:=(LastPos.Y-FirstPos.Y) / 2;
    sm.x:=FirstPos.X + s1.x;
    sm.y:=FirstPos.y + s1.y;
  end;
  // und von einenm anderen objekt

  for i:=0 to obj.count-1 do begin
    if (i <> ObjIndex) then begin
      with TFigure(obj.Items[i]).Style do begin
        S2.X:=(LastPos.X-FirstPos.X) / 2;
        S2.Y:=(LastPos.Y-FirstPos.Y) / 2;
        sm1.x:=FirstPos.X + s2.X;
        sm1.y:=FirstPos.y + S2.y;

        if Sm.x > sm1.x then begin
          m:=(sm.X)-sm1.X;
          s:=S1.X+s2.X;
        end
        else begin
          m:=(sm1.X)-sm.X;
          s:=S2.X+s1.X;
        end;
        e.x:=m-s;

        if Sm.y > sm1.y then begin
          m:=(sm.y)-sm1.y;
          s:=S1.y+s2.y;
        end
        else begin
          m:=(sm1.y)-sm.y;
         s:=S2.y+s1.y;
        end;
        e.y:=m-s;
       end;

       if (o1.x >e.x ) and (o1.y>e.y) then begin

         o1.x:=e.x;
         o1.y:=e.y;
         result:=o1;
       end;
    end; // With
  end;


end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 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