2011-12-01 36 views
0

这是形式,但我不知道如何实现它。能有人帮我需要实现一个2D形状的旋转功能

enter image description here

enter image description here

rectangle::rectangle() //rectangle constructor 
{ 
    bl.real() = 0; //bottom 
    bl.imag() = 0; //left 

    tr.real() = 1; //top 
    tr.imag() = 1; //right 
} 

complex<double> rectangle::get_bl() const 
{ 
    return bl; 
} 

complex<double> rectangle::get_tr() const 
{ 
    return tr; 
} 

void rectangle::rotate(double angle) 
{ 
    //not sure how to do it tr = tr.real() * cos(angle) + tr.imag() *cos(angle); 


} 

主要

rectangle r; 
r.rotate(90); 

预期输出(不是100%确定)

0 0 -1 1 
+0

你绕左下角点的矩形? – Blender

+0

@Blender是的(0,0) – code511788465541441

+0

你为什么要将矩形存储为两个std :: complex? –

回答

2
  1. 你的形状移到(0, 0)暂时(公式假定你正在绕原点旋转,所以将左下角移至(0, 0))。
  2. 应用公式。
  3. 将其移回。

if (tr.real() < bl.real()) { 
    float tempX = tr.real() - bl.real(); 
    float tempY = tr.imag() - bl.imag(); 
} else { 
    float tempX = bl.real() - tr.real(); 
    float tempY = bl.imag() - tr.imag(); 
} 

tr.real() = tempX * cos(theta) - tempY * sin(theta) 
tr.imag() = tempx * sin(theta) + tempY * cos(theta) 
+0

,给出0 0 1.34207 -0.445923。是“theta”的角度?我不得不声明tempX和tempY在if语句的外侧,所以它的工作原理,但输出看起来不正确 – code511788465541441

+0

你的意思是将形状的中心移动到'(0,0)',否则你正在旋转形状它的左下角。编辑:看到了评论,你的回答是对的我的错误是正确的,围绕'bl'角落做这件事似乎很奇怪。 – Serdalis

+0

@ user521180:'cos()'以弧度表示,而不是度数。转换你的角度。 – Blender

0

的公式基本上是说:

new_x = shape.point[i].x*cos(angle) - shape.point[i].y*sin(angle) 
new_y = shape.point[i].x*sin(angle) + shape.point[i].y*cos(angle) 
shape.point[i].x = new_x 
shape.point[i].y = new_y 

角弧度,从度转换为弧度使用
degree*pi/180其中pi是恒定的3.14...

你需要对每一个点做到这一点形状以完全旋转期望程度的形状。

该公式还假定点以(0,0)为中心,即形状的中心为(0,0),所有点都相对于该中心。


一个提示,如果适用,尝试和存储形状,点,从0th点顺时针方向进行。例如,这个矩形是:

point[0] = {-1, 1} 
point[1] = { 1, 1} 
point[2] = { 1,-1} 
point[3] = {-1,-1} 

tl, br转换为points你需要做类似的东西:

point[0] = {tl.x, tl.y} 
point[1] = {br.x, tl.y} 
point[2] = {br.x, br.y} 
point[3] = {tl.x, br.y} 
+0

我有点困惑。这些变量如何与我的矿工匹配?你能否用我使用的变量名写出该公式 – code511788465541441

+0

我不会推荐你这样做。我同意,存储矩形的最节省空间的方法是使用'tl','br',但在这种情况下使用的公式不适用于没有进行某些处理的坐标。这将是良好的做法:P – Serdalis