我需要循環遍歷一個小圓弧的圓弧形數組(像像素繪製一個圓圈一樣),但是我試過的所有算法都檢查數組的重複索引(它有幾次相同的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:我不能使用中點畫圓,因爲我需要增加半徑從2至6,得到不是每個指標,因爲他的圈子裏是不是真的(根據三角)
編輯: 我真正需要的是從中心開始掃描一個完整的圓形邊緣。
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 *至少停止一次。目前還不清楚你認爲你錯過了哪些價值。 –