AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Nächstes Control zu einem Punkt finden

Ein Thema von argonix · begonnen am 24. Sep 2009 · letzter Beitrag vom 24. Sep 2009
Antwort Antwort
Benutzerbild von argonix
argonix

Registriert seit: 28. Feb 2007
257 Beiträge
 
Delphi 2005 Personal
 
#1

Nächstes Control zu einem Punkt finden

  Alt 24. Sep 2009, 19:30
Hallo!
Wie kann ich, wenn ich einen Punkt vorgebe das Control finden, welches am nächsten zu diesem Punkt liegt?
(Möglichst nah an diesem Punkt ist)
Ich habe es mit FindControlAtPosition() probiert, diese Lösung ist aber unglaublich langsam und ineffizient. Geht das eleganter als in einem Bereich jeden Punkt einzeln abzufragen?
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#2

Re: Nächstes Control zu einem Punkt finden

  Alt 24. Sep 2009, 19:32
Idee:

Leg dir eine Liste an. In dieser speicherst du zu jedem Control die Koordinaten links oben und die rechts unten. Und dann musst du nur noch durch die Liste iterieren, und gucken, ob sich dieser Punkt in dem Rechteck befindet.

Funktioniert mit jeder IDE...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von argonix
argonix

Registriert seit: 28. Feb 2007
257 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Nächstes Control zu einem Punkt finden

  Alt 24. Sep 2009, 19:39
Hmm... Ich will nicht schauen, ob das Control da ist, sondern ob es nah ist. (Am besten ohne extra-Liste)
Das heist, das Control welches die kleinste XY-Differenz zu den Koordinaten des Punktes hat soll zurückgegeben werden.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Nächstes Control zu einem Punkt finden

  Alt 24. Sep 2009, 19:57
Dann must du immer und immer wieder den Abstand vom Punkt zu allen Controls ausrechnen, und den kleinsten davon nehmen. Das erschwert sich hierbei ggf, je nach dem wie genau du es haben magst.
Das einfachste wäre es den Abstand zum Mittelpunkt eines Controls zu berechnen, der ist ja schnell gefunden (zumindest bei rechteckigen). Aufwendiger wird es, wenn du die Kanten haben willst, dann musst du nämlich Abstände von Punkt zu Strecken berechnen, bzw. genauer: Punkt zu Gerade und dann noch bestimmen ob der Fußpunkt auch im Segment der Geraden ist, dass die Strecke darstellt. Zudem bekommst du dann Abstände >0 wenn du innerhalb des Controls bist, d.h. das müsste ggf. gesondert behandelt werden.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von argonix
argonix

Registriert seit: 28. Feb 2007
257 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Nächstes Control zu einem Punkt finden

  Alt 24. Sep 2009, 20:07
Sie sind alle rechtecking oder rund, das ist kein Problem. Schade, dann geht es wohl nicht ohne listen und Sortierfunktion.
Aber ich glaube, die kriege ich noch etwas intelligenter hin.
Vielen Dank für die Hilfe!
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Nächstes Control zu einem Punkt finden

  Alt 24. Sep 2009, 22:36
Wenn du recht viele Elemente hast, bzw. das ganze wirklich flott sein muss, schau dir mal Bei Google suchenQuadtrees (2D-Variante von Octrees) an. Wobei auch schon eine einfache Segmentierung der Fläche + Zuordnung der Komponenten zu den Segmenten hier ausreichen sollte, du wirst vermutlich eher weniger als tausende von Controls haben
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

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

Re: Nächstes Control zu einem Punkt finden

  Alt 24. Sep 2009, 22:45
Probier mal Folgendes

Delphi-Quellcode:
//**
//** Gibt den am naheliegendsten Control zurück
//** - wobei die Distanz ausgehend vom Mittelpunkt
//** - der einzelnen Controls berechnet wird
//**
function NearestControl(const Position: TPoint; const MainControl: TControl): TControl;
var
  i, j: Integer;
  lDis, cDis: Single; // last distance, current distance
  function DistanceTo( Control: TControl ): Single;
  var
    x, y: Single;
  begin
    with Control do
    begin
      x := Left + ( Width div 2 ) - Position.X;
      y := Top + ( Height div 2 ) - Position.Y
    end;
    Result := SQRT( x*x + y*y );
  end;
begin
  Result := NIL;
  if MainControl.ComponentCount = 0 then
    Exit;
  j := -1;
  Result := TControl( MainControl.Components[0] );
  lDis := DistanceTo( Result );
  if MainControl.ComponentCount < 2 then
    Exit;
  for i := 1 to MainControl.ComponentCount - 1 do
  begin
    cDis := DistanceTo( TControl( MainControl.Components[i] ) );
    if cDis < lDis then
    begin
      lDis := cDis;
      j := i;
    end;
  end;
  if j > 0 then
    Result := TControl( MainControl.Components[j] );
end;

//**
//** Beispiel: Klatsch ein paar Controls auf die Form, und füge diesen Code in OnMouseDown() ein!
//**
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
var
  c: TControl;
begin
  c := NearestControl( Point( X, Y ), Form1 );
  if Assigned( c ) then
    c.Enabled := not c.Enabled;
end;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:31 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