I have a segment of code that updates an object's position based on Lorenz Attractor calculations. I would like to convert this to update an objects positions in a circular path at a set height on the y axis. I think I just need to change the x and z calculations but I'm not sure if that is correct or what to change to.

{ // Lorenz integration parameters double dt = 0.003; double s = -1.7; double b = 2.66; double r = 50; // Old vectors double D,Nx,Ny,Nz; double Dx0 = Dx; double Dy0 = Dy; double Dz0 = Dz; double Ux0 = Ux; double Uy0 = Uy; double Uz0 = Uz; // Fix degenerate case if (X==0 && Y==0 && Z==0) Y = Z = 40; // Update position Dx = s*(Y-X); Dy = X*(r-Z)-Y; Dz = X*Y - b*Z; X += dt*Dx; Y += dt*Dy; Z += dt*Dz; // Normalize DX D = sqrt(Dx*Dx+Dy*Dy+Dz*Dz); Dx /= D; Dy /= D; Dz /= D; // Calculate sideways Sx = Dy0*Dz-Dz0*Dy; Sy = Dz0*Dx-Dx0*Dz; Sz = Dx0*Dy-Dy0*Dx; // Calculate Up Ux = Dz*Sy - Dy*Sz; Uy = Dx*Sz - Dz*Sx; Uz = Dy*Sx - Dx*Sy; // Normalize Up D = sqrt(Ux*Ux+Uy*Uy+Uz*Uz); Ux /= D; Uy /= D; Uz /= D; // Eye and lookat position Ex = X-7*Dx; Ey = Y-7*Dy; Ez = Z-7*Dz; Ox = X; Oy = Y; Oz = Z; // Next DX Nx = s*(Y-X); Ny = X*(r-Z)-Y; Nz = X*Y - b*Z; // Pitch angle pitch = 180*acos(Dx*Dx0+Dy*Dy0+Dz*Dz0); // Roll angle D = (Ux*Ux0+Uy*Uy0+Uz*Uz0) / (Dx*Dx0+Dy*Dy0+Dz*Dz0); if (D>1) D = 1; roll = (Nx*Sx+Ny*Sy+Nz*Sz>0?+1:-1)*960*acos(D); // Yaw angle yaw = 0; // Power setting (0-1) if (Dy>0.8) pwr = 100; else if (Dy>-0.2) pwr = 20+100*Dy; else pwr = 0; }

X = radius * cos(time);
Y = constant;
Z = radius * sin(time);

And then remember to increment time after each iteration. Is that what you're after?

0

islandguy10Author Commented:

As it stands I have my positions change as the following:

X = dt*Dx. etc...that way I don't increment time since it is the same change every iteration.

So should I use the derivative of the equations you gave me?
Dx = -sin(time);
Dy = 0;
Dz = cos(time);

I tried your suggestion, but I got some very odd movement. Not sure I implemented it correctly.

0

islandguy10Author Commented:

Using the attached changes...I do get the object to move in a circular path and it appears to be updating direction properly, my object is pointing down, but that is not a problem with this segment of code. However, every half second or so, it rotates ~45 degrees and then rotates back. I'm not sure what is causing this.

if (fly) { // Lorenz integration parameters double dt = 0.003; // Old vectors double D,Nx,Ny,Nz; double Dx0 = Dx; double Dy0 = Dy; double Dz0 = Dz; double Ux0 = Ux; double Uy0 = Uy; double Uz0 = Uz; // Fix degenerate case if (X==0 && Y==0 && Z==0) Y = Z = 40; // Update position Dx = -sin(B52_direction); Dy = 20; Dz = cos(B52_direction); X += dt*Dx; Y += 0; Z += dt*Dz; // Normalize DX D = sqrt(Dx*Dx+Dy*Dy+Dz*Dz); Dx /= D; Dy /= D; Dz /= D; // Calculate sideways Sx = Dy0*Dz-Dz0*Dy; Sy = Dz0*Dx-Dx0*Dz; Sz = Dx0*Dy-Dy0*Dx; // Calculate Up Ux = Dz*Sy - Dy*Sz; Uy = Dx*Sz - Dz*Sx; Uz = Dy*Sx - Dx*Sy; // Normalize Up D = sqrt(Ux*Ux+Uy*Uy+Uz*Uz); Ux /= D; Uy /= D; Uz /= D; // Eye and lookat position Ex = X-7*Dx; Ey = Y-7*Dy; Ez = Z-7*Dz; Ox = X; Oy = Y; Oz = Z; // Next DX Nx = -sin(B52_direction); Ny = 20; Nz = cos(B52_direction); // Pitch angle pitch = 180*acos(Dx*Dx0+Dy*Dy0+Dz*Dz0); // Roll angle D = (Ux*Ux0+Uy*Uy0+Uz*Uz0) / (Dx*Dx0+Dy*Dy0+Dz*Dz0); if (D>1) D = 1; roll = (Nx*Sx+Ny*Sy+Nz*Sz>0?+1:-1)*960*acos(D); // Yaw angle yaw = 0; // Power setting (0-1) if (Dy>0.8) pwr = 100; else if (Dy>-0.2) pwr = 20+100*Dy; else pwr = 0; } // Static Roll/Pitch/Yaw else { Ex = -2*dim*Sin(th)*Cos(ph); Ey = +2*dim *Sin(ph); Ez = +2*dim*Cos(th)*Cos(ph); Ox = Oy = Oz = 0; X = Z = 0; Y = 20; Dx = 1; Dy = 0; Dz = 0; Ux = 0; Uy = 1; Uz = 0; }

This course will introduce you to the interfaces and features of Microsoft Office 2010 Word, Excel, PowerPoint, Outlook, and Access. You will learn about the features that are shared between all products in the Office suite, as well as the new features that are product specific.

I am now getting the proper circular motion I was looking for. I'm not having an issue with the diameter in the scenario. I am not sure how to increase it. My direction variable increments every iteration by .04.

if (fly) { // Lorenz integration parameters double dt = 0.003; // Old vectors double D,Nx,Ny,Nz; double Dx0 = Dx; double Dy0 = Dy; double Dz0 = Dz; double Ux0 = Ux; double Uy0 = Uy; double Uz0 = Uz; // Fix degenerate case if (X==0 && Y==0 && Z==0) Y = Z = 40; // Update position Dx = -sin(B52_direction); Dy = 20; Dz = cos(B52_direction); X += dt*Dx; Y += 0; Z += dt*Dz; // Normalize DX D = sqrt(Dx*Dx+Dy*Dy+Dz*Dz); Dx /= D; Dy /= D; Dz /= D; // Calculate sideways Sx = Dy0*Dz-Dz0*Dy; Sy = Dz0*Dx-Dx0*Dz; Sz = Dx0*Dy-Dy0*Dx; // Calculate Up Ux = Dz*Sy - Dy*Sz; Uy = Dx*Sz - Dz*Sx; Uz = Dy*Sx - Dx*Sy; // Normalize Up D = sqrt(Ux*Ux+Uy*Uy+Uz*Uz); Ux /= D; Uy /= D; Uz /= D; // Eye and lookat position Ex = X-7*Dx; Ey = Y-7*Dy; Ez = Z-7*Dz; Ox = X; Oy = Y; Oz = Z; // Next DX Nx = -sin(B52_direction); Ny = 20; Nz = cos(B52_direction); // Pitch angle pitch = 180*acos(Dx*Dx0+Dy*Dy0+Dz*Dz0); // Roll angle D = (Ux*Ux0+Uy*Uy0+Uz*Uz0) / (Dx*Dx0+Dy*Dy0+Dz*Dz0); if (D>1) D = 1; roll = 0; // Yaw angle yaw = 0; // Power setting (0-1) if (Dy>0.8) pwr = 100; else if (Dy>-0.2) pwr = 20+100*Dy; else pwr = 0; } // Static Roll/Pitch/Yaw else { Ex = -2*dim*Sin(th)*Cos(ph); Ey = +2*dim *Sin(ph); Ez = +2*dim*Cos(th)*Cos(ph); Ox = Oy = Oz = 0; X = Z = 0; Y = 20; Dx = 1; Dy = 0; Dz = 0; Ux = 0; Uy = 1; Uz = 0; }

X = radius * cos(time);

Y = constant;

Z = radius * sin(time);

And then remember to increment time after each iteration. Is that what you're after?