source: spip-zone/_plugins_/adaptive_images/trunk/lib/geometrize/geometrize/shape/RotatedEllipse.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: 3.9 KB
Line 
1<?php
2
3// Generated by Haxe 3.4.7
4class geometrize_shape_RotatedEllipse implements geometrize_shape_Shape {
5
6        /**
7         * @var int
8         */
9        protected $x;
10
11        /**
12         * @var int
13         */
14        protected $y;
15
16        /**
17         * @var int
18         */
19        protected $rx;
20
21        /**
22         * @var int
23         */
24        protected $ry;
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
53        public function __construct($xBound, $yBound){
54                $this->x = mt_rand(0, $xBound-1);
55                $this->y = mt_rand(0, $yBound-1);
56                $this->rx = mt_rand(1, 32);
57                $this->ry = mt_rand(1, 32);
58                $this->angle = mt_rand(0, 359);
59                $this->xBound = $xBound;
60                $this->yBound = $yBound;
61        }
62
63        public function rasterize(){
64                if (!$this->lines){
65                        $pointCount = 20;
66                        $points = [];
67                        $rads = $this->angle*(M_PI/180.0);
68                        $c = cos($rads);
69                        $s = sin($rads);
70
71                        for ($i = 0; $i<$pointCount; $i++) {
72                                $rot = 360.0/$pointCount*$i*(M_PI/180.0);
73                                $crx = $this->rx;
74                                $crx1 = $crx*cos($rot);
75                                $cry = $this->ry;
76                                $cry1 = $cry*sin($rot);
77                                $tx = intval(round($crx1*$c-$cry1*$s+$this->x));
78                                $ty = intval(round($crx1*$s+$cry1*$c+$this->y));
79                                $points[] = ["x" => $tx, "y" => $ty];
80                        }
81
82                        $this->lines = geometrize_rasterizer_Rasterizer::scanlinesForPolygon($points, $this->xBound, $this->yBound);
83                }
84                return $this->lines;
85        }
86
87        public function mutate(){
88                $r = mt_rand(0, 3);
89                switch ($r) {
90                        case 0:
91                                $this->x += mt_rand(-16, +16);
92                                $this->x = max(min($this->x, $this->xBound-1),0);
93                                $this->y += mt_rand(-16, +16);
94                                $this->y = max(min($this->y, $this->yBound-1),0);
95                                break;
96
97                        case 1:
98                                $this->rx += mt_rand(-16, +16);
99                                $this->rx = max(min($this->rx, $this->xBound-1),1);
100                                break;
101
102                        case 2:
103                                $this->ry += mt_rand(-16, +16);
104                                $this->ry = max(min($this->ry, $this->yBound-1),1);
105                                break;
106
107                        case 3:
108                                $this->angle += mt_rand(-4, +4);
109                                $this->angle = (360 + $this->angle) % 360;
110                                break;
111                }
112
113                // force to rasterize the new shape
114                $this->lines = null;
115
116        }
117
118        public function rescale($xBound, $yBound){
119                $xScale = ($xBound-1) / ($this->xBound-1);
120                $yScale = ($yBound-1) / ($this->yBound-1);
121                $this->xBound = $xBound;
122                $this->yBound = $yBound;
123                $this->x = intval(round($this->x*$xScale));
124                $this->y = intval(round($this->y*$yScale));
125                $this->rx = intval(round($this->rx*$xScale));
126                $this->ry = intval(round($this->ry*$yScale));
127
128                if ($this->lines) {
129                        foreach ($this->lines as &$line) {
130                                $line->rescale($xScale, $yScale);
131                        }
132                }
133        }
134
135        public function hclone(){
136                return clone $this;
137        }
138
139        public function __clone() {
140                if ($this->lines) {
141                        foreach ($this->lines as $k=>&$line) {
142                                $this->lines[$k] = clone $line;
143                        }
144                }
145  }
146
147        public function getType(){
148                return geometrize_shape_ShapeTypes::T_ROTATED_ELLIPSE;
149        }
150
151        /**
152         * @return array
153         */
154        public function getRawShapeData(){
155                return [
156                        $this->x,
157                        $this->y,
158                        $this->rx,
159                        $this->ry,
160                        $this->angle
161                ];
162        }
163
164        /**
165         * @return string
166         */
167        public function getSvgShapeData(){
168                $s = "<g transform=\"translate(" . $this->x . " " . $this->y . ") rotate(" . $this->angle . ") scale(" . $this->rx . " " . $this->ry . ")\">";
169                $s .= "<ellipse cx=\"" . 0 . "\" cy=\"" . 0 . "\" rx=\"" . 1 . "\" ry=\"" . 1 . "\" " . geometrize_exporter_SvgExporter::$SVG_STYLE_HOOK . " />";
170                $s .= "</g>";
171                return $s;
172        }
173
174        public function __call($m, $a){
175                if (isset($this->$m) && is_callable($this->$m)){
176                        return call_user_func_array($this->$m, $a);
177                } else {
178                        if (isset($this->__dynamics[$m]) && is_callable($this->__dynamics[$m])){
179                                return call_user_func_array($this->__dynamics[$m], $a);
180                        } else {
181                                if ('toString'==$m){
182                                        return $this->__toString();
183                                } else {
184                                        throw new HException('Unable to call <' . $m . '>');
185                                }
186                        }
187                }
188        }
189
190        function __toString(){
191                return 'geometrize.shape.RotatedEllipse';
192        }
193}
Note: See TracBrowser for help on using the repository browser.