Punkt in Kreis

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Punkt in Kreis

Beitrag 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
Zuletzt geändert von Konne am 14.07.2005 22:33, insgesamt 1-mal geändert.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Aha thx... werds mal versuchen hab ja ne 1- in Mathe :shock:
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Wie wird Bogenmaß in Winkel umgerechnet?
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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. ;)
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag 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???
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

THX THX THX
:praise: :praise: :praise: :praise: :praise: :praise: :praise: :praise:
Antworten