Login   Register  
PHP Classes
elePHPant
Icontem

File: logo.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Dr Zhihua Lai  >  Logo Interpreter  >  logo.php  >  Download  
File: logo.php
Role: Class source
Content type: text/plain
Description: Handle with PHP Image using Logo Commands
Class: Logo Interpreter
Logo language interpreter
Author: By
Last change: reserve pe
Date: 2 years ago
Size: 24,715 bytes
 

Contents

Class file image Download
<?php
	
  // License: GNU General Public License (GPL) 
  // class.logo.php
  // @ver 0.1

  // Author: Zhihua Lai
  // Example URL: http://www.zhihua-lai.com/?do=Software.Logo

  // This class is used to do simple Logo Command to a 
  // Image in PHP
  
  error_reporting(E_ALL);

  define('LOGO_WRAP',0);
  define('LOGO_FENCE',1);
  define('LOGO_WINDOW',2);
  
  class Logo
  {
      // X,Y Coordinates
      var $_x;
      var $_y;
      // Image Handler
      var $_im;
      // Width & Height
      var $_imagex;
      var $_imagey;
      var $_half_ix;
      var $_half_iy;
      // Colors
      var $_pc;
      var $_fc;
      var $_sc;
      // Turtle status
      var $_draw;
      var $_d;
      var $_st;
      // Fonts
      var $_font;
      var $_fontw;
      var $_fonth;
      // Window
      var $_win;
      
      function Logo(&$im, $r=255, $g=255, $b=255, $width=720, $height=600)
      {
          if (!$im)
          {
              $im=imagecreate($width,$height);
          }
          $this->_im=$im;
          $this->_imagex=imagesx($im);
          $this->_imagey=imagesy($im);
          $this->_half_ix=$this->_imagex*0.5;
          $this->_half_iy=$this->_imagey*0.5;
          $this->_d=0;
          $this->_draw=true;
          $this->_sc=imagecolorallocate($im, $r, $g, $b);
          imagefill($im, 0, 0, $this->_sc);
          $this->_fc=imagecolorallocate($im, 0, 0, 255);
          $this->_pc=imagecolorallocate($im, 0, 0, 0);
          $this->_win=LOGO_WINDOW;
          $this->_x=0;
          $this->_y=0;
          $this->_st=true;
          $this->_font=4;
          $this->_fontw=imagefontwidth(4);
          $this->_fonth=imagefontheight(4);
      }
      
      function getFont()
      {
          return ($this->_font);
      }
      
      function isTrueColor()
      {
          return (imageistruecolor($this->_im));
      }
      
      function setFont($d)
      {
          $d=(integer)$d;
          if ($d<1) $d=1;
          if ($d>5) $d=5;
          $this->_font=$d;
          $this->_fontw=imagefontwidth($d);
          $this->_fonth=imagefontheight($d);
      }
      
      public static function getRGB($rgb, &$r, &$g, &$b)
      {
          $rgb=(integer)$rgb;
          $r = ($rgb >> 16) & 0xFF;
          $g = ($rgb >> 8) & 0xFF;
          $b = $rgb & 0xFF;
      }
      
      function printText($x, $y, $s, $font=0)
      {
          $x=$this->getIXd($x);
          $y=$this->getIYd($y);
          if ($font)
          {
              imagestring($this->_im, $font, $x, $y, $s, $this->_pc);
          }
          else
          {
              imagestring($this->_im, $this->_font, $x, $y, $s, $this->_pc);
          }
          return ($this->_fonth);
      }
      
      function printTextUp($x, $y, $s, $font=0)
      {
          $x=$this->getIXd($x);
          $y=$this->getIYd($y);
          if ($font)
          {
              imagestringup($this->_im, $font, $x, $y, $s, $this->_pc);
          }
          else
          {
              imagestringup($this->_im, $this->_font, $x, $y, $s, $this->_pc);
          }
          return ($this->_fontw);
      }
      
      function getImageX()
      {
          return $this->_imagex;
      }
      
      function getImageY()
      {
          return $this->_imagey;
      }
      
      function getImageHX()
      {
          return $this->_half_ix;
      }
      
      function getImageHY()
      {
          return $this->_half_iy;
      }
      
      function st()
      {
          $this->_st=true;
      }
      
      function ht()
      {
          $this->_st=false;
      }
      
      function getTurtle()
      {
          return ($this->_st);
      }
      
      function drawTurtle()
      {
          if ($this->_st)
          {
              $t=$this->_draw;
              $this->_draw=true;
              $this->arc(360, 3);
              $this->_draw=$t;
          }
      }
      
      function home()
      {
          $this->_d=0;
          $this->lineTo(0,0,true);
      }
      
      function getD()
      {
          return ($this->_d);
      }
      
      function setD($d)
      {
          $d=round($d);
          $this->_d=$d;
      }
      
      function dot()
      {
          if ($this->_draw)
          {
              imagesetpixel($this->_im, $this->getIX(), $this->getIY(), $this->_pc);
          }
      }
      
      function dotxy($x, $y)
      {
          if (!$this->_draw) return;
          $dr=$this->_draw;
          $dx=$this->_x;
          $dy=$this->_y;
          $this->pu();
          $this->setXY($x, $y);
          $this->_draw=$dr;
          $this->dot();
          $this->_x=$dx;
          $this->_y=$dy;
      }
      
      function cs()
      {
          //$this->clean();
          $this->setXY(0,0);
          $this->_d=0;
          $this->getRGB($this->_sc, $r, $g, $b);
          $this->_sc=imagecolorallocate($this->_im, $r, $g, $b);
      }
      
      function setWrap($d)
      {
          $d=(integer)$d;
          switch ($d)
          {
              case LOGO_FENCE: $this->_win=LOGO_FENCE; break;
              case LOGO_WINDOW: $this->_win=LOGO_WINDOW; break;
              case LOGO_WRAP: $this->_win=LOGO_WRAP; break;
              default: $this->_win=LOGO_WINDOW; break;
          }
          if (($d == LOGO_WRAP)||($d == LOGO_FENCE))
          {
              if ($this->isOut())
              {
                  $this->_x=0;
                  $this->_y=0;
              }
              return;
          }
      }
      
      function isWrap()
      {
          return ($this->_win);
      }
      
      function wrapX($x)
      {
          $this->_crossPoint($this->_x, $this->_y, $x, $this->_y, $nx, $ny);
          return ($nx);
      }
      
      function wrapY($y)
      {
          $this->_crossPoint($this->_x, $this->_y, $this->_x, $y, $nx, $ny);
          return ($ny);
      }
      
      function setX($x)
      {
          $x=round($x);
          $this->_x=$this->wrapX($x);
      }
      
      function setY($y)
      {
          $y=round($y);
          $this->_y=$this->wrapY($y);
      }
      
      function setXY($x,$y)
      {
          $this->_crossPoint($this->_x, $this->_y, $x, $y, $this->_x, $this->_y);
      }
      
      function getX()
      {
          return ($this->wrapX($this->_x));
      }
      
      function getY()
      {
          return ($this->wrapY($this->_y));
      }
      
      function getIXd($d)
      {
          $d=round($d);
          return ($this->wrapX($d)+$this->_half_ix);
      }
      
      function getIYd($d)
      {
          $d=round($d);
          return ($this->wrapY($d)+$this->_half_iy);
      }
      
      function getIX()
      {
          return ($this->getX()+$this->_half_ix);
      }
      
      function getIY()
      {
          return ($this->getY()+$this->_half_iy);
      }
      
      function togglePenStatus()
      {
          $this->_draw=!$this->_draw;
      }
      
      function penStatus()
      {
          return ($this->_draw);
      }
      
      function drawLine($x1,$y1,$x2,$y2)
      {
          $k=$this->_draw;
          $this->pd();
          $ox=$this->_x;
          $oy=$this->_y;
          $this->setXY($x1,$y1);
          $this->lineTo($x2,$y2);
          $this->setXY($ox,$oy);
          $this->_draw=$k;
      }
      
      function jump($d)
      {
          $k=$this->_draw;
          $this->pu();
          $this->fd($d);
          $this->_draw = $k;          
      }
      
      function jmp($d)
      {
          $this->jump($d);
      }
      
      function turn($d)
      {
          $this->rt($d);
      }
      
      function arc($a, $r)
      {
          $a=round($a) % 360;
          $r=round($r);
          $s=90;
          $e=$s+$a;
          if ($r<0)
          {
              $r=-$r;
              $s=270;
              $e=$s+$a;
          }          
          if ($e<$s)
          {
              $t=$e;
              $e=$s;
              $s=$t;
          }
          $s+=$this->_d;
          $e+=$this->_d;
          if ($this->_draw)
          {
              imagearc($this->_im, $this->getIX(), $this->getIY(),
              $r*2, $r*2, $s, $e, $this->_pc);
          }
      }
      
      function isOutXY($x, $y)
      {
          return ( ($x>$this->_half_ix) || ($x<-$this->_half_ix) ||
          ($y>$this->_half_iy) || ($y<-$this->_half_iy));
      }
      
      function isOut()
      {
          return ($this->isOutXY($this->_x, $this->_y));
      }
      
      function isIn()
      {
          return (!$this->isOut());
      }
      
      function isInXY($x, $y)
      {
          return (!$this->isOutXY($x, $y));
      }
      
      function _crossPoint($sx, $sy, $ex, $ey, &$fx, &$fy)
      {
          if ($this->_win == LOGO_WINDOW)
          {
              $fx=$ex;
              $fy=$ey;
              return;
          }
          if (!$this->isOutXY($ex, $ey))
          {
              $fx=$ex;
              $fy=$ey;
              return;
          }
          $k2=$ey-$sy;
          $k1=$ex-$sx;
          if ($this->_win == LOGO_FENCE)
          {
              if ($k2 == 0)
              {
                  $fy=$ey;
                  if ($ex>=$sx)
                  {
                      $fx=$this->_half_ix;
                  }
                  else
                  {
                      $fx=-$this->_half_ix;
                  }
                  return;
              }
              if ($k1 == 0)
              {
                  $fx=$ex;
                  if ($ey>=$sy)
                  {
                      $fy=$this->_half_iy;
                  }
                  else
                  {
                      $fy=-$this->_half_iy;
                  }
                  return;
              }
              $k=$k2/$k1;
              $x1=$this->_half_ix;
              $x2=-$this->_half_ix;
              $y1=$k*($x1-$sx)+$sy;
              $y2=$k*($x2-$sx)+$sy;
              $y3=$this->_half_iy;
              $y4=-$this->_half_iy;
              $x3=($y3-$sy)/$k+$sx;
              $x4=($y4-$sy)/$k+$sx;
              if (($ey>=$sy)&&($ex>=$sx))
              {
                  if (!$this->isOutXY($x1, $y1))
                  {
                      $fx=$x1;
                      $fy=$y1;
                      return;
                  }
                  else
                  {
                      $fx=$x3;
                      $fy=$y3;
                      return;
                  }
              }
              if (($ey>=$sy)&&($ex<=$sx))
              {
                  if (!$this->isOutXY($x2, $y2))
                  {
                      $fx=$x2;
                      $fy=$y2;
                      return;
                  }
                  else
                  {
                      $fx=$x3;
                      $fy=$y3;
                      return;
                  }
              }
              if (($ey<=$sy)&&($ex<=$sx))
              {
                  if (!$this->isOutXY($x2, $y2))
                  {
                      $fx=$x2;
                      $fy=$y2;
                      return;
                  }
                  else
                  {
                      $fx=$x4;
                      $fy=$y4;
                      return;
                  }
              }
              if (($ey<=$sy)&&($ex>=$sx))
              {
                  if (!$this->isOutXY($x1, $y1))
                  {
                      $fx=$x1;
                      $fy=$y1;
                      return;
                  }
                  else
                  {
                      $fx=$x4;
                      $fy=$y4;
                      return;
                  }
              }
          }
          else
          if ($this->_win == LOGO_WRAP)
          {
              if ($k2 == 0)
              {
                  $ny=$ey;
                  if ($ex>=$sx)
                  {
                      $nx=$this->_half_ix;
                      $eex=$ex-$this->_imagex;
                  }
                  else
                  {
                      $nx=-$this->_half_ix;
                      $eex=$ex+$this->_imagex;
                  }
                  $this->_crossPoint(-$nx, $ny, $eex, $ny, $fx, $fy);
                  return;
              }
              if ($k1 == 0)
              {
                  $nx=$ex;
                  if ($ey>=$sy)
                  {
                      $ny=$this->_half_iy;
                      $eey=$ey-$this->_imagey;
                  }
                  else
                  {
                      $ny=-$this->_half_iy;
                      $eey=$ey+$this->_imagey;
                  }
                  $this->_crossPoint($nx, -$ny, $nx, $eey, $fx, $fy);
                  return;
              }
              $k=$k2/$k1;
              $x1=$this->_half_ix;
              $x2=-$this->_half_ix;
              $y1=$k*($x1-$sx)+$sy;
              $y2=$k*($x2-$sx)+$sy;
              $y3=$this->_half_iy;
              $y4=-$this->_half_iy;
              $x3=($y3-$sy)/$k+$sx;
              $x4=($y4-$sy)/$k+$sx;
              if (($ey>=$sy)&&($ex>=$sx))
              {
                  if (!$this->isOutXY($x1, $y1))
                  {
                      $nx=$x1;
                      $ny=$y1;
                      $this->_crossPoint(-$nx, $ny, $ex-$this->_imagex, $ny, $fx, $fy);
                      return;
                  }
                  else
                  {
                      $nx=$x3;
                      $ny=$y3;
                      $this->_crossPoint($nx, -$ny, $nx, $ey-$this->_imagey, $fx, $fy);
                      return;
                  }
              }
              if (($ey>=$sy)&&($ex<=$sx))
              {
                  if (!$this->isOutXY($x2, $y2))
                  {
                      $nx=$x2;
                      $ny=$y2;
                      $this->_crossPoint(-$nx, $ny, $ex+$this->_imagex, $ny, $fx, $fy);
                      return;
                  }
                  else
                  {
                      $nx=$x3;
                      $ny=$y3;
                      $this->_crossPoint($nx, -$ny, $nx, $ey-$this->_imagey, $fx, $fy);
                      return;
                  }
              }
              if (($ey<=$sy)&&($ex<=$sx))
              {
                  if (!$this->isOutXY($x2, $y2))
                  {
                      $nx=$x2;
                      $ny=$y2;
                      $this->_crossPoint(-$nx, $ny, $ex+$this->_imagex, $ny, $fx, $fy);
                      return;
                  }
                  else
                  {
                      $nx=$x4;
                      $ny=$y4;
                      $this->_crossPoint($nx, -$ny, $nx, $ey+$this->_imagey, $fx, $fy);
                      return;
                  }
              }
              if (($ey<=$sy)&&($ex>=$sx))
              {
                  if (!$this->isOutXY($x1, $y1))
                  {
                      $nx=$x1;
                      $ny=$y1;
                      $this->_crossPoint(-$nx, $ny, $ex-$this->_imagex, $ny, $fx, $fy);
                      return;
                  }
                  else
                  {
                      $nx=$x4;
                      $ny=$y4;
                      $this->_crossPoint($nx, -$ny, $nx, $ey+$this->_imagey, $fx, $fy);
                      return;
                  }
              }
          }
      }
      
      function lineTo($x,$y, $moveToPlace=false)
      {
          if (($x == $this->_x)&&($y == $this->_y))
          {
              return;
          }
          if ($this->_draw)
          {
              if ($this->_win == LOGO_WINDOW)
              {
                  imageline($this->_im, $this->getIX(), $this->getIY(),
                  $this->getIXd($x), $this->getIYd($y), $this->_pc);
              }
              else
              {
                  if ($this->_win == LOGO_FENCE)
                  {
                      $this->_crossPoint($this->_x, $this->_y, $x, $y, $nx, $ny);
                      imageline($this->_im, $this->getIX(), $this->getIY(),
                      $this->getIXd($nx), $this->getIYd($ny), $this->_pc);
                  }
                  else
                  {
                      $x1=$this->_x;
                      $y1=$this->_y;
                      $ix1=$this->getIX();
                      $iy1=$this->getIY();
                      $this->_win=LOGO_FENCE;
                      $this->_crossPoint($x1, $y1, $x, $y, $x3, $y3);
                      $this->_win=LOGO_WRAP;
                      imageline($this->_im, $ix1, $iy1, $this->getIXd($x3), $this->getIYd($y3), $this->_pc);
                      $d=sqrt(($y-$y1)*($y-$y1)+($x-$x1)*($x-$x1));
                      $d2=($d)-sqrt(($y3-$y1)*($y3-$y1)+($x3-$x1)*($x3-$x1));
                      if ($d2>0)
                      {
                          if (($x3 == $this->_half_ix))
                          {
                              $nx=-$x3;
                              $ny=$y3;
                              $this->_x=$nx;
                              $this->_y=$ny;
                              $this->lineTo($x-$this->_imagex, $y, true);
                          }
                          else
                          if (($x3 == -$this->_half_ix))
                          {
                              $nx=-$x3;
                              $ny=$y3;
                              $this->_x=$nx;
                              $this->_y=$ny;
                              $this->lineTo($x+$this->_imagex, $y, true);
                          }
                          else
                          if (($y3 == $this->_half_iy))
                          {
                              $nx=$x3;
                              $ny=-$ny;
                              $this->_x=$nx;
                              $this->_y=$ny;
                              $this->lineTo($x, $y-$this->_imagey, true);
                          }
                          else
                          if (($y3 == -$this->_half_iy))
                          {
                              $nx=$x3;
                              $ny=-$ny;
                              $this->_x=$nx;
                              $this->_y=$ny;
                              $this->lineTo($x, $y+$this->_imagey, true);
                          }
                      }
                  }
              }
          }
          if ($moveToPlace)
          {
              $this->setXY($x,$y);
          }
      }
      
      function setPC($d)
      {
          $this->getRGB($d, $r, $g, $b);
          imagecolordeallocate($this->_im, $this->_pc);
          $this->_pc=imagecolorallocate($this->_im, $r, $g, $b);
      }
      
      function setPCrgb($r, $g, $b)
      {
          imagecolordeallocate($this->_im, $this->_pc);
          $this->_pc=imagecolorallocate($this->_im, $r, $g, $b);
      }
      
      function setFC($d)
      {
          $this->getRGB($d, $r, $g, $b);
          imagecolordeallocate($this->_im, $this->_fc);
          $this->_fc=imagecolorallocate($this->_im, $r, $g, $b);
      }
      
      function setFCrgb($r, $g, $b)
      {
          imagecolordeallocate($this->_im, $this->_fc);
          $this->_fc=imagecolorallocate($this->_im, $r, $g, $b);
      }
      
      function setSC($d)
      {
          $this->getRGB($d, $r, $g, $b);
          imagecolordeallocate($this->_im, $this->_sc);
          $this->_sc=imagecolorallocate($this->_im, $r, $g, $b);
      }
      
      function setSCrgb($r, $g, $b)
      {
          imagecolordeallocate($this->_im, $this->_sc);
          $this->_sc=imagecolorallocate($this->_im, $r, $g, $b);
      }
      
      function getPC()
      {
          return ((integer)$this->_pc);
      }
      
      function getFC()
      {
          return ((integer)$this->_fc);
      }
      
      function getSC()
      {
          return ((integer)$this->_sc);
      }
      
      function pu()
      {
          $this->_draw=false;
      }
      
      function pd()
      {
          $this->_draw=true;
      }
      
      function rt($d)
      {
          $d=round($d);
          $this->_d+=$d;
          $this->_d%=360;
      }
      
      function lt($d)
      {
          $this->rt(-$d);
      }
      
      function walk($d)
      {
          $this->fd($d);  
      }
      
      function fd($d)
      {
          if ($d == 0)
          {
              return;
          }
          $x1=$this->_x;
          $y1=$this->_y;
          $ix1=$this->getIXd($x1);
          $iy1=$this->getIYd($y1);
          $x2=round($x1+$d*sin($this->_d*pi()/180));
          $y2=round($y1-$d*cos($this->_d*pi()/180));
          $ix2=$this->getIXd($x2);
          $iy2=$this->getIYd($y2);
          if (!$this->isOutXY($x2,$y2))
          {
              if ($this->_draw)
              {
                  imageline($this->_im, $ix1, $iy1, $ix2, $iy2, $this->_pc);
              }
              $this->_x=$x2;
              $this->_y=$y2;
              return;
          }
          
          
          if ($this->_win == LOGO_WINDOW)
          {
              if ($this->_draw)
              {
                  imageline($this->_im, $ix1, $iy1, $ix2, $iy2, $this->_pc);
              }
              $this->_x=$x2;
              $this->_y=$y2;
              return;
          }
          else
          if ($this->_win == LOGO_FENCE)
          {
              $this->_crossPoint($x1, $y1, $x2, $y2, $x3, $y3);
              if ($this->_draw)
              {
                  imageline($this->_im, $ix1, $iy1, $this->getIXd($x3), $this->getIYd($y3), $this->_pc);
              }
              $this->_x=$x3;
              $this->_y=$y3;
          }
          else
          if ($this->_win == LOGO_WRAP)
          {
              $this->_win=LOGO_FENCE;
              $this->_crossPoint($x1, $y1, $x2, $y2, $x3, $y3);
              if ($this->_draw)
              {
                  imageline($this->_im, $ix1, $iy1, $this->getIXd($x3), $this->getIYd($y3), $this->_pc);
              }
              $this->_win=LOGO_WRAP;
              $d2=abs($d)-sqrt(($y3-$y1)*($y3-$y1)+($x3-$x1)*($x3-$x1));
              if (($x3 == $this->_half_ix)||($x3 == -$this->_half_ix))
              {
                  $this->_x=-$x3;
                  $this->_y=$y3;
              }
              else
              {
                  $this->_x=$x3;
                  $this->_y=-$y3;
              }
              if ($d>0)
              {
                  $this->fd($d2);
              }
              else
              {
                  $this->fd(-$d2);
              }
          }
          
      }
      
      function clean()
      {
          for ($i=0; $i<=$this->_imagex; $i++)
          {
              for ($j=0; $j<=$this->_imagey; $j++)
              {
                  imagesetpixel($this->_im, $i, $j, $this->_sc);
              }
          }
      }
      
      function bk($d)
      {
          $this->fd(-$d);
      }
      
      function fill()
      {
          if ($this->isIn())
          {
              imagefill($this->_im, $this->getIX(), $this->getIY(), $this->_fc);
          }
      }
      
      function fillxy($x, $y)
      {
          if ($this->isInXY($x, $y))
          {
              imagefill($this->_im, $this->getIXd($x), $this->getIYd($y), $this->_fc);
          }
      }
      
      function fillxyc($x, $y, $c)
      {
          if ($this->InXY($x, $y))
          {
              imagefill($this->_im, $this->getIXd($x), $this->getIYd($y), $c);
          }
      }    
      
      function pe()
      {
          // Not supported yet      
      }  
  }  	
?>