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

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

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

Not a complete soultion but the rght suggestion for getting circular motion. The rest fell in to place after that.

0

Featured Post

Managing multiple websites, servers, applications, and security on a daily basis? Join us for a webinar on May 25th to learn how to simplify administration and management of virtual hosts for IT admins, create a secure environment, and deploy code more effectively and frequently.

How to Win a Jar of Candy Corn:
A Scientific Approach!
I love mathematics. If you love mathematics also, you may enjoy this tip on how to use math to win your own jar of candy corn and to impress your friends.
As I said, I love math, but I guâ€¦

When we purchase storage, we typically are advertised storage of 500GB, 1TB, 2TB and so on. However, when you actually install it into your computer, your 500GB HDD will actually show up as 465GB. Why?
It has to do with the way people and computersâ€¦