Entwickler-Ecke
Sonstiges (Delphi) - herausfinden, welches objekt dem image am nächsten ist
torstenheinze - Fr 14.03.03 19:45
Titel: herausfinden, welches objekt dem image am nächsten ist
hallo,
wie kann ich herausfinden, welches objekt meinem image am nächsten ist?
MSCH - Fr 14.03.03 20:30
Ich würd ja gerne helfen, aber ich versteh die Frage nicht :?: Kannst Du das etwas näher erklären?
grüße
MSCH
mimi - Fr 14.03.03 20:46
| Zitat: |
wie kann ich herausfinden, welches objekt meinem image am nächsten ist?
|
Was meinst du mit Objekt ? ein Spiele Objekt ? oder was ?
torstenheinze - Fr 14.03.03 21:06
also. ich habe 7 panels. und ein image. nun möchte herausfinden, an welchem panel das image am nächsten dran ist.
MSCH - Fr 14.03.03 21:10
Reine Mathematik,
ich würd die Bildschirmkoordiaten vergleichen.
Grüße
MSCH
Popov - Fr 14.03.03 21:16
Ich befürchte, daß du es selbst berechnen mußt. Es gibt zwar API-Möglichkeiten mit Regionen, aber es ist eher was in Richtung ob die sich berühren oder überschneiden oder eine Reion in der anderen. Allerdings ist mir keine Funktion aufgefallen die irgendwas mit Abstand zu tun hat.
Ich würde vorschlagen, daß du dir selbst was baust. Am besten arbeitest du auch mit Bounds oder mit Regionen die dir ein Wert zurückliefern.
torstenheinze - Fr 14.03.03 21:43
ok, danke.
ich werd mir eine eigene funktion bauen
mimi - Fr 14.03.03 22:55
ich werde das mit tags machen du gibt einem panel einen tag und der Image den selben....
und dann ist das doch ein kinderspiel oder ?
torstenheinze - Sa 15.03.03 13:25
ich hab mit den tags noch net gearbeitet, und ich wusste bisher auch net wozu die gut sind
DaFox - Sa 15.03.03 13:49
Hi.
Die Tags sind zur freien Verwendung, d.h. sie haben keinen gezielten Einsatzbereich.
Jeder Programmierer kann diese (z.B. zur Identifizierung) frei verwenden.
Oft lässt man diese einfach durchzählen.
Gruß,
Markus
Popov - Sa 15.03.03 14:21
Es sind schlicht und einfach Integer-Variablen die du zur Verfügung hast. Mehr (oder weniger) nicht. Also kannst du pro Komponente jeder Komponente einen Integer-Wert zuweisen. Diese Variablen werden von der Komponente nicht verarbeitet.
Alibi - Sa 15.03.03 14:26
Hi,
ich würde das mit einem simplen Pythagoras machen:
Die schwarzen Flecken stellen die Objekte dar.
Du hast ja deren X/Y Koordinaten (Left und Top).
Den X-Abschnitt bekommst du so:
XObjektRechts-XObjektLinks
Analog dazu Y:
YObjektOben-YObjektUnten
Dann einfach:
Abstand = Wurzel(X^2+Y^2)
Oder über einfache Vektorrechnung. Den Vektor zwischen den Objekten nehmen und da dann den Betrag:
Abstand = Wurzel ( (x1-x2)^2 + (y1-y2)^2)
torstenheinze - Sa 15.03.03 15:13
vielendank für die antworten.
mimi - Sa 15.03.03 18:10
Warum den schwer wenn es auch einfach geht :)
Also ich würde das problem wiegesagt mit Tags lösen, damit es das viel EINFACHER....
Alibi - Sa 15.03.03 18:19
Und wie willst du das dann anstellen mit den Tags?
tommie-lie - Sa 15.03.03 19:11
tags sind dazu absolut nicht zu gerbauchen! Es geht hier um Koordinaten, das sind immer 2.
Der weg von Alibi ist genau der richtige. Aber ich würde nicht mit Top/Left arbeiten, weil das ja nur die obere und linke Position ist, sondern mit Top+(Height/2) und Left+(Width/2), denn das ist der Mittelpunkt der Objekte. Damit beziehst du die Größe auch noch mit ein.
torstenheinze - Sa 15.03.03 20:04
das wusste ich auch schon vorher
mimi - Sa 15.03.03 21:32
er wollte doch herrausfinden welche panel bei welcher Image liegt oder nicht
Alibi - Sa 15.03.03 21:41
Nein, das Problem ist folgendes:
Mehrere Objekte auf dem Formular. Er will nun herausfinden, zu welchem die Distanz im geringsten ist.
Was da Tags mit zu tun haben weiß der Himmel.
Popov - Sa 15.03.03 22:16
Die Tags haben keine Bedutung. Sie sind nur dazu gedacht gewesen, daß man dort den Abstand der notiert. Mehr nicht. Man könnte auch ein Array nehmen, dann müßte man aber auch notieren zu welchem Panel der Wert gehört. Man könnte natürlich auch mit nur einem Integer arbeiten und immer nur dem Notieren dessen Abstand der kleinste ist. Das mit den Tags war nur eine Idee.
mimi - Sa 15.03.03 23:30
Ja, so währe es einfacher.
Dann habe ich das ja doch richtig verstanden. :shock:
Er hat ja panels auf den jewals eine Image ist richtig ?
Wenn ja könnte man das so lösen.
Quelltext
1: 2: 3:
| Panel1.Tag:=0;Imag1.Tag:=0; Panel2.Tag:=1;Image2.Tag:=1; .... |
der rest dürfe einfach sein...
wulfskin - So 16.03.03 00:43
Diese Beispiel zeigt, wie die angeglickte Komponente nach der nähsten Komponente sucht:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.Button1Click(Sender: TObject); var I: Integer; L, M: Extended; S: String; begin L := 10000000; // großer Wert ;) S := ''; for I := 0 to ComponentCount - 1 do begin if (Components[I] is TControl) and (Components[I] <> Sender) then begin M := sqrt(sqr(TControl(Sender).Left - TControl(Components[I]).Left) + sqr(TControl(Sender).Top - TControl(Components[I]).Top)); if L > M then begin S := TControl(Components[I]).Name; L := M; end; end; end; ShowMessage('Nächste Komponente: ' + S); end; |
DaFox - So 16.03.03 05:22
| tommie-lie hat folgendes geschrieben: |
Aber ich würde nicht mit Top/Left arbeiten, weil das ja nur die obere und linke Position ist, sondern mit Top+(Height/2) und Left+(Width/2), denn das ist der Mittelpunkt der Objekte. Damit beziehst du die Größe auch noch mit ein.
|
Ich dachte es ist nach dem Abstand der Bounds (Außenränder) gefragt!? :roll:
torstenheinze - So 16.03.03 13:12
| mimi hat folgendes geschrieben: |
| Er hat ja panels auf den jewals eine Image ist richtig ? |
nein :wink:
ich habe ein image und sieben (oder acht, je nach dem)panels
@wulfskin ichwerd deinen code ausprobieren, danke
wulfskin - So 16.03.03 14:10
Hallo Torstenheinze!
Ich muss mich nochmal selber korrigieren: Hatte einen Denkfehler. Ich habe nur die Eigenschaften Top und Left zum Vergleich genommen. Das ist natürlich falsch, da alle Komponenten, die rechts davon liegen bevorzugt wurden.
Ich habe das Problem versucht zu lösen, indem ich den Mittelpunkt aller Komponenten gebildet habe und dann die Wegstrecke verglichen habe. Das ist allerdings auch nicht immer richtig.
Um das Problem richtig zu lösen, brauchst du eine etwas aufwendigere Methode, die die Nähe jeder Kante eines Rechtecks zu einem anderen Rechtecks ausrechnet.
Da dies etwas aufwändiger ist, poste ich hier dir mal die Lösung mit den Mittelpunkten. Wenn diese nicht für dein Problem reicht, dann versuch ich dir die andere Methode zu schreiben, wobei ich gerade nicht wirklich weiss, wie diese Funktionieren soll. So hier der Quelltext:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.Button2Click(Sender: TObject); var I: Integer; L, M: Extended; S: String; begin L := 10000000; // großer Wert ;) S := ''; for I := 0 to ComponentCount - 1 do begin if (Components[I] is TControl) and (Components[I] <> Sender) then begin with TControl(Components[I]) do M := sqrt( sqr((Left + Width) / 2 - (TControl(Sender).Left + TControl(Sender).Width) / 2) + sqr((Top + Height) / 2 - (TControl(Sender).Top + TControl(Sender).Height) / 2)); if L > M then begin S := TControl(Components[I]).Name; L := M; end; end; end; ShowMessage('Nächste Komponente: ' + S); end; |
Gruß wulfskin!
torstenheinze - So 16.03.03 15:13
vielen dank für die funktion. :D
wulfskin - So 16.03.03 15:22
| torstenheinze hat folgendes geschrieben: |
| vielen dank für die funktion. :D |
Bitte bitte, aber wie gesagt, sie funktioniert nicht immer richtig. Aber vielleicht reicht sie ja bei deinem Problem!
Gruß wulfskin!
torstenheinze - So 16.03.03 15:26
ne, leider nicht. ich werd die so umschreiben, das die kanten mitbedacht werden. trotzdem vielen dank für diese formel.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!