Я должен нарисовать круг со следующим кодом
(проверьте, находится ли точка на окружности).
int rad=10;
// i=x,j=y
for (int j=ymid-rad;j<=ymid+rad;j++){
for (int i=xmid-rad;i<=xmid+rad;i++){
if (((i-xmid)*(i-xmid)+(j-ymid)*(j-ymid)) == rad*rad)
Image1->Canvas->Pixels[i][j]=clRed;
}
}
Однако он рисует только несколько точек круга.
Что я делаю неправильно?
Спасибо.
Вы делаете все это в целочисленной арифметике; имеются очень мало целочисленных решений в x^2 + y^2 == r^2
(для фиксированной r
).
Я предлагаю использовать что-то вроде алгоритм окружности средней точки вместо.
Версия на основе диапазона будет работать так:
bool RangeCheck(float val, float r1, float r2) {
return val >= r1 && val <= r2;
}
bool Circle(float x, float y, float rad) {
return RangeCheck(sqrtf(x*x+y*y), rad-0.8, rad+0.8);
}
bool CircleWithCenter(float x, float y, float cx, float cy, float rad) {
x-=cx; y-=cy;
return Circle(x,y,rad);
}
Этот диапазон диапазона позволяет рисовать изолинии в прогнозах погоды, но работает и для кругов.