29

n辺の正多角形を作成するためのx、yポイントを計算する簡単なプログラムを作成する方法を見つけようとしています。ポリゴンを描画する既存の関数を使用しないコード例を教えてもらえますか? プロセスを理解したいのですが、これは次のようなものだと思います。

  1. 半径と中心点から開始する角度をピックします
  2. どういうわけか、中心からその距離で x、y 位置を計算します (どのように?)
  3. 360 を辺の数で割り、その距離を移動して、最初の x、y ポイントから次の線を引きます
  4. angle=360 をその数値で割るまで続けます。

私の仮定が正しいと仮定すると、主なことは、x、y ポイントを計算する方法を理解することです。

ビジュアル ベーシック (または古いスタイルの Microsoft/Atari/Commodore BASIC) または英語で人間が読める一連の手順での回答を優先します。数式で答えなければならない場合は、私が読めるようにコンピューター言語で答えてください。C や C++ でも理解できますが、数学表記の読み方がわかりません。私が使用している言語は、線画以外のグラフィックス プリミティブがほとんどない Visual Basic ライクな言語です。

4

6 に答える 6

50

(0,0)を中心とする半径rのN辺のポリゴンを描画するとします。次に、n個の頂点は次のように与えられます。

x[n] = r * cos(2*pi*n/N)
y[n] = r * sin(2*pi*n/N)

ここで、0 <= n < Nです。cosここでは、sin度ではなくラジアンで動作していることに注意してください(これはほとんどのプログラミング言語でかなり一般的です)。

別の中心が必要な場合は、中心点の座標をそれぞれに追加するだけです(x [n]y [n])。別の向きが必要な場合は、一定の角度を追加するだけです。したがって、一般的な形式は次のとおりです。

x[n] = r * cos(2*pi*n/N + theta) + x_centre
y[n] = r * sin(2*pi*n/N + theta) + y_centre
于 2011-08-25T22:58:33.717 に答える
8
angle = start_angle
angle_increment = 360 / n_sides
for n_sides:
    x = x_centre + radius * cos(angle)
    y = y_centre + radius * sin(angle)
    angle += angle_increment

実際には、コーナーポイントを計算するだけでなく、線を描画する場合は、最初のポイントを繰り返してポリゴンを「結合」する必要もあります。

また、度ではなくラジアンで動作するsin()場合は、の代わりに必要です。cos()2 * PI360

于 2011-08-25T22:57:18.493 に答える
2

以下は、正多角形の点を出力する完全な C++ プログラムです。この場合、p は辺の数、r は多角形の半径、d は中心からの最初の点の方向または角度です。多分これが役立つでしょう。

//g++ ck.cpp -o ck && ./ck
#include <stdio.h>
#include <math.h>

int p=3; //number of sides
double r=1000,d=3/4.0;

int main()
{
 int i=0;
 double x,y,t;
 while(i<p)
 {
  t=2*M_PI*((double)i/p+d);
  x=cos(t)*r;
  y=sin(t)*r;
  printf("x%i:%f y%i:%f\n",i,x,i,y);
  i++;
 }
}
于 2012-04-15T02:59:14.630 に答える
2

エラーの蓄積を犠牲にして高速化したい場合は、(複雑な) プリミティブな 1 の n 乗根を使用し、その累乗を利用します (言語に組み込みの複素数サポートを使用するか、乗算を手動でコーディングします)。 . C:

complex double omega=cexp(2*M_PI*I/n), z;
for (i=0, z=1; i<n; i++, z*=omega) {
    /* do something with z */
}
于 2011-08-26T07:01:33.490 に答える
1

「for n_sides:」の答えが最も簡単です。複素数を使用して計算を簡素化できると提案した人にとって、ほとんどすべての数学ライブラリには、効率的な補間を備えたテーブルベースの cos() および sin() ルーチンがあるため、比較的あいまいなソリューションを掘り下げる必要はありません。通常、通常の n-gon を初期化して、OpenGL のハードウェア スケーリングを使用して特定のインスタンスのスケーリング/変換を行うことができます。

それについてハードコアになりたい場合は、必要なすべての n ゴンを事前に生成し、それらを頂点バッファーにロードします。

余談ですが、Luaでの上記のソリューションは次のとおりです。座標を出力するだけですが、もちろん配列/テーブルで座標を自由に返すことができます。返された座標は、OpenGL GL_LINE_LOOP メッシュ プリミティブを初期化するために使用できます。

require 'math'

-- computes coordinates for n-sided, regular polygon of given radius and start angle
-- all values are in radians

function polypoints(sides, radius, start)
    local x_center = 0.0
    local y_center = 0.0
    local angle = start
    local angle_increment = 2 * math.pi / sides
    local x=0.0
    local y=0.0

    print(string.format("coordinates for a %d sided regular polygon of radius %d\nVertex",sides,radius),"X"," ","Y")
    for i=1,sides do
        x = x_center + radius * math.cos(angle)
        y = y_center + radius * math.sin(angle)
        print(string.format("%d\t%f\t%f",i,x,y))
        angle = angle + angle_increment
    end
end

-- Generate a regular hexagon inscribed in unit circle 
polypoints(6, 1.0, 0.0)
于 2013-01-03T17:45:48.503 に答える
1

Visual Basic での回答を求められたことは承知していますが、ここに JavaScript での解決策があります

于 2012-07-04T20:47:04.353 に答える