From: rusin@washington.math.niu.edu (Dave Rusin)
Newsgroups: sci.physics,sci.math,comp.graphics,comp.graphics.algorithms
Subject: Re: Probably an easy Circular motion question - hints?
Date: 17 Feb 1995 15:14:16 GMT
In article <3huogg$fgb@vixen.cso.uiuc.edu>,
Sulis wrote:
>I've been trying to create a simple and versatile system for allowing
>points in a two-dimensional system to move in the path of a circle.
>The basic way I was hoping to do it was to just give each of the points
>a value K (curvature). In this way, I could leave K constant to create the
>path of a circle, or vary K to give various sweeping arc paths.
>...
> each point has: x position, y position, dx (change in x pos),
>dy (change in y pos), and K (curvature).
>
>So I just loop over and over:
> tempdx=dx (these just so the data doesn't change in the middle of the
> tempdy=dy dx and dy calculations)
>
> dx = tempdx + K (tempdy)
> dy = tempdy + K (tempdx)
> x=x+dx
> y=y+dy
A couple of respondents have suggested trig functions, which is a fine
suggestion, but not at all necessary. Given any motion through a
sequence of points p_n = (x_n, y_n), we can recreate that motion by
adding to the starting point the displacement vectors v_n=p_{n+1}-p_n.
Each of these in turn may be expressed in terms of the previous one
in a method not unlike that suggested by the poster.
Indeed, let R be the 90-degree counterclockwise rotation R(x,y)=(-y,x).
Then for any non-zero vector v, {v, R(v)} is a basis for the plane.
In particular, we can always write v_{n+1}=J_n v_n + K_n R(v_n). Except
for a sign error, this is what the poster did, with J_n=1 and
(eventually) K_n constant.
Loosely speaking, v_n ought to represent velocity, and then
v_{n+1}-v_n acceleration. The poster evidently intended to keep acceleration
orthogonal to velocity; this is equivalent to travel at constant speed.
Then, the additional statement that K be constant would make for
constant-magnitude acceleration as well, which would give circular motion.
Unfortunately, some accuracy is lost in the discretization, but we can
preserve some features. Our choice of basis makes it clear that the
magnitude of v_{n+1} will be sqrt(J_n^2 + K_n^2) times the magnitude
of v_n. Thus we will have uniform "speed" (distance between successive
points p_n) if we arrange it so that J_n^2+K_n^2=1. Now choosing K
constant essentially implies J is too; such choices will indeed produce
(discrete) circular motion. The poster's error (aside from loss of a sign)
was just to have the magnitude of the speed increasing (assuming K <> 0).
Of course, motion with constant speed need not require a fixed (J,K);
indeed, any curve can be traversed with unit speed. One can write all such
choices (J,K) in the form (J_n, K_n) = (cos(u_n), sin(v_n)), but even
here, no trig is necessary; one could also write
(J_n, K_n) = ((1-u_n^2)/(1+u_n^2), (2u_n)/(1+u_n^2)) for some real u_n.
In either case, u_n would be related to the change in direction of the
vectors v_{n+1} and v_n (of equal length).
Non-uniform speed is also possible in this setting, but I'm not quite sure
of the details. Suppose you wish to picture an object moving, subject to
certain forces. You know then the acceleration it faces, perhaps as a
function of time, position, and velocity. I'm not entirely sure how you
ought to choose the J_n and K_n. When acceleration is small and slowly
changing, I'm sure you'll get adequate results by taking J_n = 1+ a_n
and K_n = b_n where (a_n) and (b_n) are the tangential and normal
components of acceleration, respectively. But the discretization will
produce unfortunate side-effects if you do this when acceleration is large.
For example, if you model a planetary orbit this way, things will be
fine unless you try modeling a comet passing very close to the sun.
dave