Forums Développement Multimédia

Aller au contenu

- - - - -

Ellipses dans une grille

CODE Javascript

  • Vous ne pouvez pas répondre à ce sujet
Aucune réponse à ce sujet

#1 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 09 July 2017 - 16:48 PM

Bonjour,

C'est dimanche, je suis à plat...
Je cherche à dessiner des ellipses dans une grille en 2D.

Je suis parti de l'algorithme de Bresenham : http://rosettacode.o...ircle_algorithm
J'arrive à tracer des cercles, mais pas des ellipses, si vous avez une idée à propos d'un truc que j'aurai pu oublier...

Je calcule le radius avec une formule de calcul de la distance entre (x0,y0) centre du cercle et (x1,y1) position de la souris.

Je n'ai pas d'exemple de code de ce que j'ai fait à vous envoyer, c'est intégré dans un truc plus gros et j'ai trop la flemme de créer un exemple complet et fonctionnel.

Voilà néanmoins mon bout de code qui concerne cette partie :

// souris
let mx = e.pageX;
let my = e.pageY;

let that = this;

// centre du cercle
let x0 = this.rectTool.x;
let y0 = this.rectTool.y;
let radius = parseInt(Math.sqrt((my-y0)*(my-y0)+(mx-x0)*(mx-x0)));

// l'algo commence ici
var px = radius-1;
var py = 0;
var dx = 1;
var dy = 1;
var decisionOver2 = dx - (radius << 1);   // Decision criterion divided by 2 evaluated at x=r, y=0

// écriture dans la grille
var drawPixel = function (ppx,ppy) {
        that.toolcanvasgrid[ppx+ppy*C] = tileSelected.id;
};

while (px >= py) {
        drawPixel(px + x0, py + y0);
        drawPixel(py + x0, px + y0);
        drawPixel(-px + x0, py + y0);
        drawPixel(-py + x0, px + y0);
        drawPixel(-px + x0, -py + y0);
        drawPixel(-py + x0, -px + y0);
        drawPixel(px + x0, -py + y0);
        drawPixel(py + x0, -px + y0);
        if (decisionOver2 <= 0) {
                py++;
                decisionOver2 += dy; // Change in decision criterion for y -> y+1
                dy += 2;
        }
        if (decisionOver2 > 0) {
                px--;
                dx += 2;
                decisionOver2 += (-radius << 1) + dx; // Change for y -> y+1, x -> x-1
        }
}

Merci :)



EDIT : bah en l'écrivant je pense avoir mis le doigt sur le problème, c'est le radius qui semble poser souci, calculé comme je l'ai fait ca donne un cercle, il est égal partout...


EDIT 2 : je crois avoir trouvé la réponse ici : https://sites.google...awing-algorithm


EDIT 3 : bon ça marche, y a mieux comme infos ici : http://enchantia.com...h/ellipses.html



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)