2016-10-10 6 views
1

Je suis en train de dessiner une courbe entre deux points, en particulier, je laisse une photo de ce que je veux:Comment dessiner la courbe entre deux points? OpenGL

enter image description here

Cette image a été prise de cette pdf sur page 10.

Je comprends que cela applique le concept de Bresenham algorithm mais ne sais pas comment mettre en œuvre le concept de dessiner la courbe.

Sur page 11 du pdf pseudocode algorithm montré, mais ne comprennent pas le concept de "erreur" à mettre en œuvre. S'il vous plaît, si quelqu'un peut m'aider à comprendre cela. Je travaille avec C++ et OpenGL.

pseudocode:

set up x, y to x0, y0 
set up error variable exy for P(x0+1,y0+1) 
loop 
set pixel x, y 
    if ex + exy > 0 then increment x, sub difference error 
    if ey + exy < 0 then increment y, add difference error 
loop until end pixel 

Merci vous tous.

+4

"* Je comprends que cela applique le concept de l'algorithme de Bresenham, mais je ne sais pas comment implémenter le concept de dessiner la courbe. *" L'algorithme de Bresenham n'est pas pour dessiner des lignes, pas des courbes. Maintenant, vous pouvez utiliser l'algorithme de Bresenham pour dessiner une courbe en la divisant d'abord en un groupe de lignes. Mais c'est une question différente. –

+0

Alors allez chercher des splines cubiques et/ou quadratiques. Il y a des rames écrites sur le calcul des points sur chacun. Comme l'a dit Nicol - l'algorithme de Bresenham n'a pas (ou très peu, au mieux) d'utilisation pratique ici. – enhzflep

+0

L'algorithme de Bresenham pour les courbes est toujours uniquement pour une équation/type de courbe spécifique que vous dérivez au moment de la compilation/du code. donc si vous créez Bresenham pour l'ellipse, il dessine toujours juste l'ellipse. Cette limitation est inacceptable pour une forme de courbe arbitraire sans mentionner la subdivision par des points inflexes etc ... Utilisez plutôt des courbes cubiques. voir [Implémentation correcte de l'interpolation de spline cubique] (http://stackoverflow.com/a/20517874/2521214) Toutes les courbes cubiques sont traitées de la même manière, la seule différence est de savoir comment calculer les coefficients. – Spektre

Répondre

2

Ce document que vous avez cité dessine des courbes à partir d'un faible niveau d'abstraction pour essayer d'augmenter les performances. Normalement, quand vous allez dessiner des courbes, vous devez utiliser une abstraction plus élevée comme Beziers avec De Casteljau's algorithm que votre pdf mentionne à la page 22. Je l'ai fait en C++ et ce n'est pas dur du tout. Pomax a un awesome guide qui l'explique bien. Vous subdivisez essentiellement votre courbe jusqu'à ce que de nombreuses lignes droites semblent incurvées. Ensuite, vous dessinez toutes les lignes droites.

1

L'idée de cet algorithme est que vous définissez votre courbe par une fonction f(x, y) = 0. C'est-à-dire que la fonction f(x, y) doit renvoyer zéro pour les coordonnées (x, y) de tout point qui se trouve sur la courbe. Pour tout point qui ne se trouve pas sur la courbe, la fonction doit renvoyer une valeur différente de zéro, dont l'amplitude et le signe doivent indiquer respectivement la distance et la direction du point donné par rapport à la courbe. Cette valeur est appelée "erreur".

Ainsi, la valeur "erreur" pour n'importe quel pixel peut être calculée simplement en appelant f(x, y) pour les coordonnées (x, y) du pixel en question.