Orbiting center point image maths question

Monkey Forums/Monkey Programming/Orbiting center point image maths question

hobo(Posted 2012) [#1]
I found some AS code and trying to adapt it to monkey.

My aim is to simply have an image rotate around a center point, like it's orbiting a planet.

I have tried a few things and at the moment my image simply stays put.

Here is the code:

Class GameScreen Extends Screen

	Field imageGraphic:GameImage
	
	Field xCenter:Float = SCREEN_WIDTH2
	Field yCenter:Float = SCREEN_HEIGHT2
	Field range:Float = 100
	Field angle:Float = 20
	Field speed:Float = 1.5
        Field imagex:Float
        Field imagey:Float


	Method New()
		name = "Game"
	End
	
	Method Start:Void()
	    imageGraphic = game.images.Find("image")
	End
	
	Method Render:Void()
            Cls
	    imageGraphic.Draw(imagex,imagey)
        End
	
	Method Update:Void()	
	    
            imagex = xCenter + Cos(angle*PI/180) * range;
    	    imagey = yCenter + Sin(angle*PI/180) * range;
    
            angle+=speed;
	End
	
End



Can anyone spot anything wrong with this 'orbit code'. It's probably me making a simple error or maths issue.

Or if im trying to over complicate the problem let me know.

Thanks for any help.


DruggedBunny(Posted 2012) [#2]
Where are imagex and imagey defined? Perhaps they're meant to be something like imageGraphic.x (or imageGraphic.imagex)?


Gerry Quinn(Posted 2012) [#3]
Have you tried increasing the range? It seems to be only one pixel. Perhaps it is orbiting by that much and you haven't noticed!


hobo(Posted 2012) [#4]
Sorry guys had some typos in the initial post.

imagex and imagey now defined at the top.

Tried increasing the range this is also reflected in my original post. The graphic starts at a different position now but still no oribiting.

Strange one.

Is there any debug that could help?


hobo(Posted 2012) [#5]
I did it, speed was to low!

increased it to 20 and its slowly orbiting. Thanks for your suggestions as alwalys sharing helps!


Jesse(Posted 2012) [#6]
Get rid of PI/180 thats for radians and Monkey is doing Degrees already.


Amon(Posted 2012) [#7]
Yeah! As jesse states there's no need for PI/180. Just have 'angle' and increase its value.

When over 359.0 deduct 360 from it.


hobo(Posted 2012) [#8]
Will do, thanks all.


hobo(Posted 2012) [#9]
Tried changing it to angle and I now have two graphics appearing opposite each other spinning around the center.

I presume the imagex/y is being calculated and creating two different positions which is flicking through (its not actually two images)

Does that make sense?

Do I have to separate angles for x and y? (tried that same thing)

New code:


	Method Render:Void()
            Cls
	    imageGraphic.Draw(imagex,imagey)
        End
	
	Method Update:Void()	
	    
            imagex = xCenter + Cos(angle) * range;
    	    imagey = yCenter + Sin(angle) * range;
    
            angle+=speed;
            if (angle > 359.0) angle -= 360
	End
	



NoOdle(Posted 2012) [#10]
try reducing the speed variable to something smaller.


DruggedBunny(Posted 2012) [#11]
Might be worth putting it into a little runnable example and posting that.


dawlane(Posted 2012) [#12]
Something for you to play around with so you can see what happens with different values. You'll have to supply your own images for the sun and earth.
Strict
Import mojo

Function Main:Int()
	New CGame
	Return 0
End Function

Class CGame Extends App

	Field orbitAngle:Float		'Objects current orbits angle
	Field orbitX:Int		'Object thats orbiting positions
	Field orbitY:Int		'Object thats orbiting positions
	Field orbitSpeed:Float		'Objects current orbit speed
	Field orbitDiameter:Float	'Objects orbits diameter
	Field orbitImage:Image		'Orbiting objects image
	
	Field poleX:Int			'Central X axis
	Field poleY:Int			'Central y axis
	Field poleImage:Image		'Central image
	
	Method OnCreate:Int()
		SetUpdateRate(30)
		Self.orbitImage = LoadImage("earth.png", 1, Image.MidHandle)
		Self.poleImage = LoadImage("sun.png", 1, Image.MidHandle)
		
		Self.poleX = DeviceWidth() / 2
		Self.poleY = DeviceHeight() / 2
		Self.orbitDiameter = 100.0
		
		Return 0
	End Method
	
	Method OnUpdate:Int()
	
		Self.orbitX = Self.poleX + Cos(Self.orbitAngle) * Self.orbitDiameter
		Self.orbitY = Self.poleY + Sin(Self.orbitAngle) * Self.orbitDiameter

		Self.orbitAngle += orbitSpeed

		If Self.orbitAngle > 360 Then Self.orbitAngle -= 360
		If Self.orbitAngle < 0 Then Self.orbitAngle += 360
		
		If KeyDown(KEY_A) Then Self.orbitSpeed -= 0.1
		If KeyDown(KEY_Q) Then Self.orbitSpeed += 0.1
		
		If KeyDown(KEY_W) Then Self.orbitDiameter += 1
		If KeyDown(KEY_S) And Self.orbitDiameter > 0 Then Self.orbitDiameter -= 1
		
		If KeyDown(KEY_LEFT) Then Self.poleX -= 4
		If KeyDown(KEY_RIGHT) Then Self.poleX += 4
		If KeyDown(KEY_UP) Then Self.poleY -= 4
		If KeyDown(KEY_DOWN) Then Self.poleY += 4
		
		Return 0
	End Method
	
	Method OnRender:Int()
		Cls

		DrawImage(Self.poleImage, Self.poleX, Self.poleY)
		DrawImage(Self.orbitImage, Self.orbitX, Self.orbitY)

		DrawText("Q and A Keys to Change Orbit speed", 0, 0)
		DrawText("W and S Keys to Change Orbit diameter", 0, 12)
		DrawText("Arrows Keys to move Orbit pole", 0, 24)
		DrawText("OrbitAngle: " + Self.orbitAngle, 0, 36)
		DrawText("OrbitSpeed: " + Self.orbitSpeed, 0, 48)
		DrawText("OrbitDiameter: " + Self.orbitDiameter, 0, 60)

		Return 0
	End Method

End Class




hobo(Posted 2012) [#13]
Thanks for the brilliant help (again) - as mentioned the speed I was running the orbiting at was way too fast.


Gerry Quinn(Posted 2012) [#14]
If you prefer radians, there are also radian versions of all the trig functions, e.g. Cosr(), ACosr() etc. They may also be a little faster if you are doing heavy trig.


hobo(Posted 2012) [#15]
Here is the result of me asking about the orbiting thing. As you can see nothing complex!

DeathSkip -

http://panicbarn.com/deathskip/deathskip.html


Gerry Quinn(Posted 2012) [#16]
LOL, funny game :-D

Great example of a really simple game that is also fun.


Amon(Posted 2012) [#17]
That was cool! :)