小さな円を描くような円弧状の円で配列をループする必要がありますが、すべてのアルゴリズムでは配列の重複インデックスをチェックします(それは同じxとyを何度も持っている)。 私は半径が3で、円の形が28要素(塗りつぶされていません)ですが、アルゴリズムは360回反復します。私は何かをする前にxまたはyが変化するかどうかを確認できますが、それは不自由です。繰り返しインデックスのない円の配列をループする
今マイコード:
for (int radius = 1; radius < 6; radius++)
{
for (double i = 0; i < 360; i += 1)
{
double angle = i * System.Math.PI/180;
int x = (int)(radius * System.Math.Cos(angle)) + centerX;
int y = (int)(radius * System.Math.Sin(angle)) + centerY;
// do something
// if (array[x, y]) ....
}
}
PS:私は、半径が6まで2から始めて、そして彼の円が、それは本当ではないので、必ずしもすべての指数は、得られるインクリメントする必要があるので、私は、中間点サークルを使用することはできません(三角法による)
EDIT: 私が本当に必要とするのは、中心から始まるエッジで完全な円エッジをスキャンすることです。
360のステップ(それはすべての座標を取得します):中点サークルや他のアルゴリズムスキップの手順を使用して
for (int radius = 2; radius <= 7; radius++)
{
for (double i = 0; i <= 360; i += 1)
{
double angle = i * System.Math.PI/180;
int x = (int)(radius * System.Math.Cos(angle));
int y = (int)(radius * System.Math.Sin(angle));
print(x, y, "X");
}
}
(座標行方不明):
for (int radius = 2; radius <= 7; radius++)
{
int x = radius;
int y = 0;
int err = 0;
while (x >= y)
{
print(x, y, "X");
print(y, x, "X");
print(-y, x, "X");
print(-y, x, "X");
print(-x, y, "X");
print(-x, -y, "X");
print(-y, -x, "X");
print(y, -x, "X");
print(x, -y, "X");
y += 1;
err += 1 + 2 * y;
if (2 * (err - x) + 1 > 0)
{
x -= 1;
err += 1 - 2 * x;
}
}
}
なぜ三角法をすべてやっていますか? Bresenhamのアルゴリズムを使うだけであれば、それはより速くなり、問題を解決します(開始と終了に注意する限り)。 [Wikipedia](https://en.wikipedia.org/wiki/Midpoint_circle_algorithm)はあなたの友人です。 –
私はエッジで完全な円のエッジをスキャンする必要があるので。 Bresenhamのアルゴリズムはすべての座標を取得せず、いくつかのインデックスを残しています。 – Possoli
質問を「編集」して、「すべての座標」の意味を説明してください。Bresenhamのアルゴリズムは、すべての* x *とすべての* y *に対して少なくとも1回停止します。あなたが欠けていると思われる値は明確ではありません。 –