1

数学を吸うだけで、2つのポイント(中心と頂点の1つ)が与えられた「n」辺のポリゴンを描画する必要があります。私はたくさん読んでいます、そしてこれは私がそれを理解することができたものです(私はそれが正しいかどうかわかりません):

わかりました。ピタゴラスの定理を使用して、2点(半径)間の距離を取ります。

sqrt(pow(abs(x - xc), 2) + pow(abs(y - yc), 2));

そして、この2つのポイント間の角度は次のようにatan2を使用します。

atan2(abs(y - yc), abs(x - xc));

ここで、xc、ycは中心点であり、x、yは既知の唯一の頂点です。

そしてそのデータで私はします:

void polygon(int xc, int yc, int radius, double angle, int sides)
{
    int i;
    double ang = 360/sides; //Every vertex is about "ang" degrees from each other
    radian = 180/M_PI;
    int points_x[7]; //Here i store the calculated vertexs
    int points_y[7]; //Here i store the calculated vertexs

    /*Here i calculate the vertexs of the polygon*/
    for(i=0; i<sides; i++)
    {
        points_x[i] = xc + ceil(radius * cos(angle/radian));
        points_y[i] = yc + ceil(radius * sin(angle/radian));
        angle = angle+ang;
    }

    /*Here i draw the polygon with the know vertexs just calculated*/
    for(i=0; i<sides-1; i++)
        line(points_x[i], points_y[i], points_x[i+1], points_y[i+1]);
    line(points_y[i], points_x[i], points_x[0], points_y[0]);
}

問題は、ポリゴンのように線を描画しないため、プログラムが正しく機能しないことです。

誰かが手を差し伸べるのに十分な数学をどのように知っていますか?このグラフィックスプリミティブでCおよびturboCを使用して作業しています。


編集:ポリゴンを塗りつぶしたくないので、描画するだけです。

4

6 に答える 6

2

360/sides360の因数でない場合に実際に何が返されるかを検討しますsides(これは整数除算です。360/ 7が実際に何を返すかを確認してください)。

度を使用する必要はまったくありません2*Math_PI/(double)nsides。ラジアンで使用および作業します。

また、モジュラス関数(モジュールnsides)を使用して、最終行を省略できます。

7面以上ある場合、すべてのポイントを保存することはできません。ポリゴンを保存するのではなく、単に描画する場合は、すべてのポイントを保存する必要はありません。最後のポイントと現在のポイントだけです。

于 2009-11-25T04:02:44.383 に答える
1

すべての計算でラジアンを使用する必要があります。これを行うための最良の方法を示す完全なプログラムは次のとおりです。

#include <stdio.h>

#define PI 3.141592653589

static void line (int x1, int y1, int x2, int y2) {
    printf ("Line from (%3d,%3d) - (%3d,%3d)\n", x1, y1, x2, y2);
}

static void polygon (int xc, int yc, int x, int y, int n) {
    int lastx, lasty;
    double r = sqrt ((x - xc) * (x - xc) + (y - yc) * (y - yc));
    double a = atan2 (y - yc, x - xc);
    int i;

    for (i = 1; i <= n; i++) {
        lastx = x; lasty = y;
        a = a + PI * 2 / n;
        x = round ((double)xc + (double)r * cos(a));
        y = round ((double)yc + (double)r * sin(a));
        line (lastx, lasty, x, y);
    }
}

int main(int argc, char* argv[]) {
    polygon (0,0,0,10,4);   // A diamond.
    polygon (0,0,10,10,4);  // A square.
    polygon (0,0,0,10,8);   // An octagon.
    return 0;
}

どの出力(ここには派手なグラフィックはありませんが、アイデアを得る必要があります):

===
Line from (  0, 10) - (-10,  0)
Line from (-10,  0) - (  0,-10)
Line from (  0,-10) - ( 10,  0)
Line from ( 10,  0) - (  0, 10)
===
Line from ( 10, 10) - (-10, 10)
Line from (-10, 10) - (-10,-10)
Line from (-10,-10) - ( 10,-10)
Line from ( 10,-10) - ( 10, 10)
===
Line from (  0, 10) - ( -7,  7)
Line from ( -7,  7) - (-10,  0)
Line from (-10,  0) - ( -7, -7)
Line from ( -7, -7) - (  0,-10)
Line from (  0,-10) - (  7, -7)
Line from (  7, -7) - ( 10,  0)
Line from ( 10,  0) - (  7,  7)
Line from (  7,  7) - (  0, 10)

polygon2つの座標だけを渡して、元の仕様に従って関数を作成しました。余談ですが、半径と角度の計算でこれらの呼び出しを行わないようにする必要があります。理由は次のとおりです。abs

  • それらは半径には役に立ちません(-n2=n2すべてに対してn)。
  • 特定の象限(間違った開始点)に強制されるため、角度が悪くなります。
于 2009-11-25T04:58:20.993 に答える
0

あなたは私が推測する塗りつぶされたポリを描画しようとしていますか?

ラインプリミティブを使用してポリゴンを描画しようとすると、多くの苦痛が発生します。dicroceは実際にその面であなたにいくつかの非常に良いアドバイスを与えました。

あなたの最善の策は、あなたのために満たすプリミティブを見つけて、それに座標リストを提供することです。それを与えるための座標を決定するのはあなた次第です。

于 2009-11-25T04:09:02.373 に答える
0

主な問題はatan2(abs(y - yc), abs(x - xc));、度ではなくラジアンを与えることです。度に変換して試してみてください。

于 2009-11-25T04:09:17.007 に答える
0

私はあなたに答えを与えるつもりはありませんが、私はいくつかのアドバイスがあります。まず、線画が内外でどのように機能するかを学びます。これが落ち着いたら、塗りつぶされた三角形のレンダラーを書いてみてください。通常、塗りつぶされたポリゴンは、一度に1本の水平走査線を上から下に描画されます。あなたの仕事は、すべてのスキャンラインの開始と停止のx座標を決定することです。ポリゴンのエッジは直線に従うことに注意してください(ヒント、ヒント)... :)

于 2009-11-25T03:53:17.613 に答える
0
/* all angles in radians */
double ainc = PI*2 / sides;
int x1, y1;
for (i = 0; i <= sides; i++){
    double a = angle + ainc * i;
    int x = xc + radius * cos(a);
    int y = yc + radius * sin(a);
    if (i > 0) line(x1, y1, x, y);
    x1 = x; y1 = y;
}

または、ポイントを配列に保存して、DrawPolyルーチンがある場合はそれを呼び出すこともできます。

塗りつぶされたポリゴンが必要な場合は、FillPolyを呼び出します。

于 2009-11-25T04:22:06.827 に答える