2010-08-30 5 views
10

je suis tombé cas particulier où je besoin pour produire la ligne ultra symétrique ou rayon dans la grille 2D dans l'ordre de (x0, y0) à (x1, y1) comme ceci:Algorithme de ligne ultra symétrique?

void drawSymmetricalLine(int x0, int y0, int x1, int y1) 
{ 
    // loop and handle each (x, y)... 
} 

Le problème réel réside dans les points où les algorithmes de dessin au trait populaires ne dessinent PAS les deux coordonnées (l'autre marqué comme x ci-dessous) car il semble s'épaissir, ce qui est souhaité dans mon cas. La performance n'est pas importante mais la simplicité.

Voici ce que je veux dire que les lignes ultra symétriques:

ox ooo 
oo  ooo 


o o 
o o 
    o o 
     o 

Répondre

4

Vous pouvez probablement utiliser Bresenham's line algorithm et modifier légèrement pour quand le changement étape pour déplacer la position de tirage au sort d'une rangée à l'autre vous peindre les deux l'avant et après les pixels sur l'axe des y pour l'axe des x actuel.

1

Si la simplicité est préférée à la performance, alors écrivez un algorithme récursif. A chaque étape, calculer DX = X1-X0 et DY = Y1-Y0.

Arrête la récursion lorsque DX = 0 ou DY = 0 (auquel cas votre ligne est verticale ou horizontale).

Sinon, calculez les deux points d'extrémité "intermédiaires", en fonction de la parité de DX et de DY, et tracez les deux demi-droites de façon récursive.

0

Utilisez Bresenham's line algorithm sauf lorsque vous tracez un point à (x0 + dx, y0 + dy), tracez également un point à (x1-dx, y1-dy). De cette façon, vous vous assurez qu'il est symétrique des deux côtés.

C'est un peu inefficace, mais vous avez dit que cela n'avait pas d'importance.

2

Rend deux fois la ligne, une fois de p0 à p1 et de nouveau de p1 à p0.

+0

C'est ce que je fais pour la ligne de vue symétrique dans les jeux. – Madmenyo

Questions connexes