C ++ Allegro旋转线组()

时间:2016-02-28 20:12:54

标签: c++ allegro

我想使用Allegro 4库创建一个line()对象。

    circle( buffer, xm=xm+xx, ym=ym+yy, r=r+q, c0);
    line( buffer, xm   , ym-30, xm+15, ym-15, c0 );
    line( buffer, xm+15, ym-15, xm+5, ym-15, c0 );
    line( buffer, xm+5, ym-15, xm+5, ym+30, c0 );
    line( buffer, xm+5, ym+30, xm-5, ym+30, c0 );
    line( buffer, xm-5, ym+30, xm-5, ym-15, c0 );
    line( buffer, xm-5, ym-15, xm-15, ym-15, c0 );
    line( buffer, xm-15, ym-15, xm   , ym-30, c0 );

这些线在圆圈内创建一个箭头。我想在那个圈子里旋转那个箭头。

1 个答案:

答案 0 :(得分:1)

这是基本几何,真的。

newX = x*cos(theta) - y*sin(theta)
newY = y*cos(theta) + x*sin(theta)

将从原点(0,0)以角度x旋转点ytheta,并将新坐标存储在newXnewY中。将其扩展为从中心旋转就像从xy坐标中减去中心坐标一样简单,然后再次添加到结果中:

newX = (x-centerX)*cos(theta) - (y-centerY)*sin(theta) + centerX
newY = (y-centerY)*cos(theta) + (x-centerX)*sin(theta) + centerY

因此,您将在箭头的每个点上调用的函数将是这样的:

void rotate(float x, float y, float r, 
            float theta, float centerX, float centerY, 
            float &newX, float &newY){
    newX = (x-centerX)*cos(theta) - (y-centerY)*sin(theta) + centerX;
    newY = (y-centerY)*cos(theta) + (x-centerX)*sin(theta) + centerY;
}