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 :bounce:

....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 ! :oops:

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 ! :oops:
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