0

我搜索了 stackoverflow,发现这个问题很有用,并且了解了 2D 形状旋转。

我有这种格式的坐标

    int x1=-30, x2=-15, x3=20, x4=30;
    int my1=-30,y2=-15,y3=0,y4=15,y5=20,y6=30;

并有一些像这样的中心点和枢轴点

    int xc=320, yc=240;//Center of the figure
    int xp=0, yp=0;//Pivot point for this figure

我用这个函数来绘制形状

    void draw_chair()
      {    
        int loc_xc = xc+xp;
        int loc_yc = yc+yp;

        line(x2+loc_xc,my1+loc_yc,x2+loc_xc,y5+loc_yc);  
        line(x3+loc_xc,my1+loc_yc,x3+loc_xc,y5+loc_yc);   
        line(x2+loc_xc,my1+loc_yc,x3+loc_xc,my1+loc_yc);
        line(x2+loc_xc,y2+loc_yc,x3+loc_xc,y2+loc_yc);
        line(x2+loc_xc,y3+loc_yc,x3+loc_xc,y3+loc_yc);
        line(x1+loc_xc,y4+loc_yc,x4+loc_xc,y4+loc_yc);
        line(x2+loc_xc,y3+loc_yc,x1+loc_xc,y4+loc_yc);
        line(x3+loc_xc,y3+loc_yc,x4+loc_xc,y4+loc_yc);
        line(x1+loc_xc,y4+loc_yc,x1+loc_xc,y6+loc_yc);
        line(x4+loc_xc,y4+loc_yc,x4+loc_xc,y6+loc_yc);
      } 

问题是,现在我对如何计算旋转的 x 和 y 值感到困惑

我试过谷歌,发现这段代码可以旋转

    int tempx=x1;
    x1=tempx*cos(angle)-my1*sin(angle);
    my1=tempx*sin(angle)+my1*cos(angle);

    tempx=x2;
    x2=tempx*cos(angle)-y2*sin(angle);
    y2=tempx*sin(angle)+y2*cos(angle);

    tempx=x3;
    x3=tempx*cos(angle)-y3*sin(angle);
    y3=tempx*sin(angle)+y3*cos(angle);

    tempx=x4;
    x4=tempx*cos(angle)-y4*sin(angle);
    y4=tempx*sin(angle)+y4*cos(angle);

我试过了,但它没有正确旋转形状,而是这段代码将形状转换为其他奇怪的形状。另外我有 4 个 x 点和 6 个 y 点,那么如何计算每个点的新值?

任何想法?或提示?谢谢

4

1 回答 1

4

从技术上讲,您无法旋转坐标,因为它只是一个没有方向概念的点。

您找到的代码用于旋转矢量,这确实是您需要的,但首先您需要将坐标转换为矢量。您可以将向量视为将图形中心连接到您的点的不可见线,因此它由两个点组成,在您的情况下,您可以假设一个为 (0,0),因为您稍后使用图的中心,另一个对应于您的对,例如 (x2,my1), (x2,y5)... 在您的画线功能中使用。

你的代码实际上应该是这样的:

PS:除非你只传入完美的角度,否则你不能指望这个数字总是使用整数坐标。你需要他们成为双打)

int point1x, point1y;
point1x = (int) round(x2*cos(angle)-m1y*sin(angle));
point1y = (int) round(x2*sin(angle)+m1y*cos(angle));

int point2x, point2y;
point2x = (int) round(x2*cos(angle)-y5*sin(angle));
point2y = (int) round(x2*sin(angle)+y5*cos(angle));

...

line(point1x+loc_xc, point1y+loc_yc, point2x+loc_xc, point2y+loc_yc);

等等。

另外,请确保您的angle值以弧度为单位,因为sin()cos()函数都假设。如果您要传递度数,请先使用以下公式将它们转换为弧度:

double pi = acos(-1);
double rotation_angle = (double) angle / 180.0 * pi;

并在上面的代码中使用rotation_angle而不是。angle

于 2013-05-20T23:35:17.027 回答