Computer Science Canada Ball move in orbit

 Author: sakura [ Sun May 30, 2004 8:03 pm ] Post subject: Ball move in orbit I was trying to move the ball in orbit.......... but i'm wondering if there's more efficient way than drawing it and erasing it everytime it moves Thx a lot

 Author: SuperGenius [ Sun May 30, 2004 8:20 pm ] Post subject: if you have oot 3.x you can use sprites but that version is pain in the ass because of no syntax colouring, some new commands are unsupported, and the fact that it just sucks.

 Author: AsianSensation [ Sun May 30, 2004 8:47 pm ] Post subject: well, if you know the equation of the ball's movement, is it a circle? or an ellipse? You can just model the math behind it. like x^2 + y^2 = r^2 and x^2/a^2 + y^2/b^2 = 1 sub values into those equations will be the easiest way of modelling orbits. for drawing and erasing, it's the only way. Though if you have 4.0.3 or above, View.Update is good. and 4.0.5 gives View.UpdateArea, which is even better.

Author:  Flashkicks [ Mon May 31, 2004 8:08 am ]
Post subject:

Sensation; That is some very trippy stuff you got there..LOL.. i am going to play around with it and see if i can get anything to orbit. i have always wanted to make something orbit but never really understood the physics of how to actually PROGRAM it.. Maybe you could explain these numbers and whatnot.. . Would be nice. Either way- I shall go experiment ~Flashkicks

<<EDIT>>
Okay- this is a few minutse later when i tried experimenting with those equations and I can NOT understand HOW they work.. i mean.. I dontthink first of all that i am typing NEARLY enuff code as to what may be needed- but then again even some of the most comlpex programs require little code.. This is what i have;
 code: %  "x^2 + y^2 = r^2"    and    "x^2/a^2 + y^2/b^2 = 1" var x, y, r : int x := 5 y := 5 r := 20 for i : 1 .. 20 r** = x** + y** drawline (x, y, x + i, y + i, 12) end for
Do you think you could help me with my coding or perhaps supply a sample of your own Working code??.. I know this thread wasnt my business or whatnot but I have been wondering about orbit for AGES now.. I dont really want to miss this chance to have someone explain to me how they work and the code for source and whatnot.. Anyhoo- Would be much appreciated....
~Flashkicks

btw- My Turing here at school doesnt recognize the "^" . Eg. x^2 .. hence; that is why i have "x**" <--bcuz that is how I am use to doing it. Does this create a problem??  Author: guruguru [ Mon May 31, 2004 3:24 pm ] Post subject: You can only use "**" for anything to the power of someting else. YOu could just multiply the number by itself for squaring things. Quote:x^2 + y^2 = r^2 This is the equation of a circle (with center at origin). r = radius x = the x point y = the y point Changing the x (or y) and then changing the y (or x) to the appropriate value would make it orbit in a circle. Quote:x^2/a^2 + y^2/b^2 = 1 This is the equation of an ellipse (with center at origin). x = the x point y = the y point a = distance out on the x axis from origin b = distance out on the y aixs from origin Changing a and b will change the stretch of the ellipse. If you made a extremely large, it would orbit in almost a horizontal line. If you mande b really large, it would orbit pretty much vertically. To move the the shape, change the x and y to appropriate values. Same idea with the previouse equation. Hope that helped :p.

 Author: Paul [ Mon May 31, 2004 3:32 pm ] Post subject: Im interested in this too, but never understood it completely, post a example code? maybe a code that draws a circle using drawdot

Author:  guruguru [ Mon May 31, 2004 3:54 pm ]
Post subject:

 code: var x, y, temp : real var a, b, r : int var centre : int := 100 % th %%%%%% CIRCLE %%%%%%% r := 50 x := 50 % Draw cicle by dots. % Equation: (x - centre)**2 + (y-centre)**2 = r**2 % Since center is not 0, we have to incude the little minus thingy, just accept it :D loop     temp := r ** 2 - (x - centre) ** 2   % The equation above arranged above to isolate y squared at origin     exit when temp < 0                   % You can't take a square root of a negative number (i :D)     y := sqrt (temp) + centre% Find y... and move it to the appropriate center     drawdot (round (x), round (y), black) % Draw the dot     x += .1                              % Increase x by a random number end loop %%%%%% ELLIPSE %%%%%%% centre := 250 a := 100 % width b := 50 % height x := centre - a % Draw ellipse by dots. % Equation: (x - centre)**2 / a**2 + (y-centre)**2 / b**2 = r**2 % (y-centre)**2 / b**2 := 1 - (x - centre)**2 / a**2 % (y-centre)**2 := b**2 - ((x - centre)**2 / a**2) * b**2 % (y-centre) := sqrt (b**2 - ((x - centre)**2 / a**2) * b **2) %  Since center is not 0, we have to incude the little minus thingy, just accept it :D loop     temp := b ** 2 - ((x - centre) ** 2 / a ** 2) * (b ** 2) % The equation above arranged above to isolate y squared at origin     exit when temp < 0                      % You can't take a square root of a negative number (i :D)     y := sqrt (b ** 2 - ((x - centre) ** 2 / a ** 2) * (b ** 2)) + centre            % Find y... and move it to the appropriate center     drawdot (round (x), round (y), black)   % Draw the dot     x += .1                                 % Increase x by a random number end loop

