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; }

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

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; }

At Springboard, we know how to get you a job in data science. With Springboard’s Data Science Career Track, you’ll master data science with a curriculum built by industry experts. You’ll work on real projects, and get 1-on-1 mentorship from a data scientist.

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?