Чтобы получить 1/2 круга (в пи), вызовите только одну из ваших подпрограмм SetPixel. Чтобы ваша дуга повернулась на 30 градусов, требуется триггер. Вы можете позволить приведенному выше циклу работать до тех пор, пока ваше отношение x/y не станет равным tan (30 градусов), а затем начать рисовать, пока ваше отношение не достигнет значения, на котором вы хотите остановиться. Не самый эффективный способ, но сработает. Чтобы сделать это лучше, вам нужно предварительно рассчитать начальные 4 значения var. Вы можете взять значения из приведенного выше запуска и вставить их в качестве начальных значений, и это будет очень эффективно.
Вы получили приведенный выше алгоритм от Чёрная книга Майкла Абраша? Если нет, я бы погуглил это как вторую точку отсчета при быстром рисовании круга/дуги.
Ну, увы, эллипсов, которые отрывают главу, там не было. Вот кое-что, что я нашел в Интернете, которое утверждает, что оно от Абраша:
/* One of Abrash's ellipse algorithms */
void draw_ellipse(int x, int y, int a, int b, int color)
{
int wx, wy;
int thresh;
int asq = a * a;
int bsq = b * b;
int xa, ya;
draw_pixel(x, y+b, color);
draw_pixel(x, y-b, color);
wx = 0;
wy = b;
xa = 0;
ya = asq * 2 * b;
thresh = asq / 4 - asq * b;
for (;;) {
thresh += xa + bsq;
if (thresh >= 0) {
ya -= asq * 2;
thresh -= ya;
wy--;
}
xa += bsq * 2;
wx++;
if (xa >= ya)
break;
draw_pixel(x+wx, y-wy, color);
draw_pixel(x-wx, y-wy, color);
draw_pixel(x+wx, y+wy, color);
draw_pixel(x-wx, y+wy, color);
}
draw_pixel(x+a, y, color);
draw_pixel(x-a, y, color);
wx = a;
wy = 0;
xa = bsq * 2 * a;
ya = 0;
thresh = bsq / 4 - bsq * a;
for (;;) {
thresh += ya + asq;
if (thresh >= 0) {
xa -= bsq * 2;
thresh = thresh - xa;
wx--;
}
ya += asq * 2;
wy++;
if (ya > xa)
break;
draw_pixel(x+wx, y-wy, color);
draw_pixel(x-wx, y-wy, color);
draw_pixel(x+wx, y+wy, color);
draw_pixel(x-wx, y+wy, color);
}
}
Идея в том, что вы рисуете 8-й круг за время x4, а затем переворачиваете, чтобы нарисовать остальные 8-е. Тем не менее, это не дает прямого ответа на ваш вопрос. Работая над этим...
Опять же, ваш код выше должен работать, вам просто нужно тщательно контролировать начальные и конечные условия. Значение y >= 0 должно стать таким, каким будет значение y после завершения длины вашей «дуги», а начальные значения должны быть рассчитаны как начало вашей дуги.
Это не будет прямой задачей с вещами, как они есть. Вместо этого может быть проще использовать процедуру с плавающей запятой. Математика гораздо более прямолинейна, и процессоры, как правило, справляются с ней лучше, чем когда эти целочисленные подпрограммы были созданы.
person
Michael Dorgan
schedule
09.12.2011