Seite 1 von 1

Punkt in Kreis

Verfasst: 14.07.2005 22:20
von Konne
Hi,
Ich wollte mir ein programm programmieren in dem ein Punkt in einem Kreis gemalt wird wobei dieser Punkt nicht aus dem Kreis herausdarf und der Maus folgen soll.
Dies tut auch schon ganz gut mit folgendem Code:

Code: Alles auswählen

OpenWindow(0,0,0,300,300,#PB_Window_ScreenCentered|#pb_Window_Systemmenu,"TEST") 

InitSprite()
OpenWindowedScreen(WindowID(),0,0,300,300,0,0,0)

Repeat

If WindowEvent()=#pb_eventclosewindow
End
EndIf

FlipBuffers()
ClearScreen(255,255,255)
StartDrawing(ScreenOutput())

#WM_LBUTTONDOWN

a=Sqr(Pow((WindowMouseX()-150),2)+Pow((WindowMouseY()-150),2))

If a < 100
y=WindowMouseY()
x=WindowMouseX()
EndIf

Circle(150,150,100)
Circle(x,y,4,RGB(255,0,0))   
StopDrawing()
ForEver
Das einzige Problem das ich habe ist ,das wenn die Maus auserhalb des Kreises ist, der Punkt sich garnichtmehr bewegt obwohl er eigendlich der maus folgen sollte. (Also so follgen das er zwar im Kreis bleibt aber das wenn die Maus zB hoch geht er ihr auch nachgeht)

Ich hoff mal das ihrs versteht... Wenn nicht könnt ihr euch auch den Code anschauen und ihr werdet ziemlich schnell mein Prob bemerken.

mfg Konne

:D

Verfasst: 14.07.2005 22:29
von Ynnus
Zunächst benötigst du eine Variable welche den Abstand er Maus zum Mittelpunkt beinhaltet. Ist der Abstand der Maus noch innerhalb des Kreises, normal anzeigen, wie du es schon machst. Ist es nicht so, setze den Abstand auf den Radius des Kreises (und damit den maximalen Abstand bevor der Punkt den Kreis verlassen würde) und berechne mittels Winkelfunktionen Sinus, Cosinus und Tangens die Position des Punktes bei gegebenem Radius, dem Maximalabstand.
Dazu brauchst du wohl noch den Winkel von Maus zum Mittelpunkt, bezogen auf eine horizontale Linie durch den Mittelpunkt. (Also wie in einem Koordinatensystem wo 0,0 beim Mittelpunkt ist).
Mit diesem Winkel und der Hypothenuse (dem Radius) kannst du nun die Seiten und damit die X- und Y-Position des Punktes errechnen.

Verfasst: 14.07.2005 22:34
von Konne
Aha thx... werds mal versuchen hab ja ne 1- in Mathe :shock:

Verfasst: 14.07.2005 22:45
von Konne
Wie wird Bogenmaß in Winkel umgerechnet?

Verfasst: 14.07.2005 22:51
von bluejoke
uff.
Müsste proportional sein:
2pi = 360°

aber sicher bin ich mir nicht...

stimmt sogar:
http://de.wikipedia.org/wiki/Bogenma%C3%9F#Umrechnung

Verfasst: 14.07.2005 22:51
von Ynnus
EIn volles Bogenmaß umfass 2*PI.
Demnach ist Bogenmaß = 2*PI * Winkel / 360.
Gekürzt: Bogenmaß = PI * Winkel / 180.
Die Formel musst du nur noch umstellen nach Winkel. ;)

Verfasst: 14.07.2005 22:54
von Konne

Code: Alles auswählen

OpenWindow(0,0,0,300,300,#PB_Window_ScreenCentered|#pb_Window_Systemmenu,"TEST") 

InitSprite()
OpenWindowedScreen(WindowID(),0,0,300,300,0,0,0)

Repeat

If WindowEvent()=#pb_eventclosewindow
End
EndIf

FlipBuffers()
ClearScreen(255,255,255)
StartDrawing(ScreenOutput())

#WM_LBUTTONDOWN

a=Sqr(Pow((WindowMouseX()-150),2)+Pow((WindowMouseY()-150),2))


If a < 100
y=WindowMouseY()
x=WindowMouseX()
Else

Mauswinkel=ATan(WindowMouseX()-150/WindowMouseY()-150)
y=Sin(Mauswinkel)*a
x=Cos(Mauswinkel)*a

EndIf

Circle(150,150,100)
Circle(x,y,4,RGB(255,0,0))   
StopDrawing()
ForEver
Warum geht das nicht???

Verfasst: 14.07.2005 23:26
von Ynnus
Fehler 1 ist einmal, dass du den Winkel in einer Ganzzahl speichern willst, dieser aber sehr präzise sein muss und sich im 0,xxxx bereich aufhält.

Ansonsten hab ich mal selbst was reingebastelt, sieht jetzt so aus:

Code: Alles auswählen

#PI = 3.14159

Procedure get_angle(start_x.f, start_y.f, end_x.f, end_y.f)
 Protected angle.w
 Protected delta_x.w
 Protected delta_y.w

  delta_x = start_x - end_x
  delta_y = start_y - end_y
  angle = (ATan(delta_y / delta_x) * 180 / #PI) * (-1)        ;Der Winkel zum Object
 
  If angle < 0
    angle = 180 + angle
  EndIf
  If start_y < end_y       ;Negativer Winkel - also 180 dazu damit es volle 360 Grad werden!
    angle = 180 + angle
  EndIf
  If angle = 0 And start_x > end_x
    angle = 180
  EndIf
  If angle = 180 And start_x < end_x
    angle = 0
  EndIf

  ProcedureReturn angle
EndProcedure

OpenWindow(0,0,0,300,300,#PB_Window_ScreenCentered|#pb_Window_Systemmenu,"TEST")

InitSprite()
OpenWindowedScreen(WindowID(),0,0,300,300,0,0,0)

Repeat

If WindowEvent()=#pb_eventclosewindow
End
EndIf

FlipBuffers()
ClearScreen(255,255,255)
StartDrawing(ScreenOutput())

#WM_LBUTTONDOWN

a=Sqr(Pow((WindowMouseX()-150),2)+Pow((WindowMouseY()-150),2))

Circle(150,150,100)

If a < 100
    y=WindowMouseY()
    x=WindowMouseX()
    Circle(x,y,4,RGB(255,0,0))
Else
    radius = 100
    Mauswinkel.f= get_angle(150, 150, WindowMouseX(), WindowMouseY())
    Debug mauswinkel
    y=Sin(#PI*Mauswinkel/180)*radius
    x=Cos(#PI*Mauswinkel/180)*radius
    Circle(150 + x,150 - y,4,RGB(255,0,0))
EndIf


StopDrawing()
ForEver 
Meine Prozedur oben liefert den Winkel im Gradmaß, daher muss nachher beim Sinus und Cosinus wieder in Bogenmaß umgerechnet werden. Außerdem musste der Ursprung auf 150, 150 gelegt werden, denn da beginnt ja das Koordinatensystem. Wenn du das mit dieser Zeile "Mauswinkel=ATan(WindowMouseX()-150/WindowMouseY()-150)" machen wolltest, dann fehlen da zumindest schonmal die Klammern, sonst jrechnet der 150 / windowmousey() und nicht das, was du wohl wolltest. Aber ich habs mit Klammern nicht groß weiter getestet, da ich's ja ganz umgeschrieben habe.

Verfasst: 14.07.2005 23:29
von Konne
THX THX THX
:praise: :praise: :praise: :praise: :praise: :praise: :praise: :praise: