Seite 1 von 1
Bogen von x nach y
Verfasst: 23.07.2016 16:19
von Then
Vor lauter Zahlen und sonstigem im Kopf stehe ich nun auf dem Schlauch....
ich möchte einen Kreisbogen (1/4 Kreis) von Position x,y nach Position MausX,MausY machen. Den Radius habe ich auch, aber es will nicht so klappen wie ich es brauche.
x,y => .
hier ist die Maus XY => .
Er soll bei "x,y" anfangen und nach rechts einen viertel Kreis bis genau "Maus XY" machen. Wer kann mir helfen....?
Re: Bogen von x nach y
Verfasst: 23.07.2016 19:15
von STARGÅTE
Das Problem ist nicht ganz eindeutig formuliert.
Wenn die StartPosition und die EndPosition frei definirbar sind, und der Radius fix ist, dann ist es nicht immer möglich "nur" ein Viertelkreis zu ziehen. Liegen die Punkte z.B. änder als der Radius ist, würde daraus ein sehr kleiner Kreissektor entstehen.
Wenn der Viertelkreis jedoch fix definiert sein soll, muss es bedingungen für XY von Start und Ende geben, sodass das überhaupt möglich wird, oder sind Ellipsen erlaubt?
Re: Bogen von x nach y
Verfasst: 23.07.2016 20:29
von man-in-black
Hi,
Maus=blau
Im Grunde legen deine Bedingungen (2 Punkte + 1/4 Kreis) die Gestalt des Teilkreises bereits fest. Es ist nurnoch unklar,
auf welcher "Seite" der Mittelpunkt liegt und somit der Bogen verläuft:
Code: Alles auswählen
InitSprite()
InitKeyboard()
InitMouse()
Global mouse.Point
Global start.Point
start\x = 400
start\y = 300
Procedure drawCurve(x1.f,y1.f,x2.f,y2.f,teilung)
radius.f = 0.5*Sqr(Pow(x1-x2,2)+Pow(y1-y2,2))/Sin(#PI/4)
center.Point\x = 0.5*(x2-x1)+x1+0.5*(y1-y2)
center.Point\y = 0.5*(y2-y1)+y1+0.5*(x2-x1)
Circle(center\x,center\y,5,$FF00FF)
startwinkel.f = ATan2(x1-center\x, y1-center\y)+#PI/2
winkel.f = #PI/2/teilung
For i=0 To teilung-1
l1x.f = Sin(winkel*i+startwinkel)*radius+center\x
l1y.f = -Cos(winkel*i+startwinkel)*radius+center\y
l2x.f = Sin(winkel*i+winkel+startwinkel)*radius+center\x
l2y.f = -Cos(winkel*i+winkel+startwinkel)*radius+center\y
LineXY(l1x,l1y,l2x,l2y)
Next
EndProcedure
OpenWindow(0,0,0,800,600,"",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,800,600)
Repeat
ClearScreen(0)
StartDrawing(ScreenOutput())
Circle(start\x,start\y,5,$FFFFFF)
Circle(mouse\x,mouse\y,5,$FF0000)
drawCurve(start\x,start\y,mouse\x,mouse\y,10)
StopDrawing()
FlipBuffers()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
quit = 1
EndIf
ExamineMouse()
mouse\x = MouseX()
mouse\y = MouseY()
event = WindowEvent()
While event
If event = #PB_Event_CloseWindow
quit = 1
Break
EndIf
event = WindowEvent()
Wend
Until quit = 1
End
MFG
MIB
Re: Bogen von x nach y
Verfasst: 24.07.2016 12:55
von Then
Hi, vielen Dank... funktioniert super
....habe vergessen zu erwähnen, das es in 3.93 laufen muss, weil ich es in einem "alten" Programm einbauen muss und da geht ATan2 nicht

Sorry !

Re: Bogen von x nach y
Verfasst: 24.07.2016 14:08
von man-in-black
Hi,
... weil ich es in einem "alten" Programm einbauen muss und da geht ATan2 nicht

Sorry !

Warum dann nicht selbst programmieren? Sind doch einfache trigonometrische Betrachtungen (musst nur bei 0-Division aufpassen)
edit:
http://forums.purebasic.com/german/view ... =3&t=22338
Ich habe da nochmal eine Zeile einfügen müssen. Im 4. Quadranten gab es Probleme:
Code: Alles auswählen
Procedure.f Angle(x.f,y.f)
Protected Angle.f
Angle = ATan(y/x)
If x < 0 : Angle + #PI : EndIf
If y < 0 And x => 0 : Angle + 2*#PI : EndIf ;<<
If x = 0 And y = 0 : Angle = 0 : EndIf
ProcedureReturn Angle*180/#PI
EndProcedure
MFG
MIB