Fangfunktion

Gast #506581
Lesenswert?

Du meinst das "magnetische Lasso" ?

Dies geht auf den Kontrastwert und sucht sich die Stelle an der der 
Kontast am größten ist.

Den größten Kontast findet man heraus indem man z.B. einen Hochpass über 
das Bild laufen lässt. die hellsten Bildbereiche sind dann diese mit den 
größten Kontrast.
Stichwort: Matrixfilter

Um dann 2 angeklickte Punkte zu verbinden, versucht man über möglichst 
helle Stellen einen Pfad zu bilden (danach evtl noch Kantenglättung usw 
drüber laufen lassen)

Gruß
Roland
Gast #507137
Lesenswert?

Recht einfach geht das mit der "Eikonal-Gleichung", die spuckt dir 
virtuelle Höhenlinien aus, du folgst dann genau einer Höhenlinie und 
hast das Objekt markiert. Wikipedia oder yahoo bringen dich da weiter.
Gast #507483
Lesenswert?

Hallo Fangprogrammierer,

zum Projekt:
für meine Heizungssteuerung erstelle ich eine Menüstruktur in der ich
mich mit zwei Tasten durchs Menü bewege und mit zwei Tasten den
entsprechenden Parameterwert ändere.
Das ganze läuft mit einem Mikrocontroller der die Daten auf ein
2-Zeilen LCD ausgibt.
Zum erstellen des Mikrocontrollerprogramms brauche ich Tabellen in der
die Ausgabetexte und verschiedene Parameter abgelegt sind.
Damit ich diese möglichst übersichtlich und nachvollziehbar gestalten 
kann
verwende ich derzeit das Schaltplanprogramm S-Plan für eine grafische
Darstellung(Siehe Anhang). Daraus erzeuge ich dann über einige Umwege 
meine Tabellen.
Da dieses Programm nicht optimal für meine Anwendung ist, und es auch 
nicht bei einer Steuerung bleibt, denke ich daran mir selbst eines zu 
erstllen.
Meine Vorstellung sieht etwa so aus:
Auf der Zeichenfläche(Formular) plaziere ich Eingabefelder für Text und
Parameter in Form von Editobjekten und verbinde diese mit Linien die
die Beziehungen zwischen den Eingabefeldern herstellen.
Das Zeichnen der Linien(als Vektorgrafik) ist nun kein Problem, nur wie
kann ich auf die gezeichneten Linien wieder zugreifen, damit ich sie
ändern kann.
Programmieren tu ich mit Delphi 5.

Gruß Jürgen
Angehängte Dateien:
Gast #507535
Lesenswert?

Du willst die Linien auswählen, richtig?

Ich schätze das noch nicht so viele Linien zu verwalten sind.
von daher läst sich das vereinfachen:

-Du holst dir die Maus-Koordinaten .
-und rechnest die  Linien in Bildschirmkoordinaten um.
dann prüfst du halt jede Linie, ob Sie ein virtuelles Rechteck (um den 
Mauskursor herum) schneidet .

Die Linienendpunkte wirst du ja irgendwo gespeichert haben um sie dann 
zu Rendern. Die kannst du ja einfach in einem Strucktur-Array verwalten.

Und dieses Array gehst du dann bei Mausedown durch.
Gast #3053054
Lesenswert?

Hallo,
ich hab mich jetzt nach langen Jahren wieder mit dem Thema 
auseinandergesetzt. (Erschreckend wie die Zeit vergeht)
Mein Ansatz geht jetzt dahin, dass ich jeweils den Abstand vom 
Cursorpunkt zu einer Strecke berechne und Auswerte.
Im Anhang ist die Funktion mit einem kleinen Testprogramm (Delphi 5).
Was könnte ich noch optimieren?
Angehängte Dateien:
#3053077
Lesenswert?

Das kommt mir heftig komplex vor.

Eine Möglichkeit:

Man kann für eine beliebige Gerade eine Geradengleichung angeben.
a*x + b*y + c = 0

(die Parameter der geradengleichung a, b, c lassen sich leicht 
bestimmen, denn du kennst ja 2 Punkte auf der Geraden für die die 
Gleichung erfüllt ist)


Der springende Punkt ist: setzt du jetzt einen beliebigen Punkt in diese 
Gleichung ein

    d = a * x_punkt + b * y_punkt + c

dann ist d DIREKT die Normaldistanz des Punktes zur (unendlichen) 
Geraden, die durch a, b, c beschrieben ist.

Ist nun diese Distanz schon größer als die bisher gefundene 
Minimaldistanz, dann brauchst du die Linie gar nicht weiter beachten. So 
kann schon mal nicht näher am Punkt liegen.

Aber die Umkehrung gilt (noch) nicht. Liegt der Punkt näher an der 
unendlichen Geraden, muss er noch lange nicht näher an der begrenzten 
Linie gehen. Hier hilft dann Gramm-Schmidt weiter um den Punkt auf die 
Gerade zu projezieren und nachzusehen, ob der so projezierte Punkt 
zwischen den beiden Punkten liegt oder nicht.
Gast #3054396
Lesenswert?

Karl Heinz Buchegger schrieb:
> Hier hilft dann Gramm-Schmidt weiter um den Punkt auf die

Abstand Testpunkt p zu einer Linie bc (nicht unendliche Gerade) geht 
übrigens so:
1
  #      (c)
2
  #     /
3
  #    /     (p)
4
  #   /
5
  # (b)
6
  # see http://www.geometrictools.com/
7
  #
8
  def distance_line_segment_point_squared(bx, by, cx, cy, px, py)
9
    mx = cx - bx
10
    my = cy - by
11
    hx = px - bx
12
    hy = py - by
13
    t0 = (mx * hx + my * hy).fdiv(mx ** 2 + my ** 2)
14
    if t0 <= 0
15
    elsif t0 < 1
16
      hx -= t0 * mx
17
      hy -= t0 * my
18
    else
19
      hx -= mx
20
      hy -= my
21
    end
22
    return hx ** 2 + hy ** 2
23
  end
Gast #3058053
Lesenswert?

Hallo Stefan,
dein Vorschlag ist genau das, was ich brauche.
Ich habe es nur noch nach ins Pascal übersetzen müssen, aber jetzt 
funktioniert es einwandfrei.

function AbstandPunktStrecke(px,py,bx,by,cx,cy: integer):integer;
var  mx,my,hx,hy,t0 : real;
begin
  mx := cx - bx;
  my := cy - by;
  hx := px - bx;
  hy := py - by;
  t0 := (mx * hx + my * hy)/(sqr(mx) + sqr(my));
  if t0 >= 0 then
    if t0 < 1 then
    begin
    hx := hx - t0 * mx;
    hy := hy - t0 * my;
    end
    else
    begin
      hx := hx - mx;
      hy := hy - my;
      end;
  result := round(sqrt((sqr(hx) + sqr(hy))));
end;

Danke nochmal und
viele Grüße

Jürgen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren