Skip to content

Instantly share code, notes, and snippets.

@Fil
Last active Jan 27, 2017
Embed
What would you like to do?
Versor Dragging - d3 & three.js running in sync
license: gpl-3.0
height: 600
border: no
<!DOCTYPE html>
<style>
#map-layer {
position: absolute;
left: 0;
top: 0;
z-index: 2;
}
#shade-layer {
position: absolute;
left: 0;
top: 0;
z-index: 1;
}
</style>
<canvas width="960" height="600" id="map-layer"></canvas>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://unpkg.com/topojson-client@2"></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/r83/three.min.js'></script>
<script src="versor.js"></script>
<script>
var canvas = d3.select("canvas"),
width = canvas.property("width"),
height = canvas.property("height"),
context = canvas.node().getContext("2d");
var projection = d3.geoOrthographic()
.scale((height - 40) / 2)
.translate([width / 2, height / 2])
.precision(0.1);
var path = d3.geoPath()
.projection(projection)
.context(context);
canvas.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged));
var render = function() {},
v0, // Mouse position in Cartesian coordinates at start of drag gesture.
r0, // Projection rotation as Euler angles at start.
q0; // Projection rotation as versor at start.
function dragstarted() {
v0 = versor.cartesian(projection.invert(d3.mouse(this)));
r0 = projection.rotate();
q0 = versor(r0);
}
function dragged() {
var v1 = versor.cartesian(projection.rotate(r0).invert(d3.mouse(this))),
q1 = versor.multiply(q0, versor.delta(v0, v1)),
r1 = versor.rotation(q1);
projection.rotate(r1);
render();
// Rotate Three.js objects according to the versor
// for some strange reason the order of arguments is not the same
var q = new THREE.Quaternion(-q1[2], q1[1], q1[3], q1[0])
//q.normalize() // not needed since our versor norm = 1
sphereObject.setRotationFromQuaternion(q)
drawShadeLayer()
}
d3.json("https://unpkg.com/world-atlas@1/world/110m.json", function(error, world) {
if (error) throw error;
var sphere = {type: "Sphere"},
land = topojson.feature(world, world.objects.land);
render = function() {
context.clearRect(0, 0, width, height);
context.beginPath(), path(land), context.strokeStyle = "#000", context.stroke();
// context.beginPath(), path(sphere), context.stroke();
};
render();
});
// Create 3D scene and camera objects.
const WIDTH=width, HEIGHT=height;
const RADIUS = projection.scale()
const INITIAL_ROTATE = [0, 0]
const SCALE = RADIUS
const BACKGROUND_COLOR = 'white'
const TO_RADIAN = Math.PI / 180
const TO_DEGREE = 180 / Math.PI
const ROTATION_SCALE = 0.25
var scene = new THREE.Scene()
var camera = new THREE.OrthographicCamera(-WIDTH / 2, WIDTH / 2, HEIGHT / 2, -HEIGHT / 2, 0.1, 10000)
camera.position.z = 500 // (higher than RADIUS + size of the bubble)
// Create renderer object.
var renderer = new THREE.WebGLRenderer({
antialias: true
})
renderer.domElement.id = 'shade-layer'
renderer.setClearColor(BACKGROUND_COLOR, 1)
renderer.setSize(WIDTH, HEIGHT)
document.body.appendChild(renderer.domElement)
// Create sphere.
var sphere = new THREE.SphereGeometry(SCALE, 100, 100)
var sphereMaterial = new THREE.MeshNormalMaterial({
wireframe: false
})
var sphereMesh = new THREE.Mesh(sphere, sphereMaterial)
// For debug ...
var dot1 = new THREE.SphereGeometry(30, 10, 10)
dot1.translate(0, 0, SCALE)
var dot1Material = new THREE.MeshBasicMaterial({
color: 'blue'
})
var dot1Mesh = new THREE.Mesh(dot1, dot1Material)
var dot2 = new THREE.SphereGeometry(30, 10, 10)
dot2.translate(SCALE, 0, 0)
var dot2Material = new THREE.MeshBasicMaterial({
color: 'red'
})
var dot2Mesh = new THREE.Mesh(dot2, dot2Material)
var dot3 = new THREE.SphereGeometry(30, 10, 10)
dot3.translate(0, -SCALE, 0)
var dot3Material = new THREE.MeshBasicMaterial({
color: 'green'
})
var dot3Mesh = new THREE.Mesh(dot3, dot3Material)
var sphereObject = new THREE.Object3D()
sphereObject.add(sphereMesh, dot1Mesh, dot2Mesh, dot3Mesh)
scene.add(sphereObject)
function drawShadeLayer() {
renderer.render(scene, camera)
}
drawShadeLayer();
</script>
�PNG

IHDR�X�G�c�IDATx��}�#wy������Ψ=; �Je�=���I�!6-�5�X�5��C�e�``//Ac�%�kǴ(���`����E�걏!��ښ�Cmn��p9��|Ā��6��гﳣ���?F��KKꖺ[������I��I��~��{��'!�B!�B!�B!�Bq�1�:q�x��\��A�.�>���'�qX�&���w���a1/�D|D<(�'�%���\�V\ ^'��!B!� ������DN�6vL�����~v�Wcg�և6wm�W�+���J�2Sٽ)�yI3�Xe�2Y������Z;3���g������c�6�o����!~��B�����=���_M��~>\�LTb�Չ�{3V���W�+S?�����a�q�x91�B��~q�84q�ty��c�ݕ�u/���^�]��~q�<q�8$���K#�L.�G�c����Xe�2��'���F7�*c�����I���q��B�͸x������~n�2^�U�b��V�2^�L?7�O�c�b��dB!~a��R|\zt��vmNV�6�`�fkls��ks���G��ŕb��xB!��q���S�.��2
�5������70AM!�+����?5�R���o�U�O����U��_ B!�p��Ez|dm��W��5�qq���_B!��jqT����ɵQZm��������x5�8�BzcB\7���1��*�Z��+���:1�/!��\"�~ �{�V��ܭu��Nq �T�B:q��}�=^�E�t�x�����w�?��BH3�N�����k�K�����#�嗍B�B\'����$������u���u��BHt9;:z��;97���A~ !$Z�G~2v&Ƅ�����ّ�E�_HB ?����g'h>:�����8�/'!���)���޳���=4=�]��ъ���b�_TB 陯��L�y-���'��o0%M!a`F������ �����B���ʐ� ��U���yoWru)�׽J���w�R̋~y !$�\=sT }�?�ea�(M�����PF#�j�Y�����~��0�M�أ�j~� !$X �C3O�����h1d�@�^3��6(h��̹bK��m�������_�zAC�BBH�p����'��ԣ�ǡ�01VZ�!��O,"��Ȧ�� �kz����"t����`�J��c!.��B��5�ߜX}w���Q�h致#����.!S�|�u֯BA��d^���` �^��j�G֥o�k�'�?r��O����!&�s�D�V�[�9
��(6�l�D*��Z7eh&��"���-� ������F�2����_tB��"������t���zG�Eh ���>#�f�j�k`K(��6��I����iMW&VD^ �KO!��%�S��;~;} {��Է�j�\�Fv�k�Ur�XL U����s�~� !dP��ݵ��3G�2�$�(a���ȉ8U������M�'�S�Q�q>��5������^��>�W�<$�U��P��#V�ג�Y��9�m4�ޭ���_�ks��*> ��b�#�6��/�իf��L*]+����O\����{{=a^9�����"Bq��K��}l�`���88c'E�u�HVVi�|`���Y��c���Mxx=�_y�0!���+��8�v��C��RQѩu(�1�4��T������Z2\ ]$<�፩��+��B��H�w��<��"t���Gkl���PPr᜶l:Q�HH'Cz&,0z����B�S �;�V?p�9�e��uh�YB dj=�n�Խ�w�,���̈́҄G1\w�O�B�ࣣ�s'X�hu�D�C29�,J����u����v���lċm�k2��Y�7GV�G��BH?\?��k��&N�,���}��!�{����kW0$��b�jA+�n
�6)xِ��������BH/\~�?MT�S��,ƾ���/�$y�=�Ͷ �L#�
(�������%�W?5ɴ78�,��AI`�r�?��� B�Ο��������n�Aqd}c�nO��Zj"�Z�Ѵ6��"�kt}��YM!V9"0�i�Q�0BQ�Ũ /1PB��i� S;�mg��.�I��1�#|�!��M�bz]@@E�k� y�k'�֝o]l��^�нG8r�ܘ����!����gmK2�د���*�vGq�M�r޷�E|�!��;Ʊm�@�K�[�k:��΄�DX@|�!������9��@
�(t��l��}�Y���d��qq-8BB������&�Y�����7|�K(Զ5j����J�kb/<BHԹy���k� @���d��
[�n��M<����Uq3>BHt�d�ۗߵs�;�9ډg����gq BBH�����j M��X�?���mD���U(�PF
2(� @���$� >���hq���ʱ��tO=kX@:���2b�0�_m3JƠf��#q)HBHdbߡ�{k�cm�s2�W$((�j���H2z�&�`BH$b�}���x��v�].~�q��c�X�2 J��s0&�D�Gvm.Ԥ�Z�-�Mz��.tX��-L~]J�gֻ6�#|@ !����+�G�bo�zAv�z5k���O��֬�$dd|}qC�z���9j߽.=.^��6n�8���t��x�ˮ_ob�v�V�� �l&�^Gt`䜸�+!$< K�Ǐ�'�SO~i���}w��P�-�؀Ֆ�"�]�0��b�-!$ d��o>Si(7�ɯ(Z65��Ty������K :GF6��qu�3��w�w�N����79�X ���_�Ц8‡�\��{��l��w�z��E1:��l�����} �u[��.: IK[����c���L�:�����%<�:�߉��g����o�z��c����'�����h��e��j�$krE��2!$hܾ��QїjR�*xrC�O1�W/hHcK���-cMvi�1�Xw\�@�(Xn 䚯۸)�CAqd��T�]�ŏU��|� !�ᢩ'�4�3��9Ġ����ȟ�u�I��m�P�"r!�m%uؾ�PQ,�i�*S?�PB��U�_^�af0iġ� #�0a)򻎬�� � cޑT|����Yp��T qK��0��(��M�;���4�T]\��PKn�x�/�ţ��g���O��y�l��wg�Wgd-E�C�nB����…+�o�u����pD2��#��� e(Pw$A�F̀R��Pl�@�VE��Y�N�'��=���]�n��6�ط!�\�<ru��4�� ����@�F��s��� �Gb?tB�߸f��g-�܎�r�d�g�4�Ƭ9cGo�mT��w0�q ��k��B�ćF�n��y*A@�B�5aKmʉ��@�Z�����]�U@�,��;G���C|� !>a�����[h���b���gS�����JD-�>^�2�� ���MN��,x���}|� !�gd���J�xVm3���Fr� o��[BI$�Gɡ�A1�ܼMw>u/Y۳>sL���'� �3?��Y{���^a�$h��&�Z����7c�q<!dp�ex� e-��yW�~M�vk�X�ә����[(��Ap��Ɨ-��Ȣ���w��6,)�,�0�E�|�`�qkצ��B@�[gN}�bw�V�B��I��u;*[*J
���n�qcq+ŀ�!�Xy�VL���b/�w�ڵ� T�g-�ς�Z�~��޳6��TB�G�<,���j�ZۈxY�` ,8k+!+��Y9nNc V�Kڳ>�U��>S#+7����v,�bpP,8א����亍X��wX��xts䤘�8B����O^�~ꛭɶ�`�ۃ( XF������j9![���v X�yz=vs 1]�O� ����� ����ר3�L�K$l`s5�Jם�jվی_u�FBvK6,8�S͵�K��>vn�c���b�!� ^�Ǹς��5�U�n�5je��V����份����/_�����;�Y����K�������)���flu�r��W/��(�9M�ހ�MzgK��+?�a��W�e6����yg��os��H��%B���]��v�n���A&s����O�QM�Ju��_��1[�V�K`Ǻ���"t�P�Up�M�n
!�)�;��9[�����G�* �@�\�\�8Ԇtt�!.6|�>��,�hH��P �X�<����B�(�7��� �V�{)�'�ir���Nc�M�GÒ��3��Dۑ�E�a�����,͙� �6��rd�\{u��.�<J ���F�{0~N�D� ������|Ϧ��]]�<�~�"2?��l'�͔�A�i޷Z�?%"�� T;dj�k�[pڂ���xB��t�q�R��lH~lB*c (������4{�P���l^�aԍv��9��4D� r���GH��!
!�W>:{�ɮ�
�����S?�w��:�0��R+N�*�ڂK��S��{��4�T����g�;�.O@���ٓ�BHO�;��vU_n��fcm|_�Wӡ4$��}�r�{�WGS�YTX/��N�ۙ�\��x��R�is����-��C�y��:&���\筵PmM��<���G (T;���TeK�w�s@�������͈^�
(�����PF�k�����a�$ф{�_:�dG�UPh��< ����$��G���-\J�[/mУ`���d���!���c�
< �4˱!ֹi���%Zm��D���f[��
�bP]�e]� ��@�CjZh[R��Ը
�c� ��!�x����,��u����D�Q�s(�]��q$��=����y3R�.�.vy���,���ar��9!ݹ{l�1��W��|-e.u�nt(����E��� ա���x��[/��#?�~2X�#�PI��5�6?��v?�s3�M՝�u��y���CH�=�w�=d=0�d����@r�����JՄ��a@���5 ����~l�a�eYX�F��b:l��XHi3�x;Y�s�<r�Ø��ӆ��"�6�b�����n@�ö@�U��}��j��V��H��B̹x�����9tΙ�"�Ll��f�V[�0n�X�2Pm�{�,3�c�=��u]�l󶆐8yԐ��F֧��O��)4��fΗ^���L�<���'��x%Y-�Ѱ� �Ŗ���o��2@������ϝ�J�Q���ec`/ާy R�wV@`�W�|� !����O}�����X��PlHn�o�I�t̵�A� ��� M�g-3y����g��0r����€�f3�T�#��)
!������U�<*�ҫ���\rCԑ���jU��6�i;Lź�G<��k)�� s]N�W?]e@1�Y%xc9I�!�T�}�Ɠ^�(���СA��r�3Fʐ��Ω�s��3?2� ���C"�9���u����1�IԆɓt���#TB�b�yŻ$aޱ��b��QF��6���P�RK3U��v�گ@̧Qp��-F���n��/�UcKu��F������%��r끕]E�9y,�6Z�����l�W�C�]�^��MO������p�e�&��M���+�>�#�N�].��P��ږfϚ���CH��q�����m����F���j�sm��J��]��|[�߶�A��N��I:��m�Lyu7�����iU�_7R��.o��NK��aR�9���ԭD�Ӻ�x"��|�l'������['7�oGk�]w)��}�g'��xOA�\�-ߵ)�B"$��|�$�5�`�A�3tb���N����R-�޼}(5�4�[
~��?� �~�>ɡY|���R���)�ni腎�m��N���� ��"B�����cZ��x�\٣$`# MѨ�`�ڨC�$f߶��T�&����*J�~3>I��d,;��2��B���Ns��nR���bω�!c�>k�\J�-G���s��X������}X�<�(����=� ��o��r���^�F�>��eX2'��o��5�[��X����Զ"�4���(�ӨF�D�ѻ�+����j�:g�qR(��BDŽ�b��o:63Q�!�T�e/[�˘o��1(&��.� �MQ�Q��p�� ^E�%��z6��hy ��=��Q���7:6��Qp��}�k��d�!WW�V m�D�ezMN�6�r��6"ͳ�\������.��J���`��� ���g=�a�;��xX�t�drM|��DH4�ft��m�~��\�8�l�xKGź����Hpg3�^;5�6�Z��n.��^�� '63�EOe0�l�u��@���� `�k����`B���ѳ�w��7���,2PMꇝ�X1��0��ŨPo:ޮ�Uk��v�k�#�m7��J�`��ִ�S[>�T˧��3.��:ʎw���)N����'>�Q\uh��b�X���4R�� T�7]B��3�<t,"�4����;[R���E��!��3�Mӡ�e�����&\n�P�a�jvZ��X�q�������<�����DH����;OX�׭� I�ؾ�ύ%�$"cP���dKI�<d�k��^Kh˶[nhM���h~��-����|�c�C�vn�k{)�7����e���8��6��T(B�ˡ W�����D�ub�5�! ZC�=�eS���t��EXB������!d�J�T��-�!��c �ۧ�
J� �Ⓞ�@��X>��k�f8�^�(R�����׿oIT�kR��@��ܥd����3R;���6���6$E�m.��#e�M��ei�7��+�,8u�'S�C�*
!��@�Z��T���`p�$4�%̛��j�� �u�[����C��Cz��xm{�1�ezq��X�}O�6�����PwPQv���󢸈bEH�N��j�z��ԜSt�B8f:��,�HU�-���E\������Go&%���~dAGo8 ���f/�8��S�.
IY6`44�9W�5��!���+-�3�\N��2���)*R�F����1h��}h HX��q����f���1�‹>�T�0a������I>3���N%t9��g���,B��[��}�ϊW��>��:?h6�rÙ�Q+���LB��4hР@F�/S�vdD�Am3�_+m)�ݩ�����};���[)Z����ӿ9ڧ��׈�Y�
�^���ZT��b(5͈�]3���)Q�[�BCu�?ca���u-�J6m�2�l�vb/���0{��~;>�.9ڑ踩%�dP��[��� ���y��~>-�`ڃ���>5߸�8�r(��0̣{%�̷�\��#o軛���HW�o���I��4U(o�ﻀ9�j��){�+��zTl�M�4ˏl@��K��q�W�i��sw;���8B�"$��ן�[0�p�� 6�5%�4��wΧcպ�r5!������R�s�>k�Uϒ��u)���:�;�-��{��p��ކ6D�FHp�~�N��6��U�ݍ���j|��E"�!u�����]���9�����;o�1�c�����κeS��߇� b�"FH@������=Kc�T���<kR��l(����j��{�ֶm��C<�>L@k&ۄX�� g�_S�Ln�����.ki�_�Tޒ0�CnH��Ӎ��:�M��KE���缥�.�F<l�Պ!o1�q�U�����BFH�x���o9"�%�[�Ni�2�QF�A3]�����O��ަ,nY���赖�]�P@�%����:qT��?-^I1#$`��>������4Ix�Z����]����?��%�ۯ
i�P��CMLQ/�2 �k�PB1�'�#���>�jFH�x�
Ǯ�q;�S,����$Q� �r���3�bH�����NԲ��{ӲS�mVf�C��]~���5�c]zB<BA#$8\�k��U��{�@e�Nۋ���Y��W
u��I=�{>��� "]�r}d�i�)hP�ҙ� �kS\JQ#$(�������o}d����m�c��Nq��)9WNd��([��c�ſ
uƾ���{"߯�o����S�4��� >�&7�n���["�"(PZ�ɱq4��;�c��/�l"s� �mr����L�J ͳ�Wo����L��|��Ρ�Ƿ�S�b�����S�6B�~�x�1�u��u���9��#Y-�10�rK�M�j��p��yQn���l�����[+�����/�؀��b9Y��Oc�4���&���>qo�F&$�����K�^�vD~���7=vⲛ��qOBnꠎ�ݖ��i����*�Z�ȣ�����H#�B_k�W�}��g����������Ŀ�F�x��6��u�-�uB��5��ɟ�pv��7�Yܱ*e;�CŦWc�� ߡXm�h�M���C;T��K�H�l_S}m=�� �� �3� T�[��ĥZ��'� X�����ez<�+۴?Q7�˙f�gc�[���_B5i��0��@
�62��f��Υ huVk�*W,����^�6��Ed��x�R��%9B��~~�n1�(!��l1_����Yf��Ş�]�&S庻����{r�+�g#K ��������W���j �8���$ �_�m������B��'�1�m�!��椣����k#�q�Pj7�EKX@�)��Z�8���Ou�D3� `�|��u�u�����@ i����=ݵ�Kn�FgM/>�7�%�K q3����w��wM9�Uo�ɭ��� )�"�$PF�ȣhi~T���Q{�����^k��}�ij�����{�M�Z2�:t;VZ�_��7���s5'�ɓb/Ŏ�q�Wo]sz�_ZA� ]��d�|�A��1�>CJ�ђ$G߫��m�z�P�n���qր%��-�/Ai��t���~gf���P�}��"���#k�}�jG����e'��Ye���2���g�-�+�2R 秉�K�je�'��n����1��l�RI�6#�l��%�C��qk-&\�-KZ��3m�׋m^��������<B|��G��AG�;���%W��F�eS;��:���`�N|F�[ԭ�٨�b��X:�t�i��]бlzv�Uo?ߐ���n��o�jy�T� Y���:��/&_������7����5��6��4��mR;�%js�$K�"�đ�}z���; Kn݊��+5��) ��Z�,����퍃��/�˫�:<{Ɏ��돋;)z�����qA^�d����۝��;6u�8�u؂i���(��&7//m����Nk�{j��
�E>B|���?튄�|d�RW�7�o�T�m��Ϸ(1W�V 6.�~�t٥��U��ndz�m N����u*!����ݐ�g)���'�a�;�gi�I�~b�d@O~[ ���l�z4�1 ��R?�`�65�N�b�qqŏ�3�?䂀h��-)W�Ε*B@�b�rX�a�j��ϙ6��V��Jm[u�^s�C���G������mc��%��0�S�,Gw#��d�j�Ԣ^}?% ��vҒ�[�"��".��~Ⱦ���ؼ�u�[&�m��kN�#@B�+�pA^Ӂ�_���eA���[;i�^������66%�V��F/kqRW*2�@��H�.}6vk�K��x�|� !Bz�O+n Y_��%RSt��d*�g� �7Ρ*u�f ���gv���6��h�u�;ّ-v�4���޺�ph]z�*H�`�|�̩���y���� ��]e "��e,w�Ь!�g�J�f������ADs˙ �.�!C���T���e�|O��߾4$��|�ak��)L���)�� ����s��U
���,��M8vR�{o&���yIu��v&��0���@'hJrzxM��Wj��݆���JH��\��Z ����bc���9��n��v�W �+-Y�$�+6\ʵd�x��LCk.tΛ�x��"�4����S �gr%�M�~3 �W�������f��Pp�.T�l���b&��@K U�����(e�0�ғ�v���)L��jH��|Tv�
ٹ��o��M�Z[�3�I�^ڑ [w�?� ʖ��UL�i d�v԰�M��T��lϳ�ܜg^�U����g�G)��x����/1��$t[���x`�KG��ekY���ƣԡW��`�������z)t�:���܂����]�EB��w�d�Q����^�߬I�f�^�9t��� .�ꭵ�%�`I&�d+
Vmo��6��c��y��uqE�o��V肘fe�1��W�|���TS-��!�z�_��I�4A߾���iІ�� e�b��_��;6�`�v���� ��H�����3nHi�ʯJu'�ݒ���ԡCS������x$���͇�֠4ӌ��״�ו���6J� ���+�O}���TFB���6�s��9H�[lH)K��V걏��R;#%2�6Qh}�s�=��>dښf �sM4�A�Ԃ����4�OB@���H��L�����`Ūv���/iw��|��dֆ��2�R�Ym�ߵ�ߎ��^�]�����PO�5i��ߒ�֭���dk{c`S�S q��ck/:�J5�J��x�A Y�2h]F�Oo�`��YZ?�L�,�۬8�:\ �}{��Bo��6z��z�$��wY����x;��|��]�qOZ)�_��%c�Y�5u�Z�������^Ʀ"�8y�t�>��X[�%g{E�������S�c��J�$�=��9w�o�?�|o�����MQP��jHVG�+(�~z���Y������72z�綠�����D�N�Kގ�uq�"I�K��l�9!���w~O?�MQM��|��)\�dx}�LvOkY��(��~wYhե �C_�5����ewrN�4[OD(c���*U�wx�H���ƫ���>��ڦ��R��Ey�~N�Dd�Ѐ-d_2�7iPl$t36~^��]����A��\\8�� �*
%!.0��#�� �R;�R}k�1���D��u�d�-DDr��\0F�ܧ=�z:����r�}�7i����TJB�'>��kG�7ۗ3�e�d���Ub�W�J(7�g�Q�{b�9�1j�����2�q� �6E�bI�Ì?�d��Z������Z��)�߰�<+4`O��o�l�>1
�8�0v�jI���d��
�N�Nڗ�[���H��(ٳ`�q�3�{OCKtX˥Z^4teJM2 �������I��|���Ϛ -!^6�l1_���\Fk�T�j��US�
��Nd����Jd�r�@��4J��s
&!�1<qʍ���@�/:�.*w}��!���R�vy_<�}��[p��Y���n��Ł7�m�����8I���nț�_Ŗ<� b���]
5[-�iy�M�$t�:4�X?,q�z šd��y��[��&7D��I�C�~�+������hS�6�h I���;j�d|��t��{�������J�4�]�9�B�$�nz��Hp?��k�s��CE�B�չR9+�Ku�[��y�銸��I���t�%i���mGF�ۉn�
Zp0���w/�ZD ,0��ع5�<�����&~"�S5������$te�u�ds��S����k(�����7�r����,�����0WB���2�ܡ���H�5\��淩���Dž��\�5II���WR�a���� �.W
��.��j#^���R@ ���߲6��"��/x`��r��K[W����j�3�1��?TPBzgh��]6��M8w6km�p���H�Ξ����oU*`�+ 0zN QD �Co[q��C�]��u���7ğC2���"A��{V�{$���P�m�s�n� q�"JH��<�M�e- e`W��+yqӀKm##�I�ݖ��=��j�=4#�@%�7�~�i��M���$ ��f*���>�~om��f����)�����Ǖ��la��/ �b�5f��.6'����ik��OX���
���҃�
�踼������P�$�h�:{�}a���ǩ�B*R�+ f(���e�=.L�Ҫf�?�p��5���yYg����ż�9�ݽ)�)��� ���\��b� �w�2�V� �1r���|�k����Т�B`�/����#}��2'C ��Xv��i��5EL�Ks������ �
]�`#P�$��^i
*!v�߯}npƇ�8'j��6f�κ���zH�'�^LT����
HKTTB�3�k���Cv����Om��R�/z��A&�Y�SUB���k��#ut�A��^�K[�1�v$�p�&����5�.>HQ%�"����+BW�J�� x�X��oR�N�$Nn�:-�mS6��/�����X���w�N��G�G�/-��� ��ۯ��8@a%�
��Ȫ;B��yA���o���B�9θ�mJр!
+!�^��KB�A �p���J�a�N���ۑ�W �|t�G�~v���JHw���%rF5E�X�| 㽍�'�Sti�T��B`��� ���O�cd�D9A?�� Vp�T*�r]@p���TWB�0y���-��9�[ihD�:]�S�.t�z���Y�+!�9�t��T������*���w� ^c@��D�����&R` ��y}�KҦVg���ު��w��+�hւ�[��TXB:0~�9�d-Q=KF.��Dp'�O�:P�%��;.��sTXB�s��ni�!j�$Þ��w�=OW L9V�aK�������uYB�0s�/\�t�\5hr$�8 vw�Q���!�W�g���۰f��*KHF�~�b�dGdK�Naˮ�%��
(�4���/����:U�s�u+��Hp�#�9,t0>���n :���б��נ�6���ĵZBL�����o8Vѣ���K�G��ҧ����5�*-!&��ݏ]�ñ�&"��+�J�Q�ޚ��u�����ʕ�̀Sozo��\�$�]�>�nW�wM�WRl ib��;6ܐ�0]��x��K��Lv�)e�3��ִ~a�n�-!�'���]��p���]���R蓮Q�qkf������A�%��K��t��4\2��Y��a!��9p��6�L������K(������T�����I�?Ϸ��IWۑT-Yq�0��xeگ�{S�I�%��}���8*|5��4`�.�qMt��n3�#��X�2�CU��Z7�T\Bv�8�x䐠�u7�v��.1&(��ls����)��o ���^�#��&�7-����U^�@H��/�5��QF�,�
bm�gh�6�y��U��*�/;,U�< �}i�I�F��,�sYhE�U��-^=�p R.����ЀcL@��V��jgM��WSx B�����U/�U���P���f82m���vC��"����:z��zP�m]� �7�8`8��Κľ���"��8��+��[����A����WO�y
<hx�5~��K���?���R��V#^�y�M�!O���^�Q| ��gX����k g�mH>"I[��^�!n���k���������y��!,�
�ڧQ}I�?� ��l-:�>h�2Z&�A����Z��T_u�|��s�DB8yʭ������:-��<�U���hs����_�w��5�C �ц ga�6�Mq+�D��o�ƿY��f�Du�d:��x �A����&�D�=�}Ʊ�_����(�t�����˵8,��a6!`�^��(s��)�$(MA�y%�� Z�\g���(�Vh���E����ڳ*.���r��� M�no�v�^h�L@ �sN�@&�e���sH�8 יªmcM!��>R�Eh4a�����*L�*L"��O��!��gr�`��M`�F�qj��D_�8��=���R�IT�ݵ���(&=�R���"2UV�(xc)�Wp��ڵ)�Q�I4��5]���ޒ���p���� ���#�۝������3�J
1�&�١k��۩�b�x��F���{}�|�<f��ׅ�q
1�� ���� �u�nǵZ�ᜅ|C�kl��/����i���ר�$��������]Z��+tmJ2'ץ�xg*Y�������%��JL�����&�X����Y� ۓ�&�G�v���Lg�>=�a�S�I�x��݃����^:�7�?I�P��52鐪���0t�<���KΈ7R�I����vFz8���*wH!k�^3��:��U-\a{������Q�I�|�F�`x����J��߃
����CE�6FM܀�^�nL>F5&�c�_�C�<��|����0 j:��xk�_��$r�������I�� �],Д�-�a�����q�^�."�[o>Jw�3���8X���V0�k�����7�8%: ���U�tJ�(����A g�Y�
2�Gn]sFp8���(Y�sR��Cj���Ђõ^�)�P�I�ػ��ܰ �����Y� q,��� Juy�"�-�o� {���$R��ղCb���8�J(5t�j Q��h��[���"�H1��h�4t���&�rή��h�![�*2���s�Z��8�r��a` �uS�i�4�F���~�2�W������"�BK��7�=zU\MQ&��P֡�5��-�o0�3aw�t]�(��0q�"PKf R`�ńv�&�*�ȰO{�MH��-#Ť�\�xK�)~�m/�q�2� ���B��|� �u��BK1͗%X�_{~MU&�+4`���wrM��S_�Gf^; �O"���WoJ]�a��H����XE���L���Y����w�~� ��1�|X�D��vW�f ��v�V�.ƕl��op���Ú^�0�hp8�r3�o�qe�o(`[^��0��D��/,��b�羭�eZ΄ �7RuЋTf ����=�櫘F�
��W�NB���$�<�[.�vn�V�C�B���od��ϩ�$���W�$G�p؈}uzT��qL?kd��L��ЮM6]x�:T��w��5Dq&����i'e'Nᰔ~&4`.�� Q� W����V�J
=܊��&*�2�3 ?o���FS^�fe��#�{�O�DE���L�O�'��I� �Ѐ�Z��"Gq&���g��Ih0aR��6�3 =��� O���ui�'0W�2�cTgzf��a��8+/ENy5 ~��Z3�P�I���߲c��4���A�}��_Tg~����aY����K���m��Fu&�G��X����@��ؗ5�\ݦA���LB��y��'K�hZId�����4`.��Hg��$�;E�qu�P��Ҽ�(B���5�Nu&aglx�y��=0;K�T=��2�!T~��5�M1F�&��uC�΋�c��H��<Jt���Y���]��uhn.x�I�[+��3c`��䚸�M��k�ǝ��Q[
}(�������+�hn.���qL��ő�����#����M�M�h��t���}���@�ps�M4`�Ht1���\=Ί���hn�u�8 ��1�[��N�0E�h�1TĻ(�$ܼ��'i�N/1�A��Ӡ�[����(�$�<�*np�(Y3`:O������
����|��[�Gn&�v����~#����>B�&��O>|�-��T��OL?h��O(�$���ɪ;�k�K�Ajpe��
4 7�oYsǀ�ʐR;���?<����S�I���.ae��[>2�eQ��x�{'����c�F�&���{��N�F�^�< 1`�؁u���O�٦;�E0'Py�K�$i���OR�I� �N���e�K"����t�ZE��0SЄX+��ӊ�“�;�ZL �EX�X��6$@���b��'�D�!5��P�!ҁ[�ı��NDЀ���:B�<��FQ[c��H�F�!=���GQ���7�G�YQ>b\�󐈤��P�7��H�����!=�ZV�
QXM� ���e�0\�j�@<H�&��}�>���չP4`e�< =ٲ�vv�[�@�p��݊��Hp��C�΁�d�.G�3�.
4 7����&R�5`��CZ��L�_ä�����8H�&�&����T��1f�BAV�l8=�z�"�hn.�xō
蝖#R���Ӑ�d�P��|�yv҃-�dE\N�&��q�π������ ËI{b��uO���wf�W�k)�$�\�Rǫ�KM�N�8����s�R+����{��&��hn^7�����R�7�2�t���~E���6��(�$܌ �;/4j��k�� �}=(!�$n��q��m�1
4 9��N� 4�-9�[0�}�uʁ���^ �S�I��c<��l��)���E�L=;�"�<�����3 =��~���l��!6`�nBlcd<��G�ˡ>�_Q�I���c��VSB1�L�%�<~O?�W~�Ě�7�3 ��o]��! -�.�LH?OF8o�v�9�~��LB�����$4[�Ő0;~I���Z���99 K�&ՙ���c�.ɌZg�z��_^�~��vT�Ez}�ՙ���Wܑ�΀Ó�γ�8�d��BMGϷo�8��{�I/ 8 �"�z>#$(����T�^��M��8���+ / 8�1p��gz���Μ��c�6�3 ?�]��̔����~)�8��{���ޙs�DE\Fq&����iwdFi�N�~� } ,���tdžΎU��)�$� ��tGd2 ��:�8=�8�?d��qpp��řD��3?rEb�z3��[� ��W$�,;��ʎ$؇ר�$�<��+�7=��IN*4��Asi�!�7`ձ3n��8x��Tf �i�$2���=9�5�L���a@C����'I� 8�p���l6<]�2�H0�W .���d^� ���&�4hMF�h�E(P�X�,���ހ���� O��L����9�dFn��-��wl�0����%���+B��=�k�𞎅S�I4x��Wܒ�Z��N��Z��Ɗ��=)N!d�(���?|�^�0�hp�kV�{�� {k��d�Z�}�]i�5�UM�t�~AlIn���;����{wE\Aa&�����=zyٶ��Ԏ�#�L���0I��� � )��o�g�� Q���^����=��k �:(>GGѓ��l�b�����G/ސ��? �y�A�Ɇ���|#n�kϯ��$2��r�ѓ�V��}ozr�_%O���� n��nk/)� �3&��s<���R���WJ� �x�2��W���Z��'�*��p({�M�i�I��7�V���Aq ��(޷��F7�!�2�W���uFK�G6�oJBt �8����ޫ�㧩����L����Ny� �a�:o&>� �Z��׬�&��e!F�~�����?��k�Z�q0&n� e�s�<�NE&�b���}� �j@���R�I��w��zY��b�wTd)�.-z� ��08��w�o1d!�6�#9��5��Q�I�8��y�(�}���<,�)Z�A:_=� ��d�
2��x�Ǜ�|�"���,���DH0j�/��V
�b�
2��=��n��%$�@�� GΈu_��񊸀�L"����<~����e��&=-�e��O�G���
՘D����/ 2��י�&�HI��.�����1�؍?�����<� ���7�~���w�����Tc=>�ǧ�n������e,�@��I�#z����=������ƋW�v4xnM�k-֬!����Ԃe�em:�_NV�)�$z�mlz�(�PH��1`22PP�@��0�Ed C��"4�i�$%}x�Wg޵)�)�$��<�Ā�KVr�NӔ��%d��JP�4����{�w��JL�i�_�+p�{;V���X�s��(��D���|��T��Z�R]����OhTVB��v�B|�BL�ɕ��4g������~JB�H�m��BL�ɾ]��=�r>��Lٗ � ��S>K!&Q=��w=|�گ4P�("�x�4!��qN�g|�y�0�,�_��O΂̗�yxA"!A��-hS�S�It���q/cJ����xdNH���^7P�It�`攷��绐�'�T�*!��T�5ƋI����g<|3�R��2bHSW �{�=~�
L"��7����c�.o�`��JHW:����M&���ׯ��D�l���I��uo���N[�!�[)�$ڤ/��N$�7���W�)0!�7�m�p��7S�I�?� %��p!�YaLH<�F�%�g��7>z(�5�������ǩ�����3^?�I��aXDi���@
9��e�^�FH� x��/!�ŏ{�Xڹ������4�̈́�`��qŗ1q�y�̸O�D2�dQ�
�E4h„�F��W���!�����?�e��n��J��-�@��"��t�q�w���!���9�N;���/c���$W�ZmZ�I�y�����%,RW �D����Mq��K�B�z�� O�r1V�֮;�26�4�&Ql
�&m��|�����@�Z��x5��!��̽CF��ʶW�����+�L��-��>����Qu �2��?��.��f$��r�2����e�+!=��T]B����tqG�в ���-�Rba!iw���uqE��m&N�1�V���m���{�5��^6�]Bj����>���f$���>�ȹmsc�O� ��,J?��R�'_S䣚�4�d� w�S�lKA�<�y?0! x�N
.!��v���>�Y�C9:[]�m��F��4�� <^�Pp i@���� Xp��9��������h�%�`2� ��7T[B���� ‚ӿ�c�e���fZ��c:��K�wSm i�� W��ZMD��f\%,�7�v�mΪYM���{M�Ŗ�����>xdK�nJ��b.��N��Ej/!&Ӡ�OSi 1;~��xh �q��%;�*ː�+�<�Z/sY��҄Ѐ���JK����o|�i V�>�j�V�X�r-]��"M�D���q-��SF�~��YpI j̈�lǔ�F�&��q���:U��6�� _p����L�t��i�0 -��}�免���?�U^�hiJt�5h�&� q������0҉�������;�n4�,������%�S��sTXB:p�W����o*:��`��;UW�e`��Z`� �O�7*,!�8���֫�G* �mw
']���0�Ŷ�=4�0���\�s���"�|۴�D'�d�z�=q�KHG&O<��:3��֔:nݳ���� ʈ!��7��7�;*{��󬌝��҅���-�jـ��J��E�eȈ! E(PP�ZkI�W��7
4Wh�;�������t#퇙�NZ���O7�E 1Ȑmܶ�a�3�ٝ�i�+!]�^�^@nk�q��l�Gi��$��v���J�������[(���2(���Q�ORX ��3��a��/f!�b�zt]��b��~(@�x�iY �`B�v t�TUB���k��!o7a*��#���d4M��٪Ҙ���b��]�? �c�XnI�C�.�R@B�x2�(��Xf�k�ԃ���h 9v��
[s�%**!vH_����u�LX�V�8)v�S �o��G�? �`BG@`�/����e�='0 ����4Sф8��ݛb�bJ��X���=�žLX����( f(���w���7�t� ������ǀc�RI 酫_z:����㉰B�$�!J_WSH �-~���}������ �D�9L�@%�W�m%�`�h;Mq����CQBzeh��O.����,U�G�1Fω!�(!=3��[ׂ/�HBݮ��4�&!����_PA � 'VυF����4`B����ąPB�b��QP��������IH�\?Y�Ҁ �� q œ�����R��!�>`B\f �=C�$� nzC�.��t{�L�$�o�`��(��8B���J��&�5�4o@"�1���DȜ�E�K\w\�)��8��ĩ�J"���P= �b��h�����pɄ�{g�:���$�|����'yɮ�'C&f,{��ː ����z :Obצx �G��Z�ĢՂ�~n�e���-���k��ljo�:tr�<����Ԑ0��@��g��xů1�!�KBg�KG��&Z�K�G����W���T,c�1�,c���&G֧�D�$� ^5R�m�Co9N���ҵ��h�E� �"��PL�X@Yh0j��*��x�o1R��P�
��?� �d�M*�K.$�H# ���l'���3m����XBs�tz J�on��yz�?ی-R% q�ck!�ȁx��%KC�]�~(�\w�},��e,u�DH�-�V�Wy^1A<�8����$!�!=���F2� ����#w�_�$޸���
( ]��T��֧�w��Y��XYM<�͐�B�&o[{1tҡ"�d�NX��$���JWmy�)�m�3r �Ƅ���[)������� ���9j��m4 ߓ�7l�0q��k�_�:�6�ص�\HE�h�-8�g�N7S�A`���ٕ�G�x�6�+(�����]a� ]�VKm-���Xb� �i0q�����H�Hc�? ���,X7=3��r��nwKܶqob`e,b��h�0?�ت�(��x��>fA�4t�.�Że�7���0obie,tl0j<gNyb��'´a��>)�(��㧾bAi-�*`� 3dȵHYj�5U�Z�\?�C��~w���A��K?�� �ʡ>RT*�[W`�Y�|�;���h�/�!>JA$�Sf�y(Բb@A���l�n�VQ.aK���螐^y3�R ��/\���h����1�ꉋ]�e�/ޖDz��q=Őϙ}��Ȍ�qRt>��ؤDz�>�>F%$d\>}�Td�FA���n��� �o����u,T�_n���mG�S�>#.�2���%�1���f �Ba�[U�z���wl�2o�"Q�O+�TAB��ODJr�67�Cc��jt�} �Ֆ&F��� p�$!����㔢�R,�%յb��s�8B$d���Q���[�@KX�W!<���GȠ�n?c�**-�6ߋ�����u?B�ޯ�z�Dt��$�|�_���.x��T%N�����F��3Q��w^����B�d�*:�\B�I�#�7L�x��0h���$���T<B���_vb����e < &�Y��N�k)x����z�� (�xybn];�T;B���ɓߥ>� �'�!滘<)�R��7_J����t�0�4��:B|���F16�M��ݼ|�s���u��H&K��"�����"G����B��7���g��;�lLzE^�����4��F^���ܦU��אkhK#�4�����Lw�ʽ�}��F�߹th�)b!Fۭ-كO\G�.�A�"㥚]KL�w�) m�K)n� ���WC��Q�~n6�2k1��e,cK(������e,c�m4FmE�)����� �� �����LB�[�b�h �Ռ/Q��r�~�΄50�t�h�s��d����4���G#��v�� [��1S�\Ӯ�"�n�� ��d��� ��NC3�����lD��=�V�$�V�0�#4B����>A�2����ZLMK6�ћ�4G�m�SاQ� ��8�1��
�"�| ��+)f����+�$-�*�7P� $��7���dia4��p��~�!AeXz�+���U�\4`��
���a�!�%;��l�J�8������Q� 6G�����/ 84��G(^���c���=�]�͋n[�=F�"$ ����P˕J��!�(�#�R� o�s��PKV�����}���o�hn�2�'��+$�1 p�!n�`*���j�)h� ]�E�ڜ~�jEHظ(��C*Z2�+�H�Ń��R�X>�^�> ���W>��^WQ� '�.\Y �l�K湂�~�E��p�8D�"$�L�'X��Ub��w�����P���φL�4X�W���b� �!ag����y�������g�~�!��ѵpc�hc^��0�&��0 >?������9���(F�J��I�� � IK �R#o��ѻ�H�D��G?|6\�Hy�F`������Ո��12��{B�Γhk�������!����ڗC&h
M�X����p�$!Q�-C� U��/ ���w0�!�B"$��8s���4#�~y�oPx3�č B�ͭV�0���HA[J�����[)>�D��{��$%hi�Z�H�?�+�Py!B���o<tI�����a������TBH����k�5��Ҋr�{xmd��C�aj�S� x0�% N�9�|{�SBH=�K/�hi+s
�o��� � Χ�B��x��H �r}�"j���c��)4�3^?��0k����clU��"Ci�5�6?����U���~�6y�/!�3w��=�R,�&�$��x ck�n� !��\�^�롋4a&�}��0�*�Ka!�Xᦩ3��))K�c�<��3�&�
!�*�N?p��8����Γ�N��SP!v84{�G��� ��<@~�ٓ�ńb��o݂ F�4������(��ғϞ|��E�)�<{��K�#-�~<����р=/��N3�L��O��^����$���GSgXzE韛&W �$rJ ػ���l<"�8�{��>G �b�>��5�� �8�ݻ6�s9v#�R�}�69t��,׌�.҂�����"�Vy�!�y^�Ǹ��En�}�c��AB�;\,��Z0 ؄�@zA\L� ����{�:�F ��oeCg����>%Χ@B�djd�ƓA�K�Ǣ;ɍ'GV�Ł�:��+'o�2�p@+���Wf�*B<b�+O^:yg�`V)D��4�L�CE �xɭ3��x�,�=_���w0sJ�J1 �x͍C_����D��{���7R!��-Õ{ؖ����=^o�BŁ�?����[0k��Za��gg~,P!�dd�镠� dрm|[�+���>����3zW���/��3�l��#~|�.>����ѵ�/�:S�.�|�#�ctM|�<!�O\3z��!�o��v��Y ���=�ێ!�c���<q���\��x�<��q��:!ėL�•��+�KV1�'��L�O8!��^0��9X���JB�7�A ��C|� !~��/�� zg0ς���b���j#�KqlBH80���s����2��J ����Jc�IqjBHp�}�٣!�PdkR�����G�笸�3!$h�u�7���a�N�����O�F��2!$��=��Y�y�i�]VX��Y���=&��!&��#��_Ax(ӆ;���C�[�
F6�>������~v�
„�h5�lHb�
n>#=/�|p !a`X�?~�[e(�i�Ȇ��y ����b�-!$<�0q�S+%�#[r������iqVBH�x�>�
��5a5�c6ʡ��=�+�}�x%TBH8yd���H8�S���]��>���0s���d<�0�G"!] ���)�������'!$�|bh�^��L�O~Óz�C�|( !���g��W��؀�P��*��t ����} !����u":�䳯��ƾ��hr��cI㻡�`-��Wa໸Ԙ����!!$��<y�ֵ��Zp�����V�q���Iq3>BH��{�W_v�h( 8�'�A?�=���8﫼f�B��v���O<B .�΀�W@?��OL�(���B�S��!�`%�W�OC@���BZ�h����?�4t� 8��������FU�q2�13Pf.�wT��&e��.k �
����k]%F��X� �D��t��HYԘ��,��&��k�i4����I͚�T�ժD�;��K{���}��b#ni�ǝ��s����|s�9�9'�&V��������j���Pl��"x;�A��(B1u\�9�����6�3�ׁ���pϤ��AED4?��c>�傉��� �ϫcH/�g*��7PDDעV ��"\(W���ݿ'4���@""Z�{�s�zWl����7_� ��zV��""Z��=�����=����{�8��K�{�՜������σ�<�V�=-�R�ACD�.J�~��.�0??�� �X.�t�(,DD��w�mmA,/8��F:��w��-�Y�ABD�)!��m=k_�����ٯ�/`��gm�����3Q��w���f�8 O��o���ْ��[�qPe�Z_W�\�����n;�;�]~��U<�뒵 DD�V�y�e���sD)��;���)��.��Tr��u�7�aO�%r���cބ</ױ���r�X������u�뼏�ج��K��|����au�r�U�8:���볳�^��UTN�g�a:�ݩ z��X_2� h��쵼�ڠ��'"r���ӛl4�
��ٯs�w��7�� ��(�N�����֕C� ]阞Wp�'կd�������V�W�m�}��צ�zDŽ���6%P{e+���(_��[�����W�n��G��O�Q�&�Љ*C�Zv���%"� �q��;��?Cwcݎm�qM1���,Q!Y!;��|���+��3��c״��>����JDT��I��]������<�C9~gш��|'Q^�@D�4��Y6U����U���>���їM���'g"��&����F�|���Y�'~��+ب{�+�.!!��լ��X��E��p�>���%:�Q/��^if���H�r��R�h��$������������sA��rL�XlDD���</*��թ~$ n؏z�q4���$�Q�
ĕo</J ���~��#�`��? w�3�� ��,�x��l��O�Cֳ���h���������o�z0���j�X��d=t`=�����|]�,^-̍�x�_k5�������d_�?f1x��M�0+c�x�=�Y8DD�dO`�cV��7���c�3�!�& �+���ͪ2<f`H��
e�٫ �]T��|�Y�tŪD�+O�W�g� Se�A��fDD�-U��:沫�������H;��Yp0�a �9�d �m��03�u�����ȃR�B "��ФN�R��Es7�&‡��� Y5i��Mk�^‡x�&o2��� ��<%u�ODDN���e#�i�ty�c�Ս�k �(
��.bsVKBw�����zy�=��^6"O����LDD�V%wK[���K���[��ЇØǖ�!�/����+�� 9~4���5� M�ڄ�,���X> mr7?2Q�Z#[e�����2)�'������!�a��r8)�J܂[�)~]Y�����1�FчC��e�.�3�d`���씭���
�$�$��K`H=�6]�� u��H*���Fp_�E|��#����$Nb���؍H�x�4���v�����Dd�l�
�1DD��I�l�Fi�}��}��I���z�U2[dk ��.���O����Ǿz记�ہY5Un���*Y�!^d�̖Ze��vR�@�s�+��Ee�TH_<�/s��J�K�4HH�G�Gvɓ�["�OڥC:�]�ID�ȓ�K�&��}����R%7��/����������������(�����]��nIEND�B`�
// Version 0.0.0. Copyright 2017 Mike Bostock.
(function(global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.versor = factory());
}(this, (function() {'use strict';
var acos = Math.acos,
asin = Math.asin,
atan2 = Math.atan2,
cos = Math.cos,
max = Math.max,
min = Math.min,
PI = Math.PI,
sin = Math.sin,
sqrt = Math.sqrt,
radians = PI / 180,
degrees = 180 / PI;
// Returns the unit quaternion for the given Euler rotation angles [λ, φ, γ].
function versor(e) {
var l = e[0] / 2 * radians, sl = sin(l), cl = cos(l), // λ / 2
p = e[1] / 2 * radians, sp = sin(p), cp = cos(p), // φ / 2
g = e[2] / 2 * radians, sg = sin(g), cg = cos(g); // γ / 2
return [
cl * cp * cg + sl * sp * sg,
sl * cp * cg - cl * sp * sg,
cl * sp * cg + sl * cp * sg,
cl * cp * sg - sl * sp * cg
];
}
// Returns Cartesian coordinates [x, y, z] given spherical coordinates [λ, φ].
versor.cartesian = function(e) {
var l = e[0] * radians, p = e[1] * radians;
return [cos(p) * cos(l), cos(p) * sin(l), sin(p)];
};
// Returns the Euler rotation angles [λ, φ, γ] for the given quaternion.
versor.rotation = function(q) {
return [
atan2(2 * (q[0] * q[1] + q[2] * q[3]), 1 - 2 * (q[1] * q[1] + q[2] * q[2])) * degrees,
asin(max(-1, min(1, 2 * (q[0] * q[2] - q[3] * q[1])))) * degrees,
atan2(2 * (q[0] * q[3] + q[1] * q[2]), 1 - 2 * (q[2] * q[2] + q[3] * q[3])) * degrees
];
};
// Returns the quaternion to rotate between two cartesian points on the sphere.
versor.delta = function(v0, v1) {
var w = cross(v0, v1), l = sqrt(dot(w, w));
if (!l) return [1, 0, 0, 0];
var t = acos(max(-1, min(1, dot(v0, v1)))) / 2, s = sin(t); // t = θ / 2
return [cos(t), w[2] / l * s, -w[1] / l * s, w[0] / l * s];
};
// Returns the quaternion that represents q0 * q1.
versor.multiply = function(q0, q1) {
return [
q0[0] * q1[0] - q0[1] * q1[1] - q0[2] * q1[2] - q0[3] * q1[3],
q0[1] * q1[0] + q0[0] * q1[1] + q0[2] * q1[3] - q0[3] * q1[2],
q0[0] * q1[2] - q0[1] * q1[3] + q0[2] * q1[0] + q0[3] * q1[1],
q0[0] * q1[3] + q0[1] * q1[2] - q0[2] * q1[1] + q0[3] * q1[0]
];
};
function cross(v0, v1) {
return [
v0[1] * v1[2] - v0[2] * v1[1],
v0[2] * v1[0] - v0[0] * v1[2],
v0[0] * v1[1] - v0[1] * v1[0]
];
}
function dot(v0, v1) {
return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];
}
return versor;
})));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment