• ### Announcements

#### Archived

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

## 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 on other sites
Guest Anonymous Poster
x_origin = 0.0;
y_origin = 0.0;
angle = pi/2; //90 degrees

cos() and sin() work with radians

##### 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 on other sites
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 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 on other sites
targhan    122

--------------------------------

"I''m a half time coder, full time Britney Spears addict"
Targhan

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

##### Share on other sites
skow    248
push a matrix.
translate over,
then rotate.

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

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

[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 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 on other sites
Guest Anonymous Poster
yeh that''s weird.
I get -0.000004 when using cos(1.5708)

##### Share on other sites
GamerSg    378
You mean u don't get 6.123 on your computer?

[edited by - GamerSg on July 7, 2003 7:33:07 AM]

##### Share on other sites
Guest Anonymous Poster
I get -0.000004 on my computer

##### 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 on other sites
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 on other sites
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 on other sites
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);
}

<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 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 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 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.