PHP изометрический куб с GD

Мне нужно создать что-то подобное с PHP и GD:

3D-изометрический куб

Три видимых лица будут состоять из трех частей одного и того же изображения, из которых я знаю координаты.

Я полагаю, что это можно сделать с преобразованиями изображений и некоторыми математиками.

Вращение куба всегда будет одинаковым.

Мне не нужны «ударные» края и освещение лица, как в этой картине, мне просто нужен «бесшумный» куб.

Наконец, результатом должен быть альфа-прозрачный PNG.

PS У меня только GD на моем хосте, у меня нет доступа к ImageMagick.

Solutions Collecting From Web of "PHP изометрический куб с GD"

вы ищете что-то вроде этого?

 <?php $size=100; $first_poligon = array( 0, $size/4, // Point 1 (x, y) ----> 0,20 $size/2, $size/2, // Point 2 (x, y) ----> 50,50 $size/2, $size, // Point 3 (x, y) ----> 50,100 0, ($size/4)*3, // Point 4 (x, y) ----> 0,60 ); $second_poligon = array( 0, $size/4, // Point 1 (x, y) ----> 0,33 $size/2, 0, // Point 2 (x, y) ----> 50,0 $size, $size/4, // Point 3 (x, y) ----> 100,20 $size/2, $size/2, // Point 4 (x, y) ----> 50,50 ); $third_poligon = array( $size, $size/4, // Point 1 (x, y) ----> 100,20 $size/2, $size/2, // Point 2 (x, y) ----> 50,50 $size/2, $size, // Point 3 (x, y) ----> 50,100 $size, ($size/4)*3, // Point 4 (x, y) ----> 100,60 ); $im = imagecreatetruecolor($size, $size); $fondo = imagecolorallocate($im, 51, 0, 0); imagefilledrectangle($im, 0, 0, $size, $size, $fondo); $blue = imagecolorallocate($im, 0, 0, 255); $white = imagecolorallocate($im, 255, 255, 255); $red = imagecolorallocate($im, 255, 0, 0); imagefilledpolygon($im, $first_poligon, 4, $blue); imagefilledpolygon($im, $second_poligon, 4, $white); imagefilledpolygon($im, $third_poligon, 4, $red); imagepng($im, './image.png'); imagedestroy($im); ?> <img src="image.png" > 

Результат изображения:

введите описание изображения здесь

Начиная с ответа крайсака , сделайте следующее:

Чтобы использовать изображения вместо цветов, замените эти строки:

 $blue = imagecolorallocate($im, 0, 0, 255); $white = imagecolorallocate($im, 255, 255, 255); $red = imagecolorallocate($im, 255, 0, 0); 

а также

 imagefilledpolygon($im, $first_poligon, 4, $blue); imagefilledpolygon($im, $second_poligon, 4, $white); imagefilledpolygon($im, $third_poligon, 4, $red); 

Что-то вроде этого (этот пример предназначен только для одного из трех лиц):

  1. Для PNG:

     function LoadPNG($imgname) { /* Attempt to open */ $im = @imagecreatefrompng($imgname); /* See if it failed */ if(!$im) { /* Create a blank image */ $im = imagecreatetruecolor(150, 30); $bgc = imagecolorallocate($im, 255, 255, 255); $tc = imagecolorallocate($im, 0, 0, 0); imagefilledrectangle($im, 0, 0, 150, 30, $bgc); /* Output an error message */ imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc); } return $im; } header('Content-Type: image/png'); $img = LoadPNG('bogus.image'); 
  2. Вместо:

      $blue = imagecolorallocate($im, 0, 0, 255) 

    Вы будете использовать:

      $cube_face_1 = imagepng($img); 
  3. И вместо:

     imagefilledpolygon($im, $first_poligon, 4, $blue); 

    Вы будете использовать:

     imagefilledpolygon($im, $first_poligon, 4, $cube_face_1); 

Источник : http://php.net/manual/en/book.image.php

На приведенной выше ссылке вы можете найти подробную информацию о изображениях gif / jpeg. Моя демонстрация предназначена для изображений png.

я не могу позволить этой проблеме победить меня … (также я хочу помочь вам, но не так много: P), поэтому я сделал этот код litle, который разрешает почти 70% вашей проблемы:

  <?php $size=200; $im= imagecreatetruecolor($size,$size); $orige = imagecreatefrompng("test2.png"); $orige2 = imagecreatefrompng("tesst3.png"); $limit=0; $newlimit=0; for($y=$size/4;$y<=$size;$y++){ for($x=0;$x<=$size/2;$x++){ if($y>($size/4)*3){ if( $x>=$newlimit){ copy_pixel($im,$orige,$x,$y,NULL); //copy left image copy_pixel($im,$orige2,$x,$y,$size-$x); //copy rightimage } } else{ copy_pixel($im,$orige,$x,$y,NULL); //copy left image copy_pixel($im,$orige2,$x,$y,$size-$x); //copy rightimage } if($x==$limit and $limit<= $size/2){ $limit=$limit+2; break;} } if($y>=($size/4)*3)$newlimit=$newlimit+2; } imagepng($im, "n.png"); function copy_pixel($im,&$orige,$x,$y,$newx){ if($newx==NULL) $newx=$x; $rgb = imagecolorat($orige, $x, $y); $color = imagecolorsforindex($orige, $rgb); $red=preg_replace("/[^0-9]/","",$color["red"]); $green=preg_replace("/[^0-9]/","",$color["green"]); $blue=preg_replace("/[^0-9]/","",$color["blue"]); $color_to_paste = imagecolorallocate($im, $red, $green, $blue); imagesetpixel($im,$newx, $y, $color_to_paste); } ?> <img src="n.png" > 

и результат: справа – изображение, сделанное предыдущим кодом. введите описание изображения здесь