Newsgroup: it.comp.www.php
Titolo: OT - Metodo per disegnare un solido 3D via PHP

Buongiorno NG
Avrei bisogno di ottenere a video la forma di un cartone che abbia le
3 misure prelevate da un'anagrafica.
Conoscete qualche metodo in particolare?
Con flash riesco ad ottenere dei grafici ma per il caso non ho trovato
nulla.
Grazie
Alex



Cercando con "php 3d" su Google saltano fuori diversi risultati, dalle 
estensioni alle classi.
Se vuoi stare sull'"ufficialmente supportato" puoi usare o scriverti una 
classe che usi le libgd e ti smazzi tu il lavoro di assonometria e di 
cancellare le linee nascoste, oppure puoi preparare un file per esempio 
per POV o per Blender e fartelo renderizzare da loro tramite system()
L'alternativa credo possa essere quella di usare le funzioni swf, ma non 
ne so molto, e potrebbe dare gli stessi problemi delle due soluzioni qui 
sopra.
Bye.

Conoscete qualche metodo in particolare?
Devi solo disegnare sei triangoli (o dodici triangoli con un lato
parallelo all'asse X, se vuoi usare il fill semplificato - non so
pero' se PHP abbia gia' un buon fill suo, nel qual caso, ti basta
disegnare tre quadrilateri).
Immagino che tu non lo voglia anche ruotare o roba simile, o si'?
Nel caso che no, chiamiamo A il punto piu' basso dell'immagine, e
vertice dei due quadrilateri corrispondenti ai lati del cartone.
Siano Ax e Ay ($Ax e $Ay) le sue coordinate. Siano W, H, e D (per
Width, Height, Depth) le misure del cartone.
Siano alpha e beta i due angoli della proiezione (puoi prendere -
per prova - 15 gradi e 30 gradi, o 15 e 30. Pero', vanno espressi
in radianti, credo, quindi non 15 ma 15*3.14159/180.0).
Il punto B è a coordinate (Ax, Ay-H), e il punto C è a coordinate
(Ax - W cos alpha, Ay-H-W sin alpha). E D e' a coordinate (Ax - W
cos alpha, Ay-W sin alpha). ABCD e' il primo quadrilatero. ABEF è
costruito analogamente con E = (Ax + D cos beta, Ay-H-D sin beta)
e F = (Ax + D cos beta, Ay-D sin beta). In pratica, alpha diventa
beta, e i termini in coseno cambiano di segno. L'ultimo punto che
costituisce il quadrilatero BCGE, G, è a coordinate Ax+D cos beta
-W cos alpha, Ay - H - D sin beta - W sin alpha.
Quando hai completato un quadrilatero, visto che e' convesso, non
hai che da calcolare il baricentro e in quel punto far partire un
floodfill con il colore desiderato.
Leonardo
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

-W cos alpha, Ay - H - D sin beta - W sin alpha.
Oh, 'un ci credo, ho azzeccato tutti i seni e i coseni. Domani piove
napalm, è pacifico.
<?php
        $Ax     = 320; $Ay      = 240;
        $W      = 100; $D       =  90; $H       =  50;
        $alpha  = 15; $beta     = 30;
        $alpha  *= 3.14159/180.0; $beta *= 3.14159/180.0;
        $quad   = array(
                'A'     => array($Ax, $Ay),
                'B'     => array($Ax, $Ay-$H),
                'C'     => array($Ax - $W*cos($alpha),
$Ay-$H-$W*sin($alpha)),
                'D'     => array($Ax - $W*cos($alpha), $Ay
-$W*sin($alpha)),
                'E'     => array($Ax + $D*cos($beta ), $Ay-$H-$D*sin($beta
)),
                'F'     => array($Ax + $D*cos($beta ), $Ay   -$D*sin($beta
)),
                'G'     => array($Ax + $D*cos($beta )-$W*cos($alpha),
$Ay-$H-$D*sin($beta)-$W*sin($alpha)),
        );
        function quadri($gd, $vertici, $color)
        {
                list($x1, $y1)  = array_shift($vertici);
                $vertici[]      = array($x1, $y1);
                $cx             = 0;
                $cy             = 0;
                foreach($vertici as $vertice)
                {
                        list($x2, $y2) = $vertice;
                        ImageLine($gd, $x1, $y1, $x2, $y2, $color);
                        $x1     = $x2;
                        $y1     = $y2;
                        $cx     += $x1;
                        $cy     += $y1;
                }
                $cx /= 4.0;
                $cy /= 4.0;
                ImageFill($gd, $cx, $cy, $color);
        }
        $box    = ImageCreateTrueColor(640, 480);
        ImageFilledRectangle($box, 0, 0, ImageSX($box), ImageSY($box),
ImageColorAllocate($box, 255, 255, 255));
        quadri($box, array($quad['A'],$quad['B'],$quad['C'],$quad['D']),
ImageColorAllocate($box, 255, 0, 0));
        quadri($box, array($quad['A'],$quad['B'],$quad['E'],$quad['F']),
ImageColorAllocate($box, 0, 255, 0));
        quadri($box, array($quad['B'],$quad['E'],$quad['G'],$quad['C']),
ImageColorAllocate($box, 0, 0, 255));
        Header("Content-Type: image/png");
        ImagePNG($box);
?>


Sto veramente incasinato... domani se posso vedo di analizzare per
adesso un GRAZIE generale per i feedback.
Alex

Mostruoso....
Grazie