我想编写一个C程序来旋转矩形内的点。
在我的程序中,矩形中心是枢轴点,矩形尺寸为320x480
。假设矩形的一个顶点位于原点,则枢轴点为(160,240)
。
现在要相对于枢轴(px, py)
旋转矩形内的点(ox, oy)
,我使用以下公式 -
p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy
然而,当我尝试将点旋转90度时,所有点都被映射到一条直线上。
任何人都可以解决这个问题吗?
theta2=90;
theta1=abs(theta2*3.1415926)/180;
if(theta2>0)
{
for(int tc=0;tc<rstruct2->nrows;tc++)
{
rstruct2->xcol[tc]=round((rstruct2->xcol[tc]-160)*cos(theta1)-sin(theta1)*(rstruct2->ycol[tc]-240)+160);
rstruct2->ycol[tc]=round((rstruct2->xcol[tc]-160)*sin(theta1)+cos(theta1)*(rstruct2->ycol[tc]-240)+240);
}
}
else
{
for(int tc=0;tc<rstruct2->nrows;tc++)
{
rstruct2->xcol[tc]=round(160+(rstruct2->xcol[tc]-160)*cos(theta1)+(rstruct2->ycol[tc]-240)*sin(theta1));
rstruct2->ycol[tc]=round(240+(-rstruct2->xcol[tc]-160)*sin(theta1)+(rstruct2->ycol[tc]-240)*cos(theta1));
}
}
答案 0 :(得分:4)
你的y旋转使用修改的x值,但你需要使用基值 - 使用一个临时变量,如下所示:
double x_tmp = round((rstruct2->xcol[tc]-160)*cos(theta1)-sin(theta1)*(rstruct2->ycol[tc]-240)+160);
double y_tmp = round((rstruct2->xcol[tc]-160)*sin(theta1)+cos(theta1)*(rstruct2->ycol[tc]-240)+240);
rstruct2->xcol[tc] = x_tmp;
rstruct2->ycol[tc] = y_tmp;