Bogen von x nach y

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Bogen von x nach y

Beitrag 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....?
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Bogen von x nach y

Beitrag 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?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Bogen von x nach y

Beitrag 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
(hab alles, kann alles, weiß alles!!^^)

Bild
Benutzeravatar
Then
Beiträge: 247
Registriert: 06.09.2004 13:26
Wohnort: Siegen

Re: Bogen von x nach y

Beitrag 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:
PB 5.62 / Windows 11 64Bit (i5/32GB/240GB-SSD+3TB-HDD/1050GTX4GB) / 27" Multitouch Monitor

... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Bogen von x nach y

Beitrag 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
(hab alles, kann alles, weiß alles!!^^)

Bild
Antworten