![]() |
Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Hallo,
ich zeichne eine Linie per Canvas.LineTo von einem Punkt zum anderen. Jetzt würde ich aber gerne feststellen, ob sich auf diesem Weg eine andere Komponente, sagen wir ein Button befindet, der geschnitten wird. Falls dies der Fall ist würde ich nämlich gerne den Weg umleiten. Wie kann ich das denn überprüfen ? Gruß, Nico |
Re: Canvas LineTo: Überschneidung feststellen
Hi,
wenn sich ein Control auf dem Canvas befinden kann, ist ei wohl eine von TWinControl abgeleitete Komponente. Somit solltest du mit der Funktion ControlAtPos ans Ziel kommen. Cu, Frank |
Re: Canvas LineTo: Überschneidung feststellen
Wie könnte denn eine Lösung des Problems aussehen, hättest du code ?
|
Re: Canvas LineTo: Überschneidung feststellen
Auf was zeichnest du denn?
Frank |
Re: Canvas LineTo: Überschneidung feststellen
Auf eine PaintBox
|
Re: Canvas LineTo: Überschneidung feststellen
[/delphi]Hi Scorpion,
da kannst du noch etwas tüfteln. Ich hab mal in folgendem Beispiel auf dem Canvas eine Forms einen Test gemacht:
Delphi-Quellcode:
Es geht nur, wenn das Verhältnis der Punkte - hier oben rechts / unten Links verglichen wird.
function TForm1.LinieDurchControl(AControl: TControl): Boolean;
Var LinieX: Integer; LinieY: Integer; WertLinie: Extended; WertBtnTopRight: Extended; WertBtnBottomLeft: Extended; begin Result := False; Liniex := StrToInt(Edit1.Text); LinieY := StrToInt(Edit2.Text); WertLinie := LinieX / LinieY; WertBtnTopRight := AControl.BoundsRect.Right / AControl.BoundsRect.Top; WertBtnBottomLeft := AControl.BoundsRect.Left / AControl.BoundsRect.Bottom; if (WertLinie < WertBtnTopRight) and (WertLinie > WertBtnBottomLeft) then Result := True; Canvas.LineTo(LinieX, LinieY); end; Die Linie muss im Beispiel von oben links (0,0) beginnen. Ist die Linie frei, musst du einen 0 - Punkt ermitteln und unterscheiden, in welche Richtung die Line geht. Wie gesagt, musst noch etwas tüfteln. Du musst dann alle Controls des Parent der Paintbox durchlaufen und testen. Viel Glück! Frank |
Re: Canvas LineTo: Überschneidung feststellen
Hi,
das sieht ja schon nicht schlecht aus. Nur wie kann ich die effektiven Schnittpunkte mit der Komponente bestimmen, so dass damit arbeiten kann. Würde nämlich gerne einen Weg um die Komponente zeichnen. |
Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Liste der Anhänge anzeigen (Anzahl: 2)
Scorpion,
guck' doch mal die angefügte unit an. Da habe ich versucht, die mathematisch präzise Methode zur Schnittpunkt-Bestimmung zu programmieren und zu erklären. Die zugehörige exe-Datei ist auch dabei. Hilft Dir das? mare_crisium |
Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Hi,
vielen Dank, ich schaus mir gleich mal an... Aber könntest du bitte noch die Projektdateien von dem Bsp. posten, das wäre cool |
Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Scorpion,
wie geht'n das? Hab' ich noch nie gemacht! mare_crisium |
Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Hi,
pack doch alle Projektdateien zu einer zip und füge diese Datei dann hier ein... |
Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Liste der Anhänge anzeigen (Anzahl: 4)
Scorpion,
nee, meine WinZip-Version lässt mich nichts einpacken. Ich füge einfach alle Dateien als Anhang bei. Ist ja nicht soo viele MB. mare_crisium |
Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Boah, irgendwie blicke ich bei deinem Code überhaupt nicht durch... Wieso wird denn nur 1 Schnittpunkt gekennzeichnet, es gibt doch immer 2, das heisst auf 2 Kanten der Komponente. Und wie wird der Schnittpunkt überhaupt bestimmt, ich sehe nur eine lokale Variable, der kein Wert in der Procedure markSchnittPunkt zugewiesen wird... :(
|
Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Scorpion,
tut mir leid, wenn ich das Ganze zu kompliziert gemacht habe. Mal sehen, ob ich das noch richten kann. Also, das hier ist die Stelle, an der ich die Schnittpunktberechnung aufrufe und den Schnittpunkt in die paintBox einzeichne:
Code:
Die Koordinaten des Schnittpunktes werden in der an die lokale Variable lschnittPunkt (vom Typ Tvektor2) übergeben. Die Funktion "schnittPunktExists" wir so aufgerufen:
if schnittPunktExists(lstrecke,lkante,lschnittPunkt)
then begin lp:=pbxMain.screenToClient(vekt2ToPoint(lschnittPunkt)); (* Der Schnittpunkt wird auf dem Bildschirm mit einem Quadrat markiert. *) with pbxMain.canvas do begin brush.color:=clRed; fillRect(rect(lp.x-lmarkWidth-1,lp.y-lmarkWidth-1,lp.x+lmarkWidth-1,lp.y+lmarkWidth-1)); end; end;
Code:
D.h., weisst dem Resultat einen Wert vom Typ Boolean zu und dem variablen Parameter schnittPkt einen Wert vom Typ Tvektor2. Das hast Du vielleicht übersehen; ist auch eigentlich kein guter Programmierstil.
function TForm1.schnittPunktExists( s1,s2 : Tstrecke;
var schnittPkt : Tvektor2 ) : boolean; In der übernächsten Zeile rechne ich die Variable "lschnittPunkt" in eine lokale Variable "lp" vom Typ Tpoint um. Das muss sein, weil man die Zeichenfunktionen des Canvas ja nur mit ganzzahligen Koordinaten ansprechen darf. So, und den Punkt zeichne ich als Rechteck auf die paintBox, nämlich mit fillRect. Das Rechteck, das gefüllt wird, hat den Punkt "lp" als Mittelpunkt. Deshalb taucht "lp.x" und "lp.y" mehrmals in der Klammer von "fillRect" bzw. von "rect" auf. Wenn Du die "exe"-Datei zum Laufen kriegst, dann siehst Du auch zwei markierte Schnittpunkte. Das kommt daher, dass mit der Schleife
Code:
alle vier Seiten des Controls eine nach der anderen auf Schnittpunkte geprüft werden. Und wenn einer gefunden wird, d.h. wenn
...
for li:=0 to 3 do begin ...
Code:
dann wird er auch gezeichnet.
schnittPunktExists = true
Hoffentlich habe ich das jetzt besser erklärt und die Verwirrung nicht noch gesteigert! mare_crisium |
Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, das habe ich soweit verstanden, aber ich habe immer noch ein Problem. Anbei findest du eine Skizze, da wird mit ein Schnittpunkt gezeichnet, das ist gut, aber ich habe einen Kreis darum gemacht, wo ich eigentlich auch noch einen erwartet hätte.
Warum fehlt dieser ? |
Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton
Liste der Anhänge anzeigen (Anzahl: 1)
Scorpion,
prima, dass ich verständlich erklärt habe. Also, an der Stelle, die Du markiert hast, ist tatsächlich ein Schnittpunkt eingezeichnet. Ich habe nur die Markierung (lokale Konstante "lmarkWidth") zu klein gemacht. Dieser Antwort füge ich eine neue Version der "exe"-Datei an, bei der die Markierung grösser ist, so dass man sie besser sieht. Ausserdem, wenn die "exe"-Datei bei Dir läuft, dann verändere doch mal die Werte in den Groupboxen auf der linken Seite! Das kannst Du erreichen, indem Du entweder auf die hoch- und runter-Knöpfchen rechts neben den Zahlen drückst, oder indem Du Zahlenwerte direkt in die Zahlenfelder einschreibst (negative Zahlen akzeptiert das Programm nicht). Du wirst dann sehen, wie sich die Anfangs- und Endpunkte der Geraden verschieben und auch die Schnittpunkte rund um das Control herumwandern. Sag' mal, ob das klappt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz