mikrocontroller.net

Forum: PC-Programmierung Fangfunktion


Autor: Jürgen C (Gast)
Datum:

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

Autor: Roland Praml (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen C (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: König Europas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fangprogrammierer (Gast)
Datum:

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

Autor: Jürgen C (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Fangprogrammierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl Heinz Buchegger,

Danke !

Gruß Jürgen

Autor: Salewski. Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
  #      (c)
  #     /
  #    /     (p)
  #   /
  # (b)
  # see http://www.geometrictools.com/
  #
  def distance_line_segment_point_squared(bx, by, cx, cy, px, py)
    mx = cx - bx
    my = cy - by
    hx = px - bx
    hy = py - by
    t0 = (mx * hx + my * hy).fdiv(mx ** 2 + my ** 2)
    if t0 <= 0
    elsif t0 < 1
      hx -= t0 * mx
      hy -= t0 * my
    else
      hx -= mx
      hy -= my
    end
    return hx ** 2 + hy ** 2
  end


Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und ist auch noch um den Faktor 3 schneller als mein Rumgegurke vom 
19.02.13

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.