6TF9鱈o3GwY9"rwU7oSXȯuXqQ?c'zo9"10oDZhҼH X4jXtF݂ĕ%zפySb@[ğ)O* @cmԘLS)\EEO"8=tԩ֏TM Kܦwk`$;"p]Ea6lB$1TG,w&^-XǺT"O%IՄ-+կA8KZ%ƂHf \͢hW7buqWU4\t L^Zi.s~zU^JJšE˞ HNm:5 c&SЀ/bAK8`G;zN|`xZ%ޟ-ͯh"*26Û٣[Q kip?T{5$%d^0a 9kmkX֟]O"8=tԩ֏TM Kr"ᆰ^ j\9Z䶟(} ;``ϓ? oZ.D/G=q3UK;]h#~hI]\/ͶTg 0|HoRWɼAa;2|k3CKGbnO#XC>INZAD "Ad•<ƏNh!;KT9Jiѻ!qR |(✾D[~XB%N!2H  WQwk0r= 9M[l*72GOBIU.Vwo nw$h%fd>G3r\u|0nj R!Z7{ݔOAK"տvuX qFGp"7Ab/@ y9 f1\?i_xCpdW41٥Y"irvc.LaN-KKTDz=xBZ@疜/H֒F}j8k?y]C+gHEzQWH+ANpba}y;¤-Y+],i^  dYZڨD۵lUTXi >K@1ԣߞnd3 ǻz=xBZ@ƃoJ a'>BBĔiI+ŇqL f!7U}Z30i}ؖ7If0w$5h Qk\ A)˘XBq Yr]m2dުD縷{C!{%;ql\ٺD1cNLXGr5&NFT1/|S:S'Whj|k;\mAv;db>͗ylsV!feo1ЯTh.+B{.d+8>78i/W_*~{Ebs8~Մ'q$6Ra^μsS}7AH%%JUJj22-zLj$o.!1ЯTh.+B{.d+8>78i/@1>)+fdC3BBfcҼ5c3v?xb({^=|,dx7p Y?_8y{@VT:r€S@U+uΘP^@+&G"5Kjb4w"tںq*{4lf#gzs^Ho=TIBǠ-5W,(;i\JD/c;c9wO󰈙ޓ0 )XF;ҩmBPnAG Z…wg[eʜ$}҇mB;5cꀊYcZxpD8q"ORLO!&^ĉ+8~*&7| F  =L㨳ݑP ʜy1jҶpi`OWKu7J *_QA H0dzR+[/6c\./IZ{~)ti=p[J%$L}l: EV&u.||58\OӰ|c_vYM#:(@ #\=kRd?.= ù]\%p@2e=u#IVf|˶£uޛ(yW{9mMUļP:ArƦb;s7)IW I5q`B1TAkdIg`yq+ʂu<BU p7Eg'-+r?1&Nw涬זnʷ^0!`H삶Lku9x"l\'dzkmRt VTd&n^9{1?VޑF䲛,4AߞĶc++ZR O$orytg /.lVM/CJ F-H Aߘ *o˦?1Fn"yP;>-Pk=J}}e9Ud@kfG Rz A7dnOג,(Qӭ!BJVbm!ۙxRadius; $rY = $this->yRadius; // F.6.5.1 $dx2 = ($fromX - $this->x) / 2; $dy2 = ($fromY - $this->y) / 2; $x1p = cos($xAngle) * $dx2 + sin($xAngle) * $dy2; $y1p = -sin($xAngle) * $dx2 + cos($xAngle) * $dy2; // F.6.5.2 $rxs = $rX ** 2; $rys = $rY ** 2; $x1ps = $x1p ** 2; $y1ps = $y1p ** 2; $cr = $x1ps / $rxs + $y1ps / $rys; if ($cr > 1) { $s = sqrt($cr); $rX *= $s; $rY *= $s; $rxs = $rX ** 2; $rys = $rY ** 2; } $dq = ($rxs * $y1ps + $rys * $x1ps); $pq = ($rxs * $rys - $dq) / $dq; $q = sqrt(max(0, $pq)); if ($this->largeArc === $this->sweep) { $q = -$q; } $cxp = $q * $rX * $y1p / $rY; $cyp = -$q * $rY * $x1p / $rX; // F.6.5.3 $cx = cos($xAngle) * $cxp - sin($xAngle) * $cyp + ($fromX + $this->x) / 2; $cy = sin($xAngle) * $cxp + cos($xAngle) * $cyp + ($fromY + $this->y) / 2; // F.6.5.5 $theta = self::angle(1, 0, ($x1p - $cxp) / $rX, ($y1p - $cyp) / $rY); // F.6.5.6 $delta = self::angle(($x1p - $cxp) / $rX, ($y1p - $cyp) / $rY, (-$x1p - $cxp) / $rX, (-$y1p - $cyp) / $rY); $delta = fmod($delta, pi() * 2); if (! $this->sweep) { $delta -= 2 * pi(); } return [$cx, $cy, $rX, $rY, $theta, $delta]; } private static function angle(float $ux, float $uy, float $vx, float $vy) : float { // F.6.5.4 $dot = $ux * $vx + $uy * $vy; $length = sqrt($ux ** 2 + $uy ** 2) * sqrt($vx ** 2 + $vy ** 2); $angle = acos(min(1, max(-1, $dot / $length))); if (($ux * $vy - $uy * $vx) < 0) { return -$angle; } return $angle; } /** * @return float[] */ private static function point( float $centerX, float $centerY, float $radiusX, float $radiusY, float $xAngle, float $angle ) : array { return [ $centerX + $radiusX * cos($xAngle) * cos($angle) - $radiusY * sin($xAngle) * sin($angle), $centerY + $radiusX * sin($xAngle) * cos($angle) + $radiusY * cos($xAngle) * sin($angle), ]; } /** * @return float[] */ private static function derivative(float $radiusX, float $radiusY, float $xAngle, float $angle) : array { return [ -$radiusX * cos($xAngle) * sin($angle) - $radiusY * sin($xAngle) * cos($angle), -$radiusX * sin($xAngle) * sin($angle) + $radiusY * cos($xAngle) * cos($angle), ]; } }