Forum: PC-Programmierung Fangfunktion


von Jürgen C (Gast)


Lesenswert?

Hallo,
kann mir jemand einige Tips geben, wie die Fangfunktion in 
Grafikprogrammen
funktioniert.(Links oder Suchbegriffe)

von Roland Praml (Gast)


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

von Jürgen C (Gast)


Lesenswert?

Hallo Roland,
ich meinte die Eigenschaft des Kursors, das er beim Klicken in der Nähe
eines Punktes oder eines Objektes dieses markiert.

Gruß Jürgen

von König Europas (Gast)


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.

von Fangprogrammierer (Gast)


Lesenswert?

Ich kann die genau sagen wie das geht.
Nur für was für Projekt brauchst du das ?

von Jürgen C (Gast)


Angehängte Dateien:

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

von Fangprogrammierer (Gast)


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.

von Jürgen (Gast)


Angehängte Dateien:

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?

von Karl H. (kbuchegg)


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.

von Jürgen (Gast)


Lesenswert?

Hallo Karl Heinz Buchegger,

Danke !

Gruß Jürgen

von Salewski. Stefan (Gast)


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

von Jürgen (Gast)


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

von Jürgen (Gast)


Lesenswert?

und ist auch noch um den Faktor 3 schneller als mein Rumgegurke vom 
19.02.13

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.