A quick example. I'll add the ellipse stuff in a second.

EDIT: OK everything is there. If you have questions ask away!

Author:  Paul [ Mon May 31, 2004 4:48 pm ]
Post subject:

well, about the drawing circle code, if I add
 code: r := 50 y := 50 loop     temp := r ** 2 - (y - centre) ** 2   % The equation above arranged above to isolate y squared at origin     exit when temp < 0                   % You can't take a square root of a negative number (i :D)     x:= sqrt (temp) + centre% Find y... and move it to the appropriate center     drawdot (round (x), round (y), black) % Draw the dot     y += .1                              % Increase x by a random number end loop

to it, it draws 3/4 of a circle, if I understood the concept, I would know how to figure out how to draw a full circle, but I don't... really know the concept, specifically the equations, what I know so far is:
the equation is the equation of a circle

 code: temp := r ** 2 - (x - centre) ** 2 %and y := sqrt (temp) + centre%

isolates and solves for y while x is changing and moves it to the correct spot relative to the center?, therefore the resulting x, y values because of the equation would form a circular shape.
but I don't really understand what center is for, except that it only works when the value of center is <x+r or y+r and is > the value of x or y.

Author:  guruguru [ Mon May 31, 2004 5:15 pm ]
Post subject:

Quote:
isolates and solves for y while x is changing and moves it to the correct spot relative to the center?, therefore the resulting x, y values because of the equation would form a circular shape.

Yep. Think of a circle. Lets say we start at the left side. Every second we move .1 to the right. Obviously, if we want to stay on the circles path, we would have to walk farther up. That is why we calculate Y. The reason I use a temp variable... as so...

 code: temp := r ** 2 - (x - centre) ** 2 exit when temp < 0                      y := sqrt (temp) + centre

...is to make sure that we dont try to find the square root of a negative number. We will get a negative number when X is greater than or less than the two horizontal extremes of the circle. Since the circles path does not path those extremes, there is no possible way there can be any point on the circle out there. Hence we receive a negative number. (We could with complex and imaginary but not here :p.)

If you wanted to make a full circle, you would have to make a test to see if X has passed the extremities of the circle, and if it has, start reducing X instead of increasing it. We would also have to make y the negative of what the above gives us.

Quote:
but I don't really understand what center is for, except that it only works when the value of center is <x+r or y+r and is > the value of x or y.

Imagine the cartesian plane. The origin is (0, 0). Lets say radius is 50. And center is the origin. Our X in this example starts at 50. So when X = -50, Y = 0. When X = -25, Y = 25. When X = 0, Y = 50. etc... We don't have to manupulate the X and Y variables because the origin in (0, 0).

But now lets say that the center is (100, 100). Radius is still 50. Remember how when X = -50, y = 0? Well now, we add the X portion of the center to the X portion of our point. So X is now 50. And we do the same for Y so Y is now 100. Our new point on the left extreme of the circle is X = 50, Y = 100. Let's take... X = 25, Y = 25 with the origin as the center. Now lets convert that to our new center (100, 100). 25 + 100 = 125. 25 + 100 = 125. So new point is (125, 125). But now lets say our center is (100, 50). X = 25 + 100 = 125. Y = 50 + 50 = 100. Our new point on a circle with center (100, 50) is X = 125, Y = 100.

The equation of a circle in full form is this.
 code: (x - centre)**2 + (y-centre)**2 = r**2
When we make center the origin, the equation can be converted to
 code: x**2 + y**2 = r**2
since a number minus 0 is the number. But if we have a different center, things change as demonstarted above.

To isolate Y...

 code: (x - centre)**2 + (y-centre)**2 = r**2 (y-centre)**2 = r**2 - (x - centre)**2 (y - center) = sqrt (r**2 - (x - centre)**2) y =  sqrt (r**2 - (x - centre)**2) + center

And there is the where the temp and y equations come from!

 Author: Paul [ Mon May 31, 2004 5:47 pm ] Post subject: Oh I see, I understand now, I think I'll mess around with it a bit now, thanx! Author:  Paul [ Mon May 31, 2004 7:35 pm ]
Post subject:

Oh Im sorry, I still don't fully understand enough to know how to draw a full circle I know about the extremeties, but when you subtract x, the y value goes back to from b4, and draws the top semi circle again, so heres what I did to construct a working orbital, it still seems icky to me cause I know I didn't do the right thing to make it, its an roundabout way. code: setscreen ('offscreenonly') var x, y, temp : real var a, b, r : int var centre : int := 100 % th var counter : int := 0 %%%%%% CIRCLE %%%%%%% r := 50 x := 50 % Draw cicle by dots. % Equation: (x - centre)**2 + (y-centre)**2 = r**2 % Since center is not 0, we have to incude the little minus thingy, just accept it :D loop     temp := r ** 2 - (x - centre) ** 2   % The equation above arranged above to isolate y squared at origin     exit when temp < 0                   % You can't take a square root of a negative number (i :D)     y := sqrt (temp) + centre % Find y... and move it to the appropriate center     counter += 1     % Increase x by a random number     x += .1 end loop var yv : array 1 .. counter of real loop x := 50 for z: 1..counter       temp := r ** 2 - (x - centre) ** 2   % The equation above arranged above to isolate y squared at origin     exit when temp < 0                   % You can't take a square root of a negative number (i :D)     y := sqrt (temp) + centre % Find y... and move it to the appropriate center     yv (z) := y-centre     drawfilloval (round (x), round (y), 5, 5, black)     View.UpdateArea (round(x)-6, round(y)-6, round(x)+6, round(y)+6)     drawfilloval (round (x), round (y), 5, 5, white)     % Increase x by a random number         x += .1 end for View.Update cls x :=149 % Draw the dot for z : 1 .. counter     temp := r ** 2 - (x - centre) ** 2 % The equation above arranged above to isolate y squared at origin     exit when temp < 0                   % You can't take a square root of a negative number (i :D)     y := centre-yv(z) % Find y... and move it to the appropriate center         drawfilloval (round (x), round(y), 5, 5, black)       View.UpdateArea (round(x)-6, round(y)-6, round(x)+6, round(y)+6)     drawfilloval (round (x), round (y), 5, 5, white)     % Increase x by a random number     x -= .1   end for View.Update cls end loop

Author:  guruguru [ Mon May 31, 2004 8:14 pm ]
Post subject:

The circle...

 code: var x, y, temp : real var a, b, r : int var yFactor : int := 1 var xNumber : real := .1 var centre : int := 200 r := 50 x := centre - r loop     if x >= centre + r then         xNumber := -xNumber         yFactor := -1     end if     temp := r ** 2 - (x - centre) ** 2     y := yFactor * (sqrt (abs (temp)) + centre * yFactor)     drawdot (round (x), round (y), black)     x += xNumber     exit when x <= centre - r end loop

And the orbit code: setscreen ("offscreenonly") var x, y, temp : real var a, b, r : int var yFactor : int := 1 var xNumber : real := .2 var centre : int := 200 centre := 300 r := 50 x := centre - r loop     temp := r ** 2 - (x - centre) ** 2     y := yFactor * (sqrt (abs (temp)) + centre * yFactor)     cls     drawfilloval (round (x), round (y), 5, 5, black)     View.Update     x += xNumber         if x >= centre + r or x <= centre - r then         xNumber := -xNumber         yFactor := -yFactor     end if end loop

Note: Its choppy at the sides because it only sits a about two points near the sides. Changing the xNumber when ts at that point will fix it.

 Author: Flashkicks [ Tue Jun 01, 2004 7:50 am ] Post subject: Hey- i dont know about any of yous- but I found this thread to be very usefull..lol. Thanks very much for the examples laid out there- there are fine and dandy! I am going to still try to work with this and whatnot until i have it COMPLETELY figured out and I will become the MASTER of Orbits!! MwuHaHaHaaaaaaaaaaaa!!. And then- THE Wo0o0o0oRRRRRRRLD!!!!! *Pets pet Monkey* DUN Dun Dunnnnnnnnnnnnnnnnnnnnnnnnnn...  ~Flashkicks

 Author: guruguru [ Tue Jun 01, 2004 4:23 pm ] Post subject: Heh. Glad you found it useful... Maybe someone should make a tutorial on this.? Author: Paul [ Tue Jun 01, 2004 4:25 pm ] Post subject: Yea, gather up all the info and make a grand tutorial on circular collision detection and the applications of the formula, I'd like to see how you could use this to go thru all the points on a circle for collision detection.

 Author: guruguru [ Tue Jun 01, 2004 4:32 pm ] Post subject: I'll look into doing one! But, this method of collision detection can extremely slow down your game... depending on the number of point you check. *Starts writing...*

 :