1 | <?php |
||
10 | class Bezier |
||
11 | { |
||
12 | const EPSILON = 0.00001; |
||
13 | |||
14 | public static function quadraticBBox($p0x, $p0y, $p1x, $p1y, $p2x, $p2y) |
||
15 | { |
||
16 | $devx = $p0x + $p2x - 2 * $p1x; |
||
17 | $devy = $p0y + $p2y - 2 * $p1y; |
||
18 | |||
19 | self::avoidDivisionByZero($devy); |
||
20 | self::avoidDivisionByZero($devx); |
||
21 | |||
22 | $tx = ($p0x - $p1x) / $devx; |
||
23 | $ty = ($p0y - $p1y) / $devy; |
||
24 | |||
25 | self::checkBezierInterval($tx); |
||
26 | self::checkBezierInterval($ty); |
||
27 | |||
28 | $txByTX = self::getQuadraticValue($tx, $p0x, $p1x, $p2x); |
||
29 | $tyByTX = self::getQuadraticValue($tx, $p0y, $p1y, $p2y); |
||
30 | |||
31 | $txByTY = self::getQuadraticValue($ty, $p0x, $p1x, $p2x); |
||
32 | $tyByTY = self::getQuadraticValue($ty, $p0y, $p1y, $p2y); |
||
33 | |||
34 | $x1 = min($txByTX, $p0x, $p2x, $txByTY); |
||
35 | $y1 = min($tyByTX, $p0y, $p2y, $tyByTY); |
||
36 | |||
37 | |||
38 | $x2 = max($txByTX, $p0x, $p2x, $txByTY); |
||
39 | $y2 = max($tyByTX, $p0y, $p2y, $tyByTY); |
||
40 | |||
41 | |||
42 | return [ |
||
43 | 'width' => $x2 - min($x2, $x1), |
||
44 | 'height' => max($y2, $y1) - min($y2, $y1), |
||
45 | 'x' => min($x2, $x1), |
||
46 | 'y' => min($y2, $y1), |
||
47 | ]; |
||
48 | } |
||
49 | |||
50 | public static function cubicBBox($p0x, $p0y, $p1x, $p1y, $p2x, $p2y, $p3x, $p3y) |
||
88 | |||
89 | public static function getRoots($a, $b, $c) |
||
106 | |||
107 | private static function getCubicValue($t, $p0, $p1, $p2, $p3) |
||
117 | |||
118 | /** |
||
119 | * @param $value |
||
120 | */ |
||
121 | private static function avoidDivisionByZero(&$value) |
||
127 | |||
128 | /** |
||
129 | * @param $t |
||
130 | */ |
||
131 | private static function checkBezierInterval(&$t) |
||
137 | |||
138 | /** |
||
139 | * @param $t |
||
140 | * @param $p0x |
||
141 | * @param $p1x |
||
142 | * @param $p2x |
||
143 | * |
||
144 | * @return mixed |
||
145 | */ |
||
146 | private static function getQuadraticValue($t, $p0x, $p1x, $p2x) |
||
152 | } |
||
153 |