Hallo, kann mir jemand einige Tips geben, wie die Fangfunktion in Grafikprogrammen funktioniert.(Links oder Suchbegriffe)
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
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
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.
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
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.
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?
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.
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 |
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.