1. Soit (x0,y0) approximation, la courbe intersecte nécessairement la « croix » de taille 1 centrée en (x0,y0). On utilise facilement l'interprétation géométrique pour montrer que toute intersection de la courbe avec la barre horizontale entraîne l'intersection avec la barre verticale.
      

    Soit donc le point (x0,y0) approximation, par le résultat précédent la courbe intersecte le segment unité centré en (x0,y0). On suppose que x0+1 appartient au domaine de f. Par hypothèse la courbe intersecte le segment unité centré en (x0,y0), et l'axe vertical x = x0+1 au point (x0+1, f(x0+1)).

    D'après l'interprétation géométrique, on voit que l'intersection avec la verticale x = x0+1 se situe nécessairement dans l'un des deux segments unité centrés en (x0+1, y0) ou (x0+1, y0-1) (soit y0-3/2 ≤ f(x0+1) ≤ y0+1/2 en formules).
    On devra donc allumer l'un des point (x0+1, y0) ou (x0+1, y0-1), pour savoir lequel il suffit de savoir si la courbe passe au dessus ou au dessus de leur milieu, (x0+1, y0-1/2). En règle générale on comparera f(x0+1) et y0-1/2.

  2. Dans le cas du cercle de rayon R centré à l'origine.

  3. static void cercle(int r) {
      
    int x = 0 ;
      
    int y = r ;

      
    while (x <= y) {
        pxl(x,y) ;
        
    double d = (x+1)*(x+1) + (y-0.5)*(y-0.5) - r*r ;
        x++ ;
        
    if (d > 0) { y-- ; }
      }
    }
    On notera que l'on évite la question de la limitation du domaine vers la droite. En effet, les raisonnements du 1. ne sont certainement pas tous valables pour le dernier point affiché.

  4. Pour éviter les multiplications il faut calculer incrémentalement la quantité d. Initialement on a d = 12 + (R-1/2)2 -R2 = 1+1/4 - R. On remarque ensuite qu'augmenter x de 1 revient à augmenter d de 2x + 3 et que diminuer y de 1 revient à diminuer y de 2y-2. En effet on a d'une part ((x+1)+1)2 - (x+1)2 = (2x + 3)(2-1) et ((y-1)-1/2)2 - (y-1/2)2 = (2y-2) (-3/2+1/2).

    Par ailleurs pour x et y entiers, e = d-1/4 est entier et les signes de d et e sont identiques. La nullité de e entraînant d = 1/4> 0. (C'est-à-dire que le cas e = 0 est en fait d > 0). On peut donc recoder la méthode cercle ainsi :
    static void cercle(int r) {
      
    int x = 0 ;
      
    int y = r ;
      
    int e = 1-r ;

      
    while (x <= y) {
        pxl(x,y) ;
        
    if (e >= 0) {
          y-- ; e -= 2*y ;
        }
        x++ ; e += 2*x+1 ;
      }
    }


  5. Le cas délicat concerne bien évidemment le dernier point gris (vers la droite) et en particulier les points allumes avec x0 = y0. Les rayons 3, 6, 7 et 10 montrent que l'on doit les allumer au moins quand le mouvement qui y aboutit est sud-est. Les rayons 4 et 11 encourageraient plutôt de les oublier.

    Enfin tous ces exemples semblent montrer que procéder à la marche du roi pour x0y0 produit bien une approximation de Freeman, mais il faut le montrer !

    On considère d'abord le cas où le dernier point allumé est de la forme (x0, x0+1). Par hypothèse le point (x0+1, x0+1) n'est pas allumé. Et donc le point milieu (x0+1, x0 + 1/2) est au dessus du cercle. Par symétrie selon la diagonale, le point (x0+1/2, x0 + 1) est également au dessus du cercle et le point (x0+1, x0+1) ne doit pas être allumé.
    (Les deux points milieu sont en noir, le dernier de la marche est en gris, et le point allumé par symétrie est en blanc.) Le dessin illustre le cas où le dernier point de la marche est au dessus de l'arc, mais le raisonnement ne fait pas intervenir cette hypothèse.

    Supposons maintenant que le dernier point allumé est sur la diagonale, c'est-à-dire qu'il est de la forme (x0, x0). On considère alors deux sous-cas.

  6. De façon générale, si (x,y) est un point de la marche du roi pour le cercle de rayon R centré sur l'origine, il faut allumer les huit points (xc+x, yc+y), (xc-y, yc+x), (xc-x, yc-y), (xc+y, yc-x) (correspondant au point de la marche translaté et à trois rotation d'un quart de tour) et (xc+y, yc+x), (xc-x, yc+y), (xc-y. xc-x), (xc+x, yc-y) (le symétrique selon la diagonale et trois rotation d'un quart de tour).

    Toutefois, il faut éviter la deuxième série de points dans les cas x=0 et x=y.

    On notera bien que c'est la conservation de l'approximation de Freeman par toutes ces isométries qui garantit que nous construisons bien une approximation de Freeman du cercle de rayon R centré en (xc, yc).