source: spip-zone/_plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/RotatedRectangle.class.php @ 115933

Last change on this file since 115933 was 115933, checked in by cedric@…, 6 weeks ago

Passage en production des methodes alternatives de generation de vignette apercu (gradients, potrace, geometrize) activable dans la page de config du plugin
+ mise a jour de la lib geometrize, en partie refactoree et optimisee
+ un mode debug activable par la config pour voir les apercus au survol des images (permet de tester sur un echantillon d'image et de choisir la methode la plus adaptee au site)

File size: 4.6 KB
Line 
1<?php
2
3// Generated by Haxe 3.4.7
4class geometrize_shape_RotatedRectangle implements geometrize_shape_Shape {
5
6        /**
7         * @var int
8         */
9        protected $x1;
10
11        /**
12         * @var int
13         */
14        protected $y1;
15
16        /**
17         * @var int
18         */
19        protected $x2;
20
21        /**
22         * @var int
23         */
24        protected $y2;
25
26        /**
27         * @var int
28         */
29        protected $angle;
30
31        /**
32         * @var int
33         */
34        protected $xBound;
35
36        /**
37         * @var int
38         */
39        protected $yBound;
40
41        /**
42         * @var int
43         */
44        public $color;
45
46        /**
47         * Rasterized lines
48         * @var null|array
49         */
50        protected $lines = null;
51
52        public function __construct($xBound, $yBound){
53                $this->x1 = mt_rand(0, $xBound-1);
54                $this->y1 = mt_rand(0, $yBound-1);
55
56                $this->x2 = $this->x1 + mt_rand(1, 32);
57                $this->x2 = min($this->x2, $xBound-1);
58
59                $this->y2 = $this->y1 + mt_rand(1, 32);
60                $this->y2 = min($this->y2, $yBound-1);
61
62                $this->angle = mt_rand(0, 359);
63
64                $this->xBound = $xBound;
65                $this->yBound = $yBound;
66        }
67
68        /**
69         * Rasterize the shape
70         * @return array
71         * @throws HException
72         */
73        public function rasterize(){
74                if (!$this->lines){
75                        $points = $this->getCornerPoints();
76                        $this->lines = geometrize_rasterizer_Rasterizer::scanlinesForPolygon($points, $this->xBound, $this->yBound);
77                }
78                return $this->lines;
79        }
80
81        /**
82         * Mutate the shape
83         * @throws HException
84         */
85        public function mutate(){
86                $r = mt_rand(0, 2);
87                switch ($r) {
88                        case 0:
89                                $this->x1 += mt_rand(-16, +16);
90                                $this->x1 = max(min($this->x1, $this->xBound-1),0);
91                                $this->y1 += mt_rand(-16, +16);
92                                $this->y1 = max(min($this->y1, $this->yBound-1),0);
93                                break;
94                        case 1:
95                                $this->x2 += mt_rand(-16, +16);
96                                $this->x2 = max(min($this->x2, $this->xBound-1),0);
97                                $this->y2 += mt_rand(-16, +16);
98                                $this->y2 = max(min($this->y2, $this->yBound-1),0);
99                                break;
100                        case 2:
101                                $this->angle += mt_rand(-4, +4);
102                                $this->angle = (360 + $this->angle) % 360;
103                                break;
104                }
105
106                // force to rasterize the new shape
107                $this->lines = null;
108        }
109
110        public function rescale($xBound, $yBound){
111                $xScale = ($xBound-1) / ($this->xBound-1);
112                $yScale = ($yBound-1) / ($this->yBound-1);
113                $this->xBound = $xBound;
114                $this->yBound = $yBound;
115                $this->x1 = intval(round($this->x1*$xScale));
116                $this->y1 = intval(round($this->y1*$yScale));
117                $this->x2 = intval(round($this->x2*$xScale));
118                $this->y2 = intval(round($this->y2*$yScale));
119
120                if ($this->lines) {
121                        foreach ($this->lines as &$line) {
122                                $line->rescale($xScale, $yScale);
123                        }
124                }
125        }
126
127        public function hclone(){
128                return clone $this;
129        }
130
131        public function __clone() {
132                if ($this->lines) {
133                        foreach ($this->lines as $k=>&$line) {
134                                $this->lines[$k] = clone $line;
135                        }
136                }
137  }
138
139        public function getType(){
140                return geometrize_shape_ShapeTypes::T_ROTATED_RECTANGLE;
141        }
142
143        /**
144         * @return array
145         */
146        public function getRawShapeData(){
147                if ($this->x1<$this->x2){
148                        $xfirst = $this->x1;
149                        $xsecond = $this->x2;
150                } else {
151                        $xfirst = $this->x2;
152                        $xsecond = $this->x1;
153                }
154                if ($this->y1<$this->y2){
155                        $yfirst = $this->y1;
156                        $ysecond = $this->y2;
157                } else {
158                        $yfirst = $this->y2;
159                        $ysecond = $this->y1;
160                }
161
162                return [
163                        $xfirst,
164                        $yfirst,
165                        $xsecond,
166                        $ysecond,
167                        $this->angle
168                ];
169        }
170
171        /**
172         * @return string
173         */
174        public function getSvgShapeData(){
175                $points = $this->getCornerPoints();
176                return geometrize_exporter_SvgExporter::exportPolygon($points);
177        }
178
179        /**
180         * @return array
181         */
182        public function getCornerPoints(){
183                list($xm1, $ym1, $xm2, $ym2, $angle) = $this->getRawShapeData();
184
185                $cx = intval(($xm1+$xm2)/2);
186                $cy = intval(($ym1+$ym2)/2);
187                $ox1 = $xm1-$cx;
188                $ox2 = $xm2-$cx;
189                $oy1 = $ym1-$cy;
190                $oy2 = $ym2-$cy;
191                $rads = $this->angle * M_PI/180.0;
192                $c = cos($rads);
193                $s = sin($rads);
194
195                $ulx = intval(round($ox1*$c-$oy1*$s+$cx));
196                $uly = intval(round($ox1*$s+$oy1*$c+$cy));
197                $blx = intval(round($ox1*$c-$oy2*$s+$cx));
198                $bly = intval(round($ox1*$s+$oy2*$c+$cy));
199                $urx = intval(round($ox2*$c-$oy1*$s+$cx));
200                $ury = intval(round($ox2*$s+$oy1*$c+$cy));
201                $brx = intval(round($ox2*$c-$oy2*$s+$cx));
202                $bry = intval(round($ox2*$s+$oy2*$c+$cy));
203
204                $corners = [
205                        ["x" => $ulx, "y" => $uly],
206                        ["x" => $urx, "y" => $ury],
207                        ["x" => $brx, "y" => $bry],
208                        ["x" => $blx, "y" => $bly]
209                ];
210                return $corners;
211        }
212
213        public function __call($m, $a){
214                if (isset($this->$m) && is_callable($this->$m)){
215                        return call_user_func_array($this->$m, $a);
216                } else {
217                        if (isset($this->__dynamics[$m]) && is_callable($this->__dynamics[$m])){
218                                return call_user_func_array($this->__dynamics[$m], $a);
219                        } else {
220                                if ('toString'==$m){
221                                        return $this->__toString();
222                                } else {
223                                        throw new HException('Unable to call <' . $m . '>');
224                                }
225                        }
226                }
227        }
228
229        function __toString(){
230                return 'geometrize.shape.RotatedRectangle';
231        }
232}
Note: See TracBrowser for help on using the repository browser.