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

座標は方向の概念がない単なる点であるため、技術的には座標を回転させることはできません。

あなたが見つけたコードは、ベクトルを回転させるために使用されます。これは実際に必要なものですが、最初に座標をベクトルに変換する必要があります。ベクトルは、図の中心をポイントに接続する目に見えない線であると考えることができるため、2 つのポイントで構成されます。この場合、1 つを (0,0) と見なすことができます。図の中央、もう一方は (x2,my1)、(x2,y5)... などのペアに対応し、線画関数で使用されます。

コードは実際には次のようになります。

PS: 完全な角度のみを渡さない限り、数値が常に整数座標で機能するとは期待できません。それらは double である必要があります)

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 に答える