Archived

This topic is now archived and is closed to further replies.

GamerSg

Rotating Points about origin

Recommended Posts

GamerSg    378
I need to know how i can get the resulting coordinate after a point has been rotated. For example i have a point at (1,0). After rotating it 90degrees, it should be at (0,1). The problem is how do i get the new coordinate of (0,1) given it''s original position and 90 degrees.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
x_origin = 0.0;
y_origin = 0.0;
radius = 1.0;
angle = pi/2; //90 degrees
x = x_origin+(cos(angle)*radius);
y = y_origin+(sin(angle)*radius);


cos() and sin() work with radians

Share this post


Link to post
Share on other sites
GamerSg    378
Hmm, so for every point i have to calculate the distance it is from the origin(radius)?

Whats the most efficient way to calculate it?

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster

p1,p2; // p1 is the origin point in space and p2 is some other point anywhere.

distance = sqrt(((p1.x-p2.x)*(p1.x-p2.x))
+((p1.y-p2.y)*(p1.y-p2.y))
+((p1.z-p2.z)*(p1.z-p2.z)));

Share this post


Link to post
Share on other sites
GamerSg    378
Can''t seem to find whats wrong.

void Scene::initCol()
{
double distance;
for(int i=0;i<numOfObj;i++)
{
double xoff=sin(Objects[i].rotY*PI/180);//amount to rotate collission detection values

double zoff=cos(Objects[i].rotY*PI/180);//amount to rotate collission detection values

for(int j=0;j<Objects[i].numOfVertex;j++)
{
distance=sqrt(pow(Objects[i].vertex[j][0],2)+pow(Objects[i].vertex[j][2],2));
Objects[i].vertex[j][0]+=xoff*distance; //multiply offset to rotate

Objects[i].vertex[j][2]+=zoff*distance;
Objects[i].vertex[j][0]+=Objects[i].posX;
Objects[i].vertex[j][1]+=Objects[i].posY;
Objects[i].vertex[j][2]+=Objects[i].posZ;

}

}
}

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
What is the matrixes?
That is the question that drives us.

Share this post


Link to post
Share on other sites
skow    248
push a matrix.
load idenity (to make sure your back at 0,0,0
translate over,
then rotate.

Would that not do the wame thing al those calculations do?

Share this post


Link to post
Share on other sites
Bero_Avrion    122
Sure it would! But sometimes you need the real coordinates, not only the result...

//x,y,z:original coordinates, x_a, y_a, z_a: angles for rotation
void vertex(float x, float y, float z, float x_a, float y_a, float z_a)
{
float x_alt, y_alt, z_alt;
x_a=(x_a/180)*PI;
y_a=(y_a/180)*PI;
z_a=(z_a/180)*PI;

//rotate z-axis
x_alt=x;
y_alt=y;
z_alt=z;
x=x_alt*cos(z_a)-y_alt*sin(z_a);
y=y_alt*cos(z_a)+x_alt*sin(z_a);

//rotate y-axis
x_alt=x;
y_alt=y;
z_alt=z;
x=(x_alt*cos(y_a)-z_alt*sin(y_a));
z=(z_alt*cos(y_a)+x_alt*sin(y_a));

//rotate x-axis
x_alt=x;
y_alt=y;
z_alt=z;
y=(y_alt*cos(x_a)-z_alt*sin(x_a));
z=(z_alt*cos(x_a)+y_alt*sin(x_a));

glVertex3f(x,y,z);
}

perhaps this will help you.

[edited by - Bero_Avrion on July 6, 2003 4:07:43 PM]

[edited by - Bero_Avrion on July 6, 2003 4:09:48 PM]

Share this post


Link to post
Share on other sites
GamerSg    378
Ok this is really weird.

the cos of 90 degrees which is 1.5708 in radians.
When i cos(1.5708) and print out the results, i get 6.123....
But when i cos(1.5708) on my scientific calculator in radian mode i get almost 0.

Im using the math.h library and i don''t know why i am getting incorrect results.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
yeh that''s weird.
I get -0.000004 when using cos(1.5708)

Share this post


Link to post
Share on other sites
GamerSg    378
Well i got
-3.6732051033725085976773671369636e-6
using Windows calculator when i cos(1.5708)
So this appears to be limited to only the PC.
I don''t know what the letter e means. Does it mean that the following number is actually 6 decimal points away from the decimal point?
i.e
-0.00000036732051033725085976773671369636

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
"Different AP"

quote:
Original post by GamerSg
Ok this is really weird.

the cos of 90 degrees which is 1.5708 in radians.
When i cos(1.5708) and print out the results, i get 6.123....
But when i cos(1.5708) on my scientific calculator in radian mode i get almost 0.

Im using the math.h library and i don''t know why i am getting incorrect results.



quote:
Original post by GamerSg 90 degrees which is 1.5708 in radians;
correct

quote:
Original post by GamerSg When i cos(1.5708) and print out the results, I get 6.123;

Cosine and Sine will never return a value greater than 1 or less than -1

quote:
Original post by GamerSg But when i cos(1.5708) on my scientific calculator in radian mode i get almost 0.

The Cosine of 90 degrees is 0. Try using 1.5707982f for your angle.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
quote:
Original post by GamerSg
Does it mean that the following number is actually 6 decimal points away from the decimal point?
i.e
-0.00000036732051033725085976773671369636


Correct. It''s a form of scientific notation.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster   
Guest Anonymous Poster
quote:
Original post by Bero_Avrion
Sure it would! But sometimes you need the real coordinates, not only the result...

//x,y,z:original coordinates, x_a, y_a, z_a: angles for rotation
void vertex(float x, float y, float z, float x_a, float y_a, float z_a)
{
float x_alt, y_alt, z_alt;
x_a=(x_a/180)*PI;
y_a=(y_a/180)*PI;
z_a=(z_a/180)*PI;

//rotate z-axis
x_alt=x;
y_alt=y;
z_alt=z;
x=x_alt*cos(z_a)-y_alt*sin(z_a);
y=y_alt*cos(z_a)+x_alt*sin(z_a);

//rotate y-axis
x_alt=x;
y_alt=y;
z_alt=z;
x=(x_alt*cos(y_a)-z_alt*sin(y_a));
z=(z_alt*cos(y_a)+x_alt*sin(y_a));

//rotate x-axis
x_alt=x;
y_alt=y;
z_alt=z;
y=(y_alt*cos(x_a)-z_alt*sin(x_a));
z=(z_alt*cos(x_a)+y_alt*sin(x_a));

glVertex3f(x,y,z);
}

perhaps this will help you.

<SPAN CLASS=editedby>[edited by - Bero_Avrion on July 6, 2003 4:07:43 PM]</SPAN>

<SPAN CLASS=editedby>[edited by - Bero_Avrion on July 6, 2003 4:09:48 PM]</SPAN>

I''m now using the algorithm you quoted and it works fine only if the the rotation value is 0 or 360 meaning it does not rotate at all.

void Scene::initCol()
{
//float distance=0;
float tx;
float tz;
float sinr;
float cosr;
for(int i=0;i<numOfObj;i++)
{
sinr=float(sin(Objects.rotY*PI/180));//amount to rotate collission detection values
cosr=float(cos(Objects[i].rotY*PI/180));//amount to rotate collission detection values
for(int j=0;j<Objects[i].numOfVertex;j++)
{
//x=(x_alt*cos(y_a)-z_alt*sin(y_a));
//z=(z_alt*cos(y_a)+x_alt*sin(y_a));
tx=Objects[i].vertex[j][0];
tz=Objects[i].vertex[j][2];
Objects[i].vertex[j][0]=tx*cosr-tz*sinr;
Objects[i].vertex[j][2]=tz*cosr+tx*sinr;
Objects[i].vertex[j][0]+=Objects[i].posX;
Objects[i].vertex[j][1]+=Objects[i].posY;
Objects[i].vertex[j][2]+=Objects[i].posZ;

}

}
}


Still can''t get it to work with any other angle other than 0 and 360.

Share this post


Link to post
Share on other sites
GamerSg    378
Used wrong tag.


void Scene::initCol()
{
//float distance=0;

float tx;
float tz;
float sinr;
float cosr;
for(int i=0;i<numOfObj;i++)
{
sinr=float(sin(Objects[i].rotY*PI/180));//amount to rotate collission detection values

cosr=float(cos(Objects[i].rotY*PI/180));//amount to rotate collission detection values

for(int j=0;j<Objects[i].numOfVertex;j++)
{
//x=(x_alt*cos(y_a)-z_alt*sin(y_a));

//z=(z_alt*cos(y_a)+x_alt*sin(y_a));

tx=Objects[i].vertex[j][0];
tz=Objects[i].vertex[j][2];
Objects[i].vertex[j][0]=tx*cosr-tz*sinr;
Objects[i].vertex[j][2]=tz*cosr+tx*sinr;
Objects[i].vertex[j][0]+=Objects[i].posX;
Objects[i].vertex[j][1]+=Objects[i].posY;
Objects[i].vertex[j][2]+=Objects[i].posZ;

}

}
}

Share this post


Link to post
Share on other sites
Nypyren    12063
Quick question: I noticed the word "collision". Are you using this to rotate two objects' centers to a specific angle before doing a specific collision test? Because you can do most (if not all) of that stuff using vector projection.

[edited by - Nypyren on July 7, 2003 10:53:24 PM]

Share this post


Link to post
Share on other sites
GamerSg    378
Eh sorry but i dont understand what you are talking about.

I think i know whats wrong now, its not the code, its just that i forgot that when i am calculating the new vertices, i also have to recalculate the normals, this is why it was working when there was no rotation.


Thanks to Bero_Avrion for the algorithm.

Share this post


Link to post
Share on other sites