Einzelnen Beitrag anzeigen

mare_crisium

Registriert seit: 6. Nov 2005
17 Beiträge
 
Delphi 5 Standard
 
#14

Re: Schnittpunkt einer Canvas.LineTo mit Komponente TButton

  Alt 26. Nov 2005, 20:43
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:
     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;
Die Koordinaten des Schnittpunktes werden in der an die lokale Variable lschnittPunkt (vom Typ Tvektor2) übergeben. Die Funktion "schnittPunktExists" wir so aufgerufen:

Code:
function TForm1.schnittPunktExists(     s1,s2      : Tstrecke;
                                    var schnittPkt : Tvektor2 ) : boolean;
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.

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:
  ...
  for li:=0 to 3 do begin
  ...
alle vier Seiten des Controls eine nach der anderen auf Schnittpunkte geprüft werden. Und wenn einer gefunden wird, d.h. wenn
Code:
  schnittPunktExists = true
dann wird er auch gezeichnet.

Hoffentlich habe ich das jetzt besser erklärt und die Verwirrung nicht noch gesteigert!

mare_crisium
  Mit Zitat antworten Zitat