Per ottenere 1/2 cerchio (in pi), chiamare solo una delle routine di SetPixel. Per far ruotare il tuo arco di 30 gradi è necessario un certo trigbo. Potresti lasciare che il ciclo precedente funzioni finché il tuo rapporto x/y è uguale a tan (30 gradi), quindi inizia effettivamente a disegnare finché il tuo rapporto non raggiunge il valore a cui vuoi fermarti. Non è il modo più efficiente, ma funzionerà. Per migliorarlo, è necessario calcolare preventivamente i 4 valori var iniziali. Puoi prendere i valori dalla corsa precedente e collegarli come valori iniziali e sarebbe molto efficiente.
Hai ricevuto l'algoritmo di cui sopra dal materiale Michael Abrash's Black Book? In caso contrario, mi piacerebbe google per questo come un secondo punto di riferimento sul disegno circolare/arco veloce.
Beh, ahimè, le ellissi che strappano il capitolo non sono state incluse. Ecco qualcosa che ho trovato sul web che sostiene di essere da 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);
}
}
L'idea è che si disegna un 8 ° del cerchio in un x4 volta e poi capovolgere per ottenere le altre 8ths disegnati. Tuttavia, non risponde direttamente alla tua domanda. Lavorando su questo ...
Ancora, il codice sopra dovrebbe funzionare, devi solo controllare attentamente le condizioni di partenza e di arrivo. Il y> = 0 deve diventare qualsiasi cosa che avresti dopo aver terminato la tua lunghezza 'arco' e i valori iniziali devono essere calcolati per essere l'inizio dell'arco.
Questo non sarà un compito semplice con le cose come sono. Potrebbe essere più semplice usare una routine a virgola mobile. La matematica è molto più semplice e i processori tendono a gestirli meglio ora rispetto a quando queste routine intere sono state create.
Grazie, ho pensato che dovremmo cambiare l'equazione, ma la mia versione non ha funzionato. Potresti dare un esempio per favore? E non dal libro nero di Michael Abrash. – PePe
Purtroppo, è stato dal libro di programmazione grafica in un capitolo non incluso nel libro nero. Mi sono ricordato di aver letto e ho pensato che sarebbe stato nella versione della compilation. Scavando sulla rete adesso ... –
Grazie, ma ho preferito usare l'algoritmo di Bresenham. – PePe