Hi,
ich habe jetzt einfach mal q&d (auf Events und Co bezogen) etwas zusammengeschrieben.
Lass dich nicht von der Vektoranlehnung irritieren, die macht den Code eigentlich sogar übersichtlicher/verständlicher.
Die mathematische Erklärung findest du auf diversen Seiten besser erklärt, als ich es könnte.
Der Code soll dir nur beim "Spielen" helfen.
//guck dir am besten erst die letzte Procedure an und hangel dich dann aufwärts
Code: Alles auswählen
InitSprite()
InitKeyboard()
InitMouse()
Enumeration window
#DB_Window_main
EndEnumeration
Structure db_struc_mouse
mx.i
my.i
EndStructure
Global db_mouse.db_struc_mouse
Structure point2
x.f
y.f
EndStructure
Procedure length(p1x.f,p1y.f,p2x.f,p2y.f)
ProcedureReturn Sqr(Pow(p2x-p1x,2)+Pow(p2y-p1y,2)) ;Pytagoras, um aus der Differenz in x und y die Länge der Resultierenden zu bekommen
EndProcedure
Procedure calcRate(*out_rate.point2,p1x.f,p1y.f,p2x.f,p2y.f) ;Steigung in den Dimensionen x,y getrennt (a la Vektor)
*out_rate\x = p2x-p1x ;Differenz in x-Richtung
*out_rate\y = p2y-p1y ;Differenz in y-Richtung
EndProcedure
Procedure calcNormOrthRate(*out_rate.point2,p1x.f,p1y.f,p2x.f,p2y.f) ;Senkrechte zur Steigung der beiden Streckenpunkte (genormt s.unten)
*out_rate\y = (-p2x+p1x)/length(p1x.f,p1y.f,p2x.f,p2y.f)
*out_rate\x = (p2y-p1y)/length(p1x.f,p1y.f,p2x.f,p2y.f)
EndProcedure
Procedure DrawOrthLines(*orthRate.point2,px.f,py.f,lengthOrth.f) ;hier einfach die halbe Steigung*Wunschlänge "vor" und "hinter" die Maus-/Fixpunktposition als Streckenstart ermitteln
LineXY(px-lengthOrth/2**orthRate\x,py-lengthOrth/2**orthRate\y,px+lengthOrth/2**orthRate\x,py+lengthOrth/2**orthRate\y,$00FF00)
EndProcedure
Procedure drawLines(px.f,py.f,lengthOrth.f)
LineXY(db_mouse\mx,db_mouse\my,px,py,$FF00FF) ;oder auch hier mit calcRate und line arbeiten
calcNormOrthRate(@orthRate.point2,db_mouse\mx,db_mouse\my,px,py) ;aus der Mausposition und einer fixen Position (hier Fenstermitte) die Steigung + die Orthogonale (Senkrechte) ausrechnen
;die Steigung ist zudem genormt (Länge des Vektors ist 1), damit man einfach seine Wunschlänge draufmultiplizieren kann
DrawOrthLines(@orthRate.point2,db_mouse\mx,db_mouse\my,lengthOrth) ;eine Linie von der Maus aus zeichnen
DrawOrthLines(@orthRate.point2,px,py,lengthOrth) ;eine Linie von dem fixen Punkt aus zeichnen
EndProcedure
OpenWindow(#DB_Window_main,0,0,800,600,"",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#DB_Window_main),0,0,800,600,#True,0,0,#PB_Screen_NoSynchronization)
Repeat
While WindowEvent()
Wend
ClearScreen($AAAAAA)
StartDrawing(ScreenOutput())
Box(db_mouse\mx,db_mouse\my,5,5,$0000FF)
drawLines(400,300,100)
StopDrawing()
FlipBuffers()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
db_quit = #True
EndIf
ExamineMouse()
db_mouse\mx = WindowMouseX(#DB_Window_main);MouseX()
db_mouse\my = WindowMouseY(#DB_Window_main);MouseY()
Until db_quit = #True