jpgraph_plotmark.inc
上传用户:gzy2002
上传日期:2010-02-11
资源大小:1785k
文件大小:13k
源码类别:

电子政务应用

开发平台:

Java

  1. <?php
  2. //=======================================================================
  3. // File: JPGRAPH_PLOTMARK.PHP
  4. // Description: Class file. Handles plotmarks
  5. // Created:  2003-03-21
  6. // Author: Johan Persson (johanp@aditus.nu)
  7. // Ver: $Id: jpgraph_plotmark.inc,v 1.1 2003/10/10 03:37:56 wwf Exp $
  8. //
  9. // License: This code is released under QPL 1.0 
  10. // Copyright (C) 2003 Johan Persson 
  11. //========================================================================
  12. //========================================================================
  13. // CLASS ImgData
  14. // Description: Base class for all image data classes that contains the 
  15. // real image data.
  16. //========================================================================
  17. class ImgData {
  18.     var $name = ''; // Each subclass gives a name
  19.     var $an = array(); // Data array names
  20.     var $colors = array(); // Available colors
  21.     var $index  = array(); // Index for colors
  22.     var $maxidx = 0 ; // Max color index
  23.     var $anchor_x=0.5, $anchor_y=0.5 ;    // Where is the center of the image
  24.     // Create a GD image from the data and return a GD handle
  25.     function GetImg($aMark,$aIdx) {
  26. $n = $this->an[$aMark];
  27. if( is_string($aIdx) ) {
  28.     if( !in_array($aIdx,$this->colors) ) {
  29. JpGraphError::Raise('This marker "'.($this->name).'" does not exist in color: '.$aIdx);
  30. die();
  31.     }
  32.     $idx = $this->index[$aIdx];
  33. }
  34. elseif( !is_integer($aIdx) || 
  35. (is_integer($aIdx) && $aIdx > $this->maxidx ) ) {
  36.     JpGraphError::Raise('Mark color index too large for marker "'.($this->name).'"');
  37. }
  38. else
  39.     $idx = $aIdx ;
  40. return imagecreatefromstring(base64_decode($this->{$n}[$idx][1]));   
  41.     }
  42.     function GetAnchor() {
  43. return array($this->anchor_x,$this->anchor_y);
  44.     }
  45. }
  46. //===================================================
  47. // CLASS PlotMark
  48. // Description: Handles the plot marks in graphs
  49. //===================================================
  50. class PlotMark {
  51.     var $title, $show=true;
  52.     var $type,$weight=1;
  53.     var $color="black", $width=4, $fill_color="blue";
  54.     var $yvalue,$xvalue='',$csimtarget,$csimalt,$csimareas;
  55.     var $iFormatCallback="";
  56.     var $iFormatCallback2="";
  57.     var $markimg='',$iScale=1.0;
  58.     var $oldfilename='',$iFileName='';
  59.     var $imgdata_balls = null;
  60.     var $imgdata_diamonds = null;
  61.     var $imgdata_squares = null;
  62.     var $imgdata_bevels = null;
  63.     var $imgdata_stars = null;
  64.     var $imgdata_pushpins = null;
  65. //--------------
  66. // CONSTRUCTOR
  67.     function PlotMark() {
  68. $this->title = new Text();
  69. $this->title->Hide();
  70. $this->csimareas = '';
  71. $this->csimalt = '';
  72. $this->type=-1;
  73.     }
  74. //---------------
  75. // PUBLIC METHODS
  76.     function SetType($aType,$aFileName='',$aScale=1.0) {
  77. $this->type = $aType;
  78. if( $aType == MARK_IMG && $aFileName=='' ) {
  79.     JpGraphError::Raise('A filename must be specified if you set the mark type to MARK_IMG.');
  80. }
  81. $this->iFileName = $aFileName;
  82. $this->iScale = $aScale;
  83.     }
  84.     function SetCallback($aFunc) {
  85. $this->iFormatCallback = $aFunc;
  86.     }
  87.     function SetCallbackYX($aFunc) {
  88. $this->iFormatCallback2 = $aFunc;
  89.     }
  90.     
  91.     function GetType() {
  92. return $this->type;
  93.     }
  94.     function SetColor($aColor) {
  95. $this->color=$aColor;
  96.     }
  97.     function SetFillColor($aFillColor) {
  98. $this->fill_color = $aFillColor;
  99.     }
  100.     function SetWeight($aWeight) {
  101. $this->weight = $aWeight;
  102.     }
  103.     // Synonym for SetWidth()
  104.     function SetSize($aWidth) {
  105. $this->width=$aWidth;
  106.     }
  107.     function SetWidth($aWidth) {
  108. $this->width=$aWidth;
  109.     }
  110.     function SetDefaultWidth() {
  111. switch( $this->type ) {
  112.     case MARK_CIRCLE: 
  113.     case MARK_FILLEDCIRCLE: 
  114. $this->width=4;
  115. break;
  116.     default:
  117. $this->width=7;
  118. }
  119.     }
  120.     function GetWidth() {
  121. return $this->width;
  122.     }
  123.     function Hide($aHide=true) {
  124. $this->show = !$aHide;
  125.     }
  126.     function Show($aShow=true) {
  127. $this->show = $aShow;
  128.     }
  129.     function SetCSIMAltVal($aY,$aX='') {
  130.         $this->yvalue=$aY; 
  131.         $this->xvalue=$aX; 
  132.     }
  133.     
  134.     function SetCSIMTarget($aTarget) {
  135.         $this->csimtarget=$aTarget;
  136.     }
  137.     
  138.     function SetCSIMAlt($aAlt) {
  139.         $this->csimalt=$aAlt;
  140.     }
  141.     
  142.     function GetCSIMAreas(){
  143.         return $this->csimareas;
  144.     }
  145.         
  146.     function AddCSIMPoly($aPts) {
  147.         $coords = round($aPts[0]).", ".round($aPts[1]);
  148.         $n = count($aPts)/2;
  149.         for( $i=1; $i < $n; ++$i){
  150.             $coords .= ", ".round($aPts[2*$i]).", ".round($aPts[2*$i+1]);
  151.         }
  152.         $this->csimareas="";    
  153.         if( !empty($this->csimtarget) ) {
  154.     $this->csimareas .= "<area shape="poly" coords="$coords" href="".$this->csimtarget.""";
  155.     if( !empty($this->csimalt) ) {
  156. $tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue);
  157. $this->csimareas .= " alt="$tmp" title="$tmp"";
  158.     }
  159.     $this->csimareas .= ">n";
  160. }
  161.     }
  162.     
  163.     function AddCSIMCircle($x,$y,$r) {
  164.      $x = round($x); $y=round($y); $r=round($r);
  165.         $this->csimareas="";    
  166.         if( !empty($this->csimtarget) ) {
  167.     $this->csimareas .= "<area shape="circle" coords="$x,$y,$r" href="".$this->csimtarget.""";
  168.          if( !empty($this->csimalt) ) {
  169. $tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue);
  170. $this->csimareas .= " alt="$tmp" title="$tmp"";
  171.     }
  172.             $this->csimareas .= ">n";        
  173.         }
  174.     }
  175.     
  176.     function Stroke($img,$x,$y) {
  177. if( !$this->show ) return;
  178. if( $this->iFormatCallback != '' || $this->iFormatCallback2 != '' ) {
  179.     if( $this->iFormatCallback != '' ) {
  180. $f = $this->iFormatCallback;
  181. list($width,$color,$fcolor) = $f($this->yvalue);
  182. $filename = $this->iFileName;
  183. $imgscale = $this->iScale;
  184.     }
  185.     else {
  186. $f = $this->iFormatCallback2;
  187. list($width,$color,$fcolor,$filename,$imgscale) = $f($this->yvalue,$this->xvalue);
  188. if( $filename=="" ) $filename = $this->iFileName;
  189. if( $imgscale=="" ) $imgscale = $this->iScale;
  190.     }
  191.     if( $width=="" ) $width = $this->width;
  192.     if( $color=="" ) $color = $this->color;
  193.     if( $fcolor=="" ) $fcolor = $this->fill_color;
  194. }
  195. else {
  196.     $fcolor = $this->fill_color;
  197.     $color = $this->color;
  198.     $width = $this->width;
  199.     $filename = $this->iFileName;
  200.     $imgscale = $this->iScale;
  201. }
  202. if( $this->type == MARK_IMG || $this->type >= MARK_IMG_PUSHPIN ) {
  203.     // Note: For the builtin images we use the "filename" parameter
  204.     // to denote the color
  205.     $anchor_x = 0.5;
  206.     $anchor_y = 0.5; 
  207.     switch( $this->type ) {
  208. case MARK_IMG :
  209.     // Load an image and use that as a marker
  210.     // Small optimization, if we have already read an image don't
  211.     // waste time reading it again.
  212.     if( $this->markimg == '' || !($this->oldfilename === $filename) ) {
  213. $this->markimg = Graph::LoadBkgImage('',$filename);
  214. $this->oldfilename = $filename ;
  215.     }
  216.     break;
  217. case MARK_IMG_PUSHPIN:
  218. case MARK_IMG_SPUSHPIN:
  219. case MARK_IMG_LPUSHPIN:
  220.     if( $this->imgdata_pushpins == null ) {
  221. require_once 'imgdata_pushpins.inc';
  222. $this->imgdata_pushpins = new ImgData_PushPins();
  223.     }
  224.     $this->markimg = $this->imgdata_pushpins->GetImg($this->type,$filename);
  225.     list($anchor_x,$anchor_y) = $this->imgdata_pushpins->GetAnchor();
  226.     break;
  227. case MARK_IMG_SQUARE:
  228.     if( $this->imgdata_squares == null ) {
  229. require_once 'imgdata_squares.inc';
  230. $this->imgdata_squares = new ImgData_Squares();
  231.     }
  232.     $this->markimg = $this->imgdata_squares->GetImg($this->type,$filename);
  233.     list($anchor_x,$anchor_y) = $this->imgdata_squares->GetAnchor();
  234.     break;
  235. case MARK_IMG_STAR:
  236.     if( $this->imgdata_stars == null ) {
  237. require_once 'imgdata_stars.inc';
  238. $this->imgdata_stars = new ImgData_Stars();
  239.     }
  240.     $this->markimg = $this->imgdata_stars->GetImg($this->type,$filename);
  241.     list($anchor_x,$anchor_y) = $this->imgdata_stars->GetAnchor();
  242.     break;
  243. case MARK_IMG_BEVEL:
  244.     if( $this->imgdata_bevels == null ) {
  245. require_once 'imgdata_bevels.inc';
  246. $this->imgdata_bevels = new ImgData_Bevels();
  247.     }
  248.     $this->markimg = $this->imgdata_bevels->GetImg($this->type,$filename);
  249.     list($anchor_x,$anchor_y) = $this->imgdata_bevels->GetAnchor();
  250.     break;
  251. case MARK_IMG_DIAMOND:
  252.     if( $this->imgdata_diamonds == null ) {
  253. require_once 'imgdata_diamonds.inc';
  254. $this->imgdata_diamonds = new ImgData_Diamonds();
  255.     }
  256.     $this->markimg = $this->imgdata_diamonds->GetImg($this->type,$filename);
  257.     list($anchor_x,$anchor_y) = $this->imgdata_diamonds->GetAnchor();
  258.     break;
  259. case MARK_IMG_BALL:     
  260. case MARK_IMG_SBALL:     
  261. case MARK_IMG_MBALL:     
  262. case MARK_IMG_LBALL:     
  263.     if( $this->imgdata_balls == null ) {
  264. require_once 'imgdata_balls.inc';
  265. $this->imgdata_balls = new ImgData_Balls();
  266.     }
  267.     $this->markimg = $this->imgdata_balls->GetImg($this->type,$filename);
  268.     list($anchor_x,$anchor_y) = $this->imgdata_balls->GetAnchor();
  269.     break;
  270.     }
  271.     $w = imagesx($this->markimg);
  272.     $h = imagesy($this->markimg);
  273.     
  274.     $dw = round($imgscale * $w );
  275.     $dh = round($imgscale * $h );
  276.     $dx = round($x-$dw*$anchor_x);
  277.     $dy = round($y-$dh*$anchor_y);
  278.     
  279.     $this->width = max($dx,$dy);
  280.     
  281.     $cp = $GLOBALS['copyfunc'] ;
  282.     $cp($img->img,$this->markimg,$dx,$dy,0,0,$dw,$dh,$w,$h);
  283.     if( !empty($this->csimtarget) ) {
  284. $this->csimareas = "<area shape="rect" coords="".
  285.     $dx.','.$dy.','.round($dx+$dw).','.round($dy+$dh).'" '.
  286.     "href="".$this->csimtarget.""";
  287. if( !empty($this->csimalt) ) {
  288.     $tmp=sprintf($this->csimalt,$this->yvalue,$this->xvalue);
  289.     $this->csimareas .= " alt="$tmp" title="$tmp"";
  290. }
  291. $this->csimareas .= ">n";
  292.     }
  293.     
  294.     // Stroke title
  295.     $this->title->Align("center","top");
  296.     $this->title->Stroke($img,$x,$y+round($dh/2));
  297.     return;
  298. }
  299. $weight = $this->weight;
  300. $dx=round($width/2,0);
  301. $dy=round($width/2,0);
  302. $pts=0;
  303. switch( $this->type ) {
  304.     case MARK_SQUARE:
  305. $c[]=$x-$dx;$c[]=$y-$dy;
  306. $c[]=$x+$dx;$c[]=$y-$dy;
  307. $c[]=$x+$dx;$c[]=$y+$dy;
  308. $c[]=$x-$dx;$c[]=$y+$dy;
  309. $c[]=$x-$dx;$c[]=$y-$dy;
  310. $pts=5;
  311. break;
  312.     case MARK_UTRIANGLE:
  313. ++$dx;++$dy;
  314. $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
  315. $c[]=$x;$c[]=$y-0.87*$dy;
  316. $c[]=$x+$dx;$c[]=$y+0.87*$dy;
  317. $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
  318. $pts=4;
  319. break;
  320.     case MARK_DTRIANGLE:
  321. ++$dx;++$dy;
  322. $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
  323. $c[]=$x-$dx;$c[]=$y-0.87*$dy;
  324. $c[]=$x+$dx;$c[]=$y-0.87*$dy;
  325. $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx
  326. $pts=4;
  327. break;
  328.     case MARK_DIAMOND:
  329. $c[]=$x;$c[]=$y+$dy;
  330. $c[]=$x-$dx;$c[]=$y;
  331. $c[]=$x;$c[]=$y-$dy;
  332. $c[]=$x+$dx;$c[]=$y;
  333. $c[]=$x;$c[]=$y+$dy;
  334. $pts=5;
  335. break;
  336.     case MARK_LEFTTRIANGLE:
  337. $c[]=$x;$c[]=$y;
  338. $c[]=$x;$c[]=$y+2*$dy;
  339. $c[]=$x+$dx*2;$c[]=$y;
  340. $c[]=$x;$c[]=$y;
  341. $pts=4;
  342. break;
  343.     case MARK_RIGHTTRIANGLE:
  344. $c[]=$x-$dx*2;$c[]=$y;
  345. $c[]=$x;$c[]=$y+2*$dy;
  346. $c[]=$x;$c[]=$y;
  347. $c[]=$x-$dx*2;$c[]=$y;
  348. $pts=4;
  349. break;
  350.     case MARK_FLASH:
  351. $dy *= 2;
  352. $c[]=$x+$dx/2; $c[]=$y-$dy;
  353. $c[]=$x-$dx+$dx/2; $c[]=$y+$dy*0.7-$dy;
  354. $c[]=$x+$dx/2; $c[]=$y+$dy*1.3-$dy;
  355. $c[]=$x-$dx+$dx/2; $c[]=$y+2*$dy-$dy;
  356. $img->SetLineWeight($weight);
  357. $img->SetColor($color);
  358. $img->Polygon($c);
  359. $img->SetLineWeight(1);
  360. $this->AddCSIMPoly($c);
  361. break;
  362. }
  363. if( $pts>0 ) {
  364.     $this->AddCSIMPoly($c);
  365.     $img->SetLineWeight($weight);
  366.     $img->SetColor($fcolor);
  367.     $img->FilledPolygon($c);
  368.     $img->SetColor($color);
  369.     $img->Polygon($c);
  370.     $img->SetLineWeight(1);
  371. }
  372. elseif( $this->type==MARK_CIRCLE ) {
  373.     $img->SetColor($color);
  374.     $img->Circle($x,$y,$width);
  375.     $this->AddCSIMCircle($x,$y,$width);
  376. }
  377. elseif( $this->type==MARK_FILLEDCIRCLE ) {
  378.     $img->SetColor($fcolor);
  379.     $img->FilledCircle($x,$y,$width);
  380.     $img->SetColor($color);
  381.     $img->Circle($x,$y,$width+1);
  382.     $this->AddCSIMCircle($x,$y,$width);
  383. }
  384. elseif( $this->type==MARK_CROSS ) {
  385.     // Oversize by a pixel to match the X
  386.     $img->SetColor($color);
  387.     $img->SetLineWeight($weight);
  388.     $img->Line($x,$y+$dy+1,$x,$y-$dy-1);
  389.     $img->Line($x-$dx-1,$y,$x+$dx+1,$y);
  390.     $this->AddCSIMCircle($x,$y,$dx);     
  391. }
  392. elseif( $this->type==MARK_X ) {
  393.     $img->SetColor($color);
  394.     $img->SetLineWeight($weight);
  395.     $img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy);
  396.     $img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy);
  397.     $this->AddCSIMCircle($x,$y,$dx+$dy);          
  398. }
  399. elseif( $this->type==MARK_STAR ) {
  400.     $img->SetColor($color);
  401.     $img->SetLineWeight($weight);
  402.     $img->Line($x+$dx,$y+$dy,$x-$dx,$y-$dy);
  403.     $img->Line($x-$dx,$y+$dy,$x+$dx,$y-$dy);
  404.     // Oversize by a pixel to match the X
  405.     $img->Line($x,$y+$dy+1,$x,$y-$dy-1);
  406.     $img->Line($x-$dx-1,$y,$x+$dx+1,$y);
  407.     $this->AddCSIMCircle($x,$y,$dx+$dy);     
  408. }
  409. // Stroke title
  410. $this->title->Align("center","center");
  411. $this->title->Stroke($img,$x,$y);
  412.     }
  413. } // Class
  414. ?>