Subversion Repositories Applications.annuaire

Rev

Rev 66 | Details | Compare with Previous | Last modification | View Log | RSS feed

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