PHP : dessiner un disque dont la couleur varie avec le rayon

Le problème exposé dans ce sujet a été résolu.

Bonjour les zestes !

Je cherche à dessiner un disque de rayon fixé dont la couleur intérieure est linéairement dépendante de la distance au centre du disque.

Dans une image, la numérotation des pixels est telle que le pixel (0, 0) se situe en haut à gauche.
Pour dessiner un disque centré en (0, 0) et dessiné au milieu de l’image, je calcule un nouveau repère q.
Dans ce repère :

xq=xlargeur_imagex_q = x - largeur\_image
yq=yhauteur_imagey_q = y - hauteur\_image

À ma grande surprise, le résultat est très bizarre sur la droite :

 
 

Code source :

<?php

$width = 600;
$height = 350;

$im = imagecreatetruecolor($width, $height);

for ($x = 0; $x < $width; $x++)
{
    for ($y = 0; $y < $height; $y++)
    {
        // On place le point (0, 0) au centre de
        // l'image, ce qui donne le repère q.
        $qx = $x - $width/2;
        $qy = $y - $height/2;

        // $d : distance d'un point par apport
        // au centre (0, 0) dans le repère q
        $d = sqrt($qx*$qx + $qy*$qy);

        if ($d < 208.4)  // 0 ≤ $d ≤ 347.4
        {
            // Colorie un pixel en rouge d'intensité
            // linéairement dépendante de $d
            $color = imagecolorallocate($im, $d, 0, 0);

            // Trace une ligne de ($x, $y) au milieu de l'image
            imageline($im, $width/2, $height/2, $x, $y, $color);
        }
    }
}


header('Content-type: image/png');
imagepng($im);
imagedestroy($im);

Où pourrait se cacher l’erreur ?

Bonjour les zestes !

Je cherche à dessiner un disque de rayon fixé dont la couleur intérieure est linéairement dépendante de la distance au centre du disque.

Dans une image, la numérotation des pixels est telle que le pixel (0, 0) se situe en haut à gauche.
Pour dessiner un disque centré en (0, 0) et dessiné au milieu de l’image, je calcule un nouveau repère q.
Dans ce repère :

xq=xlargeur_imagex_q = x - largeur\_image
yq=yhauteur_imagey_q = y - hauteur\_image

À ma grande surprise, le résultat est très bizarre sur la droite :

 
 

Code source :

<?php

$width = 600;
$height = 350;

$im = imagecreatetruecolor($width, $height);

for ($x = 0; $x < $width; $x++)
{
    for ($y = 0; $y < $height; $y++)
    {
        // On place le point (0, 0) au centre de
        // l'image, ce qui donne le repère q.
        $qx = $x - $width/2;
        $qy = $y - $height/2;

        // $d : distance d'un point par apport
        // au centre (0, 0) dans le repère q
        $d = sqrt($qx*$qx + $qy*$qy);

        if ($d < 208.4)  // 0 ≤ $d ≤ 347.4
        {
            // Colorie un pixel en rouge d'intensité
            // linéairement dépendante de $d
            $color = imagecolorallocate($im, $d, 0, 0);

            // Trace une ligne de ($x, $y) au milieu de l'image
            imageline($im, $width/2, $height/2, $x, $y, $color);
        }
    }
}


header('Content-type: image/png');
imagepng($im);
imagedestroy($im);

Où pourrait se cacher l’erreur ?

Nuage

Salut,

Pourquoi tracer pour chaque point du cercle une ligne entre ce point et le centre du cercle ?

Pour moi c’est de là que vient l’erreur, en traçant les lignes les plus à droite, tu effaces les précédentes (c’est pour ça que ça n’affecte pas la moitié gauche, car les points les plus à droite sont les plus proches du centre).

Pour moi c’est de là que vient l’erreur, en traçant les lignes les plus à droite, tu effaces les précédentes (c’est pour ça que ça n’affecte pas la moitié gauche, car les points les plus à droite sont les plus proches du centre).

entwanne

Tu as raison, en remplaçant imageline par imagesetpixel, le code fonctionne.
Merci, je passe en résolu.

+0 -0

Pour moi c’est de là que vient l’erreur, en traçant les lignes les plus à droite, tu effaces les précédentes (c’est pour ça que ça n’affecte pas la moitié gauche, car les points les plus à droite sont les plus proches du centre).

entwanne

Tu as raison, en remplaçant imageline par imagesetpixel, le code fonctionne.
Merci, je passe en résolu.

Nuage

Ce n’est pas limité de faire ça en php ? je me souviens que l’absence d’anti-aliasing peut vite se faire ressentir.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte