Para obtener 1/2 círculo (a pi), solo llame a una de sus rutinas SetPixel. Para que su arco gire 30 grados requiere algo de trigonometría. Puedes dejar que el ciclo anterior se ejecute hasta que tu relación x/y sea igual a tan (30 grados), y luego empieces a dibujar realmente hasta que tu relación alcance el valor que deseas detener. No es la forma más eficiente, pero funcionará. Para hacerlo mejor, necesitarás precalcular tus valores iniciales de var. Puede tomar los valores de la ejecución anterior y conectarlos como valores iniciales y eso sería muy eficiente.
¿Obtuvo el algoritmo anterior de Michael Abrash's Black Book cosas? Si no, buscaría eso como segundo punto de referencia en el dibujo rápido de círculo/arco.
Bueno, por desgracia, las elipsis que rasgar el capítulo no se incluyeron allí. Aquí hay algo que encontré en la web que dice ser de Abrash:
/* 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);
}
}
La idea es dibujar un octavo del círculo en un x4 tiempo y luego se da la vuelta para conseguir las otras 8ths dibujados. Aún así, no responde directamente a tu pregunta. Trabajando en eso ...
De nuevo, su código anterior debería funcionar, solo necesita controlar las condiciones de inicio y finalización con cuidado. El y> = 0 necesita convertirse en lo que sea y cuando termine la longitud de su "arco" y los valores iniciales deben calcularse para que sean el inicio de su arco.
Esta no será una tarea sencilla con las cosas como son. Podría ser más fácil usar una rutina de punto flotante en su lugar. La matemática es mucho más directa y los procesadores tienden a manejarlos mejor ahora que cuando estas rutinas enteras fueron creadas.
Gracias, pensé que deberíamos cambiar la ecuación, pero mi versión no funcionó. ¿Podría dar ejemplo, por favor? Y no del Black Book de Michael Abrash. – PePe
Por desgracia, fue del libro de programación de gráficos en un capítulo no incluido en el libro negro. Recordé haber leído y asumí que estaría en la versión de compilación. Buscando en la red ahora ... –
Gracias, pero preferí usar el algoritmo de Bresenham. – PePe