source: trunk/client/modules/Elezioni/grafici/jpgraph_scatter.php@ 267

Last change on this file since 267 was 267, checked in by roby, 5 years ago
File size: 6.5 KB
RevLine 
[267]1<?php
[2]2/*=======================================================================
[267]3// File: JPGRAPH_SCATTER.PHP
4// Description: Scatter (and impuls) plot extension for JpGraph
5// Created: 2001-02-11
6// Ver: $Id: jpgraph_scatter.php 957 2007-12-01 14:00:29Z ljp $
7//
8// Copyright (c) Aditus Consulting. All rights reserved.
9//========================================================================
10*/
[2]11require_once ('jpgraph_plotmark.inc.php');
12
13//===================================================
14// CLASS FieldArrow
15// Description: Draw an arrow at (x,y) with angle a
16//===================================================
17class FieldArrow {
18 public $iColor='black';
19 public $iSize=10; // Length in pixels for arrow
20 public $iArrowSize = 2;
21 private $isizespec = array(
[267]22 array(2,1),array(3,2),array(4,3),array(6,4),array(7,4),array(8,5),array(10,6),array(12,7),array(16,8),array(20,10));
23 function FieldArrow() {
[2]24 }
25
26 function SetSize($aSize,$aArrowSize=2) {
[267]27 $this->iSize = $aSize;
28 $this->iArrowSize = $aArrowSize;
[2]29 }
30
31 function SetColor($aColor) {
[267]32 $this->iColor = $aColor;
[2]33 }
34
35 function Stroke($aImg,$x,$y,$a) {
[267]36 // First rotate the center coordinates
37 list($x,$y) = $aImg->Rotate($x,$y);
[2]38
[267]39 $old_origin = $aImg->SetCenter($x,$y);
40 $old_a = $aImg->a;
41 $aImg->SetAngle(-$a+$old_a);
[2]42
[267]43 $dx = round($this->iSize/2);
44 $c = array($x-$dx,$y,$x+$dx,$y);
45 $x += $dx;
[2]46
[267]47 list($dx,$dy) = $this->isizespec[$this->iArrowSize];
48 $ca = array($x,$y,$x-$dx,$y-$dy,$x-$dx,$y+$dy,$x,$y);
[2]49
[267]50 $aImg->SetColor($this->iColor);
51 $aImg->Polygon($c);
52 $aImg->FilledPolygon($ca);
[2]53
[267]54 $aImg->SetCenter($old_origin[0],$old_origin[1]);
55 $aImg->SetAngle($old_a);
[2]56 }
57}
58
59//===================================================
60// CLASS FieldPlot
61// Description: Render a field plot
62//===================================================
63class FieldPlot extends Plot {
64 public $arrow = '';
65 private $iAngles = array();
66 private $iCallback = '';
[267]67
68 function FieldPlot($datay,$datax,$angles) {
69 if( (count($datax) != count($datay)) )
70 JpGraphError::RaiseL(20001);//("Fieldplots must have equal number of X and Y points.");
71 if( (count($datax) != count($angles)) )
72 JpGraphError::RaiseL(20002);//("Fieldplots must have an angle specified for each X and Y points.");
73
74 $this->iAngles = $angles;
[2]75
[267]76 $this->Plot($datay,$datax);
77 $this->value->SetAlign('center','center');
78 $this->value->SetMargin(15);
[2]79
[267]80 $this->arrow = new FieldArrow();
[2]81 }
82
83 function SetCallback($aFunc) {
[267]84 $this->iCallback = $aFunc;
[2]85 }
86
87 function Stroke($img,$xscale,$yscale) {
88
[267]89 // Remeber base color and size
90 $bc = $this->arrow->iColor;
91 $bs = $this->arrow->iSize;
92 $bas = $this->arrow->iArrowSize;
[2]93
[267]94 for( $i=0; $i<$this->numpoints; ++$i ) {
95 // Skip null values
96 if( $this->coords[0][$i]==="" )
97 continue;
[2]98
[267]99 $f = $this->iCallback;
100 if( $f != "" ) {
101 list($cc,$cs,$cas) = call_user_func($f,$this->coords[1][$i],$this->coords[0][$i],$this->iAngles[$i]);
102 // Fall back on global data if the callback isn't set
103 if( $cc == "" ) $cc = $bc;
104 if( $cs == "" ) $cs = $bs;
105 if( $cas == "" ) $cas = $bas;
106 $this->arrow->SetColor($cc);
107 $this->arrow->SetSize($cs,$cas);
108 }
[2]109
[267]110 $xt = $xscale->Translate($this->coords[1][$i]);
111 $yt = $yscale->Translate($this->coords[0][$i]);
[2]112
[267]113 $this->arrow->Stroke($img,$xt,$yt,$this->iAngles[$i]);
114 $this->value->Stroke($img,$this->coords[0][$i],$xt,$yt);
115 }
[2]116 }
[267]117
[2]118 // Framework function
119 function Legend($aGraph) {
[267]120 if( $this->legend != "" ) {
121 $aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0,
122 $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
123 }
124 }
[2]125}
126
127//===================================================
128// CLASS ScatterPlot
129// Description: Render X and Y plots
130//===================================================
131class ScatterPlot extends Plot {
[267]132 public $mark = '';
[2]133 private $impuls = false;
[267]134 private $linkpoints = false, $linkpointweight=1, $linkpointcolor="black";
135//---------------
136// CONSTRUCTOR
137 function ScatterPlot($datay,$datax=false) {
138 if( (count($datax) != count($datay)) && is_array($datax))
139 JpGraphError::RaiseL(20003);//("Scatterplot must have equal number of X and Y points.");
140 $this->Plot($datay,$datax);
141 $this->mark = new PlotMark();
142 $this->mark->SetType(MARK_SQUARE);
143 $this->mark->SetColor($this->color);
144 $this->value->SetAlign('center','center');
145 $this->value->SetMargin(0);
[2]146 }
147
[267]148//---------------
149// PUBLIC METHODS
[2]150 function SetImpuls($f=true) {
[267]151 $this->impuls = $f;
152 }
[2]153
154 // Combine the scatter plot points with a line
[267]155 function SetLinkPoints($aFlag=true,$aColor="black",$aWeight=1) {
156 $this->linkpoints=$aFlag;
157 $this->linkpointcolor=$aColor;
158 $this->linkpointweight=$aWeight;
[2]159 }
160
161 function Stroke($img,$xscale,$yscale) {
162
[267]163 $ymin=$yscale->scale_abs[0];
164 if( $yscale->scale[0] < 0 )
165 $yzero=$yscale->Translate(0);
166 else
167 $yzero=$yscale->scale_abs[0];
168
169 $this->csimareas = '';
170 for( $i=0; $i<$this->numpoints; ++$i ) {
[2]171
[267]172 // Skip null values
173 if( $this->coords[0][$i]==='' || $this->coords[0][$i]==='-' || $this->coords[0][$i]==='x')
174 continue;
[2]175
[267]176 if( isset($this->coords[1]) )
177 $xt = $xscale->Translate($this->coords[1][$i]);
178 else
179 $xt = $xscale->Translate($i);
180 $yt = $yscale->Translate($this->coords[0][$i]);
[2]181
182
[267]183 if( $this->linkpoints && isset($yt_old) ) {
184 $img->SetColor($this->linkpointcolor);
185 $img->SetLineWeight($this->linkpointweight);
186 $img->Line($xt_old,$yt_old,$xt,$yt);
187 }
[2]188
[267]189 if( $this->impuls ) {
190 $img->SetColor($this->color);
191 $img->SetLineWeight($this->weight);
192 $img->Line($xt,$yzero,$xt,$yt);
193 }
194
195 if( !empty($this->csimtargets[$i]) ) {
196 if( !empty($this->csimwintargets[$i]) ) {
197 $this->mark->SetCSIMTarget($this->csimtargets[$i],$this->csimwintargets[$i]);
198 }
199 else {
200 $this->mark->SetCSIMTarget($this->csimtargets[$i]);
201 }
202 $this->mark->SetCSIMAlt($this->csimalts[$i]);
203 }
204
205 if( isset($this->coords[1]) ) {
206 $this->mark->SetCSIMAltVal($this->coords[0][$i],$this->coords[1][$i]);
207 }
208 else {
209 $this->mark->SetCSIMAltVal($this->coords[0][$i],$i);
210 }
[2]211
[267]212 $this->mark->Stroke($img,$xt,$yt);
213
214 $this->csimareas .= $this->mark->GetCSIMAreas();
215 $this->value->Stroke($img,$this->coords[0][$i],$xt,$yt);
[2]216
[267]217 $xt_old = $xt;
218 $yt_old = $yt;
219 }
[2]220 }
[267]221
[2]222 // Framework function
223 function Legend($aGraph) {
[267]224 if( $this->legend != "" ) {
225 $aGraph->legend->Add($this->legend,$this->mark->fill_color,$this->mark,0,
226 $this->legendcsimtarget,$this->legendcsimalt,$this->legendcsimwintarget);
227 }
228 }
[2]229} // Class
230/* EOF */
[267]231?>
Note: See TracBrowser for help on using the repository browser.