c++ Bresenham ligne de l'algorithme dessine un arc de cercle et faites tourner
Je suis à la recherche de façon à rendre l'arc avec Bresenham ligne de l'algorithme. Cet algorithme de tirage cercle parfait, mais si j'ai besoin de tirer à l'arc (à partir de 0 à Pi) et le faire tourner de 30 degrés (par exemple)?
void DrawCircle(HDC hdc,int x0, int y0, int radius)
{
int x = 0;
int y = radius;
int delta = 2 - 2 * radius;
int error = 0;
while(y >= 0) {
//SetPixel(hdc,x0 + x, y0 + y,pencol);
SetPixel(hdc,x0 + x, y0 - y,pencol);
//SetPixel(hdc,x0 - x, y0 + y,pencol);
SetPixel(hdc,x0 - x, y0 - y,pencol);
error = 2 * (delta + y) - 1;
if(delta < 0 && error <= 0) {
++x;
delta += 2 * x + 1;
continue;
}
error = 2 * (delta - x) - 1;
if(delta > 0 && error > 0) {
--y;
delta += 1 - 2 * y;
continue;
}
++x;
delta += 2 * (x - y);
--y;
}
}
OriginalL'auteur PePe | 2011-12-09
Vous devez vous connecter pour publier un commentaire.
Pour obtenir 1/2 cercle (pi), qu'à appeler l'un de vos SetPixel routines. À votre arc de rotation de 30 degrés nécessite quelques trig. Vous pouvez laisser les au-dessus de la boucle de courir jusqu'à ce que votre rapport x/y est égal à tan(30°), puis démarrez réellement le dessin jusqu'à ce que votre ratio de frappe de la valeur à laquelle vous souhaitez vous arrêter. Pas de la manière la plus efficace, mais il faudra travailler. Pour obtenir le meilleur, vous auriez besoin de pré-calculer votre départ de 4 var valeurs. Vous pouvez prendre les valeurs à partir du dessus de l'exécuter et de les brancher comme valeurs de départ et qui serait très efficace.
Avez-vous eu l'algorithme ci-dessus à partir de Michael Abrash du Livre Noir des trucs? Si non, je serais google pour qu'un deuxième point de référence sur le fast-cercle/arc de dessin.
Bien, hélas, les ellipses, rip chapitre n'était pas inclus dans. Voici quelque chose que j'ai trouvé sur le web, qui se réclame de Abrash:
L'idée étant que vous dessinez un 8 le cercle à un moment x4 et puis retournez-le pour obtenir de l'autre 8ths dessinée. Continue à ne pas répondre directement à votre question. Travail sur...
Encore une fois, votre code ci-dessus devrait fonctionner, vous avez juste besoin de contrôler le début et la fin des conditions attentivement. Le y >= 0 doit devenir ce que l'axe serait à la fin de votre " arc " de la longueur et les valeurs de départ doivent être calculés de manière à être le début de votre arc.
Ce ne sera pas un simple tâche avec les choses comme elles sont. Peut-être plus facile d'utiliser une virgule flottante de routine à la place. Le calcul est beaucoup plus simple et les transformateurs ont tendance à gérer leur mieux maintenant que lorsque ces entier routines ont été conçus.
Hélas, c'est à partir de la programmation graphique livre dans un chapitre non inclus dans le livre noir. Je me suis souvenu de la lecture et de l'supposé qu'il serait dans la compilation de la version. Creuser autour sur le net pour maintenant...
Merci, mais j'ai préféré utiliser l'algorithme de Bresenham.
OriginalL'auteur Michael Dorgan
Si vous n'avez pas besoin pour assurer Bresenham, il est rapide pas introduite dans ce post, où vous pouvez définir le point central, point de départ et l'angle de l'arc. Il n'a pas besoin critère d'arrêt, car il est déjà inclus dans l'algorithme (par angle de l'arc). Ce qui fait qu'elle est la vitesse de calcul prévisionnel de la tangentielle et radiale facteurs de mouvement et le réel de la boucle n'a pas de trig appels de fonction, seulement multiplier, additionner et soustraire.
Autant que je sache, il y a trois types de méthodes:
A) augmentation comme Bresenham
B) diviser la méthode comme cette
C) Étape (ou segment) de la méthode
Je vais prendre une lente exemple de la méthode pas à pas (ne pas utiliser si la vitesse est importante):
La lenteur vient de cos et sin sont répétés (inutilement) en boucle. Ce problème peut être résolu par de précalculer cos et sin, comme décrit ci-dessus mentionné pour la poste. Cela signifie d'énormes speedup (moyenne 12x dans le top5 moteurs javascript).
J'ai fait un non complet-comparable speedtest de diverses cercle et arc algorithmes de dessin. Le Bresenham est rapide, mais le démarrage et l'arrêt critère logique doivent être ajoutés, ce qui ralentit l'algo un peu. Si vous avez vraiment besoin de Bresenham et de l'arc, je n'ai pas de solution toute prête pour cela et de ne pas trouvé encore. Il est sûrement possible. Par ailleurs, la méthode pas à pas à l'aide de pré-calculées trigs n'est pas si mal en performance par rapport à Bresenham (en javascript au moins). S'il vous plaît tester en c++ et rapport.
OriginalL'auteur Timo Kähkönen