Skip to content

Instantly share code, notes, and snippets.

@sifbuilder
Last active June 4, 2018 17:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sifbuilder/d411e851d52577cf212e2b04c7587496 to your computer and use it in GitHub Desktop.
Save sifbuilder/d411e851d52577cf212e2b04c7587496 to your computer and use it in GitHub Desktop.
sine pacing graticules

852d 3dgratSvgScene

sine pacing graticules

license

MIT

/**********************
* @controlKey
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.controlKey = global.controlKey || {})))
}(this, function (exports) {
'use strict'
var keys = []
function controlKey (payload) {
var currentListeners = []
var nextListeners = currentListeners
var __currentListeners = {}
var __nextListeners = __currentListeners
// ....................... ensureCanMutateNextListeners
function ensureCanMutateNextListeners (target) {
if (nextListeners === currentListeners) {
nextListeners = currentListeners.slice()
}
if (target && __nextListeners[target]) {
if (__nextListeners[target] === __currentListeners[target]) {
__nextListeners[target] = __currentListeners[target].slice()
}
}
}
// ....................... pauseEvent
function pauseEvent (e) {
if (e.stopPropagation) e.stopPropagation()
if (e.preventDefault) e.preventDefault()
e.cancelBubble = true
e.returnValue = false
return false
}
// ....................... controlAction
var controlAction = function controlAction (e) {
pauseEvent(e)
var listeners = currentListeners = nextListeners
for (var i = 0; i < listeners.length; i++) {
listeners[i](e)
}
}
// ....................... subscribe
let subscribe = function subscribe (listener, target) {
if (typeof listener !== 'function') {
throw new Error('Expected listener to be a function.')
}
var isSubscribed = true
ensureCanMutateNextListeners(target)
nextListeners.push(listener)
if (target) {
if (typeof __nextListeners[target] === 'undefined') __nextListeners[target] = []
__nextListeners[target].push(listener)
}
return function unsubscribe () {
if (!isSubscribed) {
return
}
isSubscribed = false
ensureCanMutateNextListeners()
var index = nextListeners.indexOf(listener)
nextListeners.splice(index, 1)
if (target) {
var index = __nextListeners[target].indexOf(listener)
__nextListeners[target].splice(index, 1)
}
}
}
// ....................... handleKeyDown
// https://www.kirupa.com/html5/keyboard_events_in_javascript.htm
// https://github.com/gaearon/redux-devtools-dock-monitor
var handleKeyDown = function handleKeyDown (event) {
switch (event.key) {
case 'ArrowLeft':
case 'Left': // hack for IE and old Gecko
if (event.getModifierState('Alt')) {
leftArrowAlt()
event.preventDefault()
break
}
case 'ArrowRight':
case 'Right': // hack for IE and old Gecko
if (event.getModifierState('Alt')) {
rightArrowAlt()
event.preventDefault()
break
}
case 'ArrowUp':
case 'Up': // hack for IE and old Gecko
if (event.getModifierState('Alt')) {
upArrowAlt()
event.preventDefault()
break
}
case 'ArrowDown':
case 'Down': // hack for IE and old Gecko
if (event.getModifierState('Alt')) {
downArrowAlt()
event.preventDefault()
break
}
}
// event.stopPropagation()
// event.preventDefault()
// keys[event.keyCode] = true // console.log("___ keys", keys, event)
// if (keys[70] && keys[17]) fKeyCtrl() // CTRL-f
// else if (keys[68] && keys[17]) dKeyCtrl() // CTRL-d
// else if (event.keyCode == '37' && keys[17]) leftArrowCtrl() // CTRL-LEFT
// else if (event.keyCode == '39' && keys[17]) rightArrowCtrl() // CTRL-RIGHT
// else if (event.keyCode == '38' && keys[17]) upArrowCtrl() // CTRL-UP
// else if (event.keyCode == '40' && keys[17]) downArrowCtrl() // CTRL-DOWN
}
// ....................... fKeyCtrl
var fKeyCtrl = function fKeyCtrl () { // change view
// // Ctrl 17 + Shift 16 + f 70
}
// ....................... dKeyCtrl
var dKeyCtrl = function dKeyCtrl () { // change debug mode
// // Ctrl 17 + Shift 16 + d 68
}
// ....................... handleKeyPressed
var handleKeyPressed = function handleKeyPressed (e) {
}
// ....................... handleKeyReleased
var handleKeyReleased = function handleKeyReleased (e) {
keys[e.keyCode] = false
}
/**********************
* @event actions
*/
// ....................... leftArrowAlt
var leftArrowAlt = function leftArrowAlt (e) {
console.log('leftArrowAltFn')
var listeners = __currentListeners['leftArrowAlt'] = __nextListeners['leftArrowAlt']
for (var i = 0; i < listeners.length; i++) {
listeners[i](e)
}
}
// ....................... rightArrowAlt
var rightArrowAlt = function rightArrowAlt (e) {
var listeners = __currentListeners['rightArrowAlt'] = __nextListeners['rightArrowAlt']
for (var i = 0; i < listeners.length; i++) {
listeners[i](e)
}
}
// ....................... upArrowAlt
var upArrowAlt = function upArrowAlt (e) {
console.log('upArrowAltFn')
var listeners = __currentListeners['rightArrowAlt'] = __nextListeners['upArrowAlt']
for (var i = 0; i < listeners.length; i++) {
listeners[i](e)
}
}
// ....................... downArrowAlt
var downArrowAlt = function downArrowAlt (e) {
var listeners = __currentListeners['downArrowAlt'] = __nextListeners['downArrowAlt']
for (var i = 0; i < listeners.length; i++) {
listeners[i](e)
}
console.log('downArrowAltFn')
}
// ....................... leftArrowCtrl
var leftArrowCtrl = function leftArrowCtrl (e) {
console.log('leftArrowCtrlFn')
var listeners = __currentListeners['leftArrowCtrl'] = __nextListeners['leftArrowCtrl']
for (var i = 0; i < listeners.length; i++) {
listeners[i](e)
}
}
// ....................... rightArrowCtrl
var rightArrowCtrl = function rightArrowCtrl (e) {
console.log('rightArrowCtrlFn')
var listeners = __currentListeners['rightArrowCtrl'] = __nextListeners['rightArrowCtrl']
for (var i = 0; i < listeners.length; i++) {
listeners[i](e)
}
}
// ....................... upArrowCtrl
var upArrowCtrl = function upArrowCtrl () {
console.log('upArrowCtrlFn')
}
// ....................... downArrowCtrl
var downArrowCtrl = function downArrowCtrl () {
console.log('downArrowCtrlFn')
}
// ....................... controlfn
function controlfn () {
}
/**********************
* @enty
*/
function enty () {}
enty.subscribe = subscribe
enty.start = function start (svg) {
document.addEventListener('keydown', handleKeyDown, false)
document.addEventListener('keypress', handleKeyPressed, false)
document.addEventListener('keyup', handleKeyReleased, false)
return enty
}
return enty
}
exports.controlKey = controlKey
}))
/**********************
* @controlPos
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.controlPos = global.controlPos || {})))
}(this, function (exports) {
'use strict'
function controlPos (__mapper) {
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let cameraProjer = r.cameraProjer()
function prevent (e) {}
function subject () {
return this
}
function started (d) {}
function moved (d) {
function createPostipElem () {
var padLayer = d3.select('body')
.selectAll('g.refs')
.data(['refs'])
.enter()
.insert('g', 'refs')
.attr('class', 'refs')
var postipElem = d3.select('g.refs')
.selectAll('div.postip')
.data(['divMousePos'])
.enter()
.append('div')
.attr('class', 'postip')
.call(drawPostipElem)
}
function drawPostipElem (postip) {
postip
.attr('viewBox', '0 0 0 0')
.style('top', '-0px')
.style('position', 'absolute')
.style('padding', '0px')
.style('background', 'rgba(255, 255, 255, .999)')
.style('border', '1px solid lightgray')
.style('pointer-events', 'none')
.style('z-index', '100')
.style('border', '1px solid orange')
.style('color', 'grey')
.classed('postip-hidden', true)
.style('opacity', 0)
}
function textPadFn (a) {
var s = String('___' + Math.floor(a.ox) + ' : ' + Math.floor(a.oy) + '___')
return s
}
// https://github.com/1wheel/swoopy-drag/blob/master/lib/d3-jetpack.js
function displayTextPad (a) {
d3.select('.postip')
.classed('postip-hidden', false)
.style('opacity', 1)
.html('')
.selectAll('div')
.data([textPadFn]).enter()
.append('div')
.html(function (textPadFn) {
return (textPadFn(a))
})
}
function moveTextPad (node) {
var postip = d3.select('div.postip')
if (!postip.size()) return
var e = d3.event,
x = e.clientX,
y = e.clientY,
doctop = (window.scrollY) ? window.scrollY : (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop,
n = postip.node(),
nBB = n.getBoundingClientRect()
postip.style('top', (y + doctop - nBB.height - 18) + 'px')
postip.style('left', Math.min(Math.max(0, (x - nBB.width / 2)), window.innerWidth - nBB.width) + 'px')
prevent(e)
}
var datum = d, // d datum
node = this, // elem
parent = node.parentNode,
// origin = d3.mouse(parent),
// var action = {ox: origin[0], oy: origin[1]}
t = cameraProjer.invert(d3.mouse(parent))
var action = {ox: t[0], oy: t[1]}
createPostipElem()
displayTextPad(action)
moveTextPad(node)
}
function ended (d) {
var node = d3.select(this) // selection
var datum = node.datum() // datum
d3.select('div.postip')
.classed('postip-hidden', true)
.style('opacity', 0)
d3.selectAll('.postipped')
.classed('postipped', false)
}
// ......................... enty
function enty (selection) {
selection.on('mouseenter.pos', started)
selection.on('mousemove.pos', moved)
selection.on('mouseout.pos', ended)
}
return enty
}
exports.controlPos = controlPos
}))
/*******************************************
* @controlRaycaster
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.controlRaycaster = global.controlRaycaster || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **returns mouse move coordinates in the unit square space**
// md: called by r.webgl
// md: r.webgl sets renderer.domElement and gets mouse
// md: mouse on camera is then used to get ray intersection on items on canvas
// md: ### getters/setters
// md: domNode
// md: ### getters
// md: mouse
// md: ### methods
// md: control
// md: usage: `control(domnode)`
// md:
// md: # license
// md: MIT
let controlRaycaster = function controlRaycaster (__mapper = {}) {
let f = __mapper('xs').m('props')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let mouse = {
x: -2, // Initialize off canvas
y: -2
}
let pointer = {
x: -2,
y: -2
}
let touch = {}
let domNode = null
let state = {
pointer,
mouse,
touch,
domNode
}
// ............................. subscribe
let subscribe = function (listener, domNode, sensor) {
if (1 && 1) console.log('subscribedomNode', domNode)
if (typeof listener !== 'function') throw new Error('Listener to be function')
enty.domNode(domNode)
state.domNode.node().addEventListener(sensor, listener)
}
// ............................. listerner
let projector = function (event) {
let domElem = enty.domNode()
let width = domElem.getBoundingClientRect().width
let height = domElem.getBoundingClientRect().height
const offset = getOffset(domElem), // {top: 0, left: 0}
relPos = {
x: event.pageX - offset.left,
y: event.pageY - offset.top
}
state.mouse.x = (relPos.x / width) * 2 - 1
state.mouse.y = -(relPos.y / height) * 2 + 1
function getOffset (el) {
const rect = el.getBoundingClientRect(),
scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
scrollTop = window.pageYOffset || document.documentElement.scrollTop
return { top: rect.top + scrollTop, left: rect.left + scrollLeft }
}
}
// ............................. control
let control = function (domNode) {
enty.domNode(domNode)
state.domNode.addEventListener('mousemove', mouseMoveListener) // event listener
// subscribe(mouseMoveListener, domNode, 'mousemove') // event listener
}
// ............................. mouseMoveListener
function mouseMoveListener (event) {
projector(event)
}
// ............................. enty
let enty = () => enty
// enty.domNode = _ => (_ !== undefined) ? (state.domNode = _, enty) : state.domNode
enty.domNode = function(_) {
if (_ !== undefined) {
state.domNode = _
return enty
} else {
return state.domNode
}
}
enty.mouse = () => state.mouse
enty.touch = () => state.touch
enty.pointer = () => state.pointer //
enty.control = control
return enty
}
exports.controlRaycaster = controlRaycaster
}))
/***********
* @controlRayder
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.controlRayder = global.controlRayder || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: ** **
// md: ### refs
// md: * https://developer.mozilla.org/en-US/docs/Web/API/Touch_events
// md:
// md:
// md:
// md: # license
// md: MIT
var controlRayder = function (__mapper = {}) {
let f = __mapper('xs').m('props')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let mouse = {
x: -2, // Initialize off canvas
y: -2
}
let pointer = {
x: -2,
y: -2
}
let touch = {}
let domNode = __mapper('renderSvg').svg()
let state = {
pointer,
mouse,
touch,
domNode
}
let cameraProjer = r.cameraProjer()
// ............................. projector
function projector (event) {
if (typeof enty[ event.type ] == 'function' ) {
if (1 && 1) console.log('crayder.projector:event', event.type)
}
if (event.type === 'mousemove') {
let t = cameraProjer.invert([event.x, event.y])
state.mouse.x = t[0]
state.mouse.y = t[1]
state.pointer.x = t[0] //
state.pointer.y = t[1] //
} else if (event.type === 'touchmove') {
let touch = event.changedTouches[0]
let t = cameraProjer.invert([touch.clientX, touch.clientY])
state.mouse.x = t[0]
state.mouse.y = t[1]
state.pointer.x = t[0] //
state.pointer.y = t[1] //
}
}
// ............................. touchStartListener
function touchStartListener (event) {
event.preventDefault()
enty.touchStart(1)
enty.touchStartShared(1)
enty.event(event)
}
// ............................. touchMoveListener
function touchMoveListener (event) {
event.preventDefault()
enty.touchMove(1)
enty.touchStartShared(1)
enty.event(event)
projector(event)
}
// ............................. touchEndListener
function touchEndListener (event) {
enty.touchStart(0)
enty.touchStartShared(0)
enty.event(event)
}
// ............................. mouseDownListener
function mouseDownListener (event) {
enty.mouseDown(1)
enty.mouseDownShared(1)
enty.event(event)
}
// ............................. mouseMoveListener
function mouseMoveListener (event) {
enty.mouseMove(1)
enty.mouseDownShared(1)
enty.event(event)
projector(event)
}
// ............................. mouseUpListener
function mouseUpListener (event) {
enty.mouseDown(0)
enty.mouseDownShared(0)
enty.event(event)
}
// ............................. subscribe
let subscribe = function (listener, domNode, sensor) {
if (typeof listener !== 'function') throw new Error('Listener to be function')
domNode.node().addEventListener(sensor, listener) // mounseUp, mouseUpListener
}
// ............................. controlrayder
let control = function (domNode) {
enty.domNode(domNode)
subscribe(mouseDownListener, state.domNode, 'mousedown')
subscribe(mouseUpListener, state.domNode, 'mouseup')
subscribe(mouseMoveListener, state.domNode, 'mousemove')
subscribe(touchStartListener, state.domNode, 'touchstart')
subscribe(touchMoveListener, state.domNode, 'touchmove')
subscribe(touchEndListener, state.domNode, 'touchend')
}
// ............................. enty
let enty = () => enty
enty.domNode = _ => (_ !== undefined) ? (state.domNode = _, enty) : state.domNode
enty.mouse = () => state.mouse
enty.touch = () => state.touch
enty.pointer = () => state.pointer //
enty.control = control
enty.mouseDown = _ => (_ !== undefined) ? (state.mouseDown = _, enty) : state.mouseDown
enty.mouseDownShared = _ => (_ !== undefined) ? (state.mouseDownShared = _, enty) : state.mouseDownShared
enty.mouseMove = _ => (_ !== undefined) ? (state.mouseMove = _, enty) : state.mouseMove
enty.mouseUp = _ => (_ !== undefined) ? (state.mouseUp = _, enty) : state.mouseUp
enty.touchStart = _ => (_ !== undefined) ? (state.touchStart = _, enty) : state.touchStart
enty.touchStartShared = _ => (_ !== undefined) ? (state.touchStartShared = _, enty) : state.touchStartShared
enty.touchMove = _ => (_ !== undefined) ? (state.touchMove = _, enty) : state.touchMove
enty.touchEnd = _ => (_ !== undefined) ? (state.touchEnd = _, enty) : state.touchEnd
return enty
}
exports.controlRayder = controlRayder
}))
/**********************
* @controlTimer
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.controlTimer = global.controlTimer || {})))
}(this, function (exports) {
'use strict'
function controlTimer (__mapper) {
let now = performance.now()
let state = {
now,
restartTime: now,
resumeTime: now,
stopTime: now
}
let currentListeners = []
let nextListeners = currentListeners
let d3timers = []
let started = false
// ......................... ensureCanMutateNextListeners
function ensureCanMutateNextListeners () {
if (nextListeners === currentListeners) {
nextListeners = currentListeners.slice()
}
}
// ......................... start
let start = function () {
started = false
let main = function (timestamp) {
window.requestAnimationFrame(main)
let listeners = currentListeners = nextListeners
for (let i = 0; i < listeners.length; i++) {
listeners[i]() // run each listener
}
}
if (!started) {
started = true
console.log(' ************ c.timer set restartTime:', state.restartTime)
state.restartTime = performance.now() - (state.stopTime - state.restartTime)
main()
}
return enty
}
// ......................... restart
let restart = function () {
started = true
let listeners = currentListeners = nextListeners
for (let i = 0; i < listeners.length; i++) {
state.restartTime = performance.now() - (state.stopTime - state.restartTime)
console.log('c.timer restart', state.restartTime)
d3timers[i].restart(listeners[i], 0, 0)
}
return enty
}
// ......................... resume
let resume = function () {
started = true
let listeners = currentListeners = nextListeners
for (let i = 0; i < listeners.length; i++) {
state.resumeTime = performance.now() - (state.stopTime - state.resumeTime)
d3timers[i].stop(listeners[i])
d3timers[i].resume(listeners[i], -state.restartTime, state.resumeTime) // _e_ restartTime in advance
}
return enty
}
// ......................... stop
let stop = function () {
started = false
let listeners = currentListeners = nextListeners
state.stopTime = performance.now()
for (let i = 0; i < listeners.length; i++) {
d3timers[i].stop()
}
return enty
}
// ......................... subscribe
let subscribe = function (listener, wait = 0) {
started = true
if (typeof listener !== 'function') {
throw new Error('Expected listener to be a function.')
}
let isSubscribed = true
ensureCanMutateNextListeners()
nextListeners.push(listener)
d3timers[nextListeners.length - 1] =
__mapper('xs').m('timer').timer(listener, wait, 0)
return function unsubscribe () {
if (!isSubscribed) {
return
}
let started = false //
isSubscribed = false
ensureCanMutateNextListeners()
let index = nextListeners.indexOf(listener)
d3timers[index].stop()
}
}
// ......................... enty
function enty () {}
enty.started = () => started
enty.start = start
enty.restart = restart
enty.resume = resume
enty.stop = stop
enty.subscribe = subscribe
return enty
}
exports.controlTimer = controlTimer
}))
/**********************
* @touchEndControl
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.touchEndControl = global.touchEndControl || {})))
}(this, function (exports) {
'use strict'
function touchEndControl (payload) {
var currentListeners = []
var nextListeners = currentListeners
// ....................... ensureCanMutateNextListeners
function ensureCanMutateNextListeners () {
if (nextListeners === currentListeners) {
nextListeners = currentListeners.slice()
}
}
function pauseEvent (e) {
if (e.stopPropagation) e.stopPropagation()
if (e.preventDefault) e.preventDefault()
e.cancelBubble = true
e.returnValue = false
return false
}
function controlAction (svg) {
var e = d3.event
pauseEvent(e)
var listeners = currentListeners = nextListeners
for (var i = 0; i < listeners.length; i++) {
listeners[i](e)
}
}
// ....................... enty
function enty () {}
// ....................... start
enty.start = function (svg) {
svg.on('touchend', function () { controlAction(this) })
return enty
}
// ....................... subscribe
enty.subscribe = function (listener) {
if (typeof listener !== 'function') {
throw new Error('Expected listener to be a function.')
}
var isSubscribed = true
ensureCanMutateNextListeners()
nextListeners.push(listener)
return function unsubscribe () {
if (!isSubscribed) {
return
}
isSubscribed = false
ensureCanMutateNextListeners()
var index = nextListeners.indexOf(listener)
nextListeners.splice(index, 1)
}
}
return enty
}
exports.touchEndControl = touchEndControl
}))
/**********************
* @touchMoveControl
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.touchMoveControl = global.touchMoveControl || {})))
}(this, function (exports) {
'use strict'
function touchMoveControl (payload) {
var currentListeners = []
var nextListeners = currentListeners
// ....................... ensureCanMutateNextListeners
function ensureCanMutateNextListeners () {
if (nextListeners === currentListeners) {
nextListeners = currentListeners.slice()
}
}
function pauseEvent (e) {
if (e.stopPropagation) e.stopPropagation()
if (e.preventDefault) e.preventDefault()
e.cancelBubble = true
e.returnValue = false
return false
}
function controlAction (svg) {
var e = d3.event
pauseEvent(e)
var listeners = currentListeners = nextListeners
for (var i = 0; i < listeners.length; i++) {
listeners[i](e)
}
}
// ....................... controlApi
function controlApi () {}
// ....................... start
controlApi.start = function start (svg) {
svg.on('touchmove', function () { controlAction(this) })
return controlApi
}
// ....................... subscribe
controlApi.subscribe = function subscribe (listener) {
if (typeof listener !== 'function') {
throw new Error('Expected listener to be a function.')
}
var isSubscribed = true
ensureCanMutateNextListeners()
nextListeners.push(listener)
return function unsubscribe () {
if (!isSubscribed) {
return
}
isSubscribed = false
ensureCanMutateNextListeners()
var index = nextListeners.indexOf(listener)
nextListeners.splice(index, 1)
}
}
return controlApi
}
exports.touchMoveControl = touchMoveControl
}))
/*******************************************
* @controlVersor
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.controlVersor = global.controlVersor || {})))
}(this, function (exports) {
'use strict'
//md: md:{filename}
let controlVersor = function (__mapper = {}) {
let d3Drag = d3,
d3Selection = d3,
d3Timer = d3
let r = __mapper('xs').r('renderport'),
mversor = __mapper('xs').m('versor')(),
mgeom = __mapper('xs').m('geom')
// let xydirs = r.xydirs() // [1 -1] in pixel view
let xsign = 1 // 1 if x goes left to right
let ysign = -1 // 1 if y goes up down
let drag = d3.drag()
let getPos = e => (e.touches && e.touches.length) ? (e = e.touches[0], [e.x, e.y]) : [e.x, e.y]
getPos = r.getPos
// start drag control
let control = function(elem, props={}) {
elem.call(drag
.on('start', versorControl.dragstarted)
.on('drag', versorControl.dragged)
.on('end', versorControl.dragended))
}
// stop drag control
let reset = elem => elem.call(drag
.on('start', null)
.on('drag', null)
.on('end', null))
/*******************************************
* @state
*
*/
let state = {
projection: d3.geoOrthographic(),
rotation: [0, 0, 0],
inve0_cart: null, // Mouse cartesian position invprojected
r0: null, // Projection rotation as Euler angles at start
q0: null, // Quaternion. Projection rotation
p0: null, // Mouse position (spher)
dtc: null, // Distance initial dot to center untransformed
grabbed: false,
moved: false,
rotInitial_grads: [0, 0, 0],
rotInDrag_grads: [0, 0, 0],
rotAtInit_grads: [0, 0, 0],
decay: 0.95,
mult: 2e-3, // rotInDrag_rads factor
rotInit_rads: [0, 0, 0],
timeSpan: 200,
epsilon: 1e-3,
vel_spher: [0, 0, 0],
moveSpan: 16,
autoRot: false,
lastMoveTime: null,
timer: null,
timer: null,
rotMatrix: null,
cPos: null, // current position
pPos: null // previous position
}
/*******************************************
* @versorControl
*
*/
let versorControl = {
dragstarted,
dragged,
dragended
}
/*******************************************
* @dragstarted
*
*/
function dragstarted () {
let e = d3.event
state.proj = state.projection
if (state.grabbed) return // drag ongoing
state.moved = false // not moved yet // stopMomentum()
state.grabbed = true
// -----------------
state.p0 = getPos(e) // d3.mouse(this)
let inve0_spher = state.proj.invert(state.p0)
state.inve0_cart = mgeom.cartesian(inve0_spher)
state.r0 = state.proj.rotate() // rotation in projection in degrees
state.q0 = mversor(state.r0) // quaternion of initial rotation
// -----------------
state.rotAtInit_grads = state.rotInitial_grads // rebase()
}
/*******************************************
* @dragged
*
*/
function dragged () {
let e = d3.event
state.proj = state.projection
if (!state.grabbed) return
if (!state.moved) {
state.moved = true // moved // state.autoRot = false
state.autoRot = false
state.rotAtInit_grads = state.rotInitial_grads // rebase()
}
// -----------------
state.lastMoveTime = Date.now()
// -----------------
state.p1 = getPos(e)
// -----------------
state.inve1_spher = state.proj
.rotate(state.r0)
.invert(state.p1)
state.inve1_cart = mgeom.cartesian(state.inve1_spher)
// -----------------
state.pPos = state.cPos
state.cPos = state.inve1_spher
// -----------------
// quaternion to rotate between inve0_cart and inve1_cart
// compose rotations of pdelta_cart, then of q0
// euler rotation angles
let pdelta_cart = mversor.delta(state.inve0_cart, state.inve1_cart)
let q1 = mversor.multiply(state.q0, pdelta_cart)
let r1 = mversor.rotation(q1) // in degrees
// -----------------
state.rotInDrag_grads = r1
}
/*******************************************
* @dragended
*
*/
function dragended () {
if (!state.grabbed) return
state.grabbed = false
if (!state.moved) return
let f = Math.max(0, 1 - (Date.now() - state.lastMoveTime))
state.vel_spher = [
(state.cPos[1] - state.pPos[1]) * state.mult,
(state.cPos[0] - state.pPos[0]) * state.mult
]
state.timer = requestAnimationFrame(momentum)
}
/*******************************************
* @momentum
*
*/
function momentum () {
if (Math.abs(state.vel_spher[0]) < state.epsilon && Math.abs(state.vel_spher[1]) < state.epsilon) return
state.vel_spher[0] *= state.decay
state.vel_spher[1] *= state.decay
// -----------------
let vel = mgeom.cartesian(state.vel_spher)
// state.rotInDrag_grads[0] += vel[0]
// state.rotInDrag_grads[1] += vel[1]
// state.rotInDrag_grads[2] += vel[2]
// -----------------
if (state.timer) state.timer = requestAnimationFrame(momentum)
}
/*******************************************
* @enty
*/
let enty = function enty (p = {}) {
return enty
}
enty.dragstarted = dragstarted
enty.dragged = dragged
enty.control = control
enty.reset = reset
enty.projection = _ => {
if (_ !== undefined) {
state.projection = _.projection
return enty
} else {
return state.projection
}
}
// enty.rotation = _ => {
enty.rotation = () => {
// if (_ !== undefined) {
// state.rotation = _
// return enty
// } else {
return mgeom.add(state.rotInDrag_grads, state.rotAtInit_grads)
// return mgeom.add([0,0,0], state.rotAtInit_grads)
// }
}
return enty
}
exports.controlVersor = controlVersor
}))
/*******************************************
* @controlWen
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.controlWen = global.controlWen || {})))
}(this, function (exports) {
'use strict'
// http://codepen.io/bali_balo/pen/XbyrME?editors=1100)
// https://github.com/wenliang-developer
// https://codepen.io/wenliang-developer/pen/gMwvXR
// https://github.com/wenliang-developer/web-developer-site
let controlWen = function controlWen (__mapper = {}) {
let r = __mapper('xs').r('renderport'),
mversor = __mapper('xs').m('versor')(),
mgeom = __mapper('xs').m('geom')
let drag = d3.drag()
function tick () {
if (state.timer) state.timer = requestAnimationFrame(tick)
}
function stopMomentum () { cancelAnimationFrame(state.timer); state.timer = null }
let inits = {
decay: 0.95,
mult: 2e-3, // rotInDrag_radians factor
rotInit_radians: [0, 0, 0],
timeSpan: 200,
epsilon: 1e-3
}
function rebase () {
state.rotInDrag_radians = [0, 0, 0] // reset to default rotation
}
let getPos = r.getPos // event position
// let xydirs = r.xydirs() // [1 -1] in pixel view
let xsign = 1 // 1 if x goes left to right
let ysign = -1 // 1 if y goes up down
let state = {
// projection: null, // __mapper('xs').g('uniwen'), // _e_tbd
projection: d3.geoOrthographic()
.rotate([0, 0])
.translate([0, 0])
.scale(1),
rotAccum_radians: [0, 0, 0],
rotInDrag_radians: [0, 0, 0], // rotInDrag_radians in radians
grabbed: false,
moved: false,
rotVel: [0, 0, 0], // [-6e-3,7.6e-3,2.13e-3], // [0,0,0],
vel: [0, 0, 0],
moveSpan: 16,
autoRot: false,
lastMoveTime: null,
timer: null,
timer: null,
rotMatrix: null,
cPos: null, // current position
pPos: null // previous position
}
// start drag control
let control = elem => elem.call(drag.on('start', dragstarted).on('drag', dragged).on('end', dragended))
// stop drag control
let reset = elem => elem.call(drag.on('start', null).on('drag', null).on('end', null))
// dragstarted listener
let dragstarted = function () {
let e = d3.event
if (state.grabbed) return // drag ongoing
stopMomentum()
state.moved = false // not moved yet
state.grabbed = getPos(e) // mouse position
state.p0 = state.grabbed // initial position in geometric space
let projection = state.projection
if (projection.invert === undefined ) {
if (2 && 2) console.log('** projection invert missing', projection)
} else if (projection.rotate === undefined) {
if (2 && 2) console.log('** projection rotate missing', projection)
}
state.pPos = state.p0 // previous position
state.cPos = state.pPos // current position
state.rotAccum_radians = mgeom.add(state.rotAccum_radians, state.rotInDrag_radians) // rotation
rebase()
}
// dragged listener
let dragged = function () {
if (!state.grabbed) return
let e = d3.event
let pos = getPos(e) // d3.mouse(this)
let dx = xsign * (pos[1] - state.grabbed[1]),
dy = ysign * (state.grabbed[0] - pos[0])
if (!state.moved) {
if (dx * dx + dy * dy < state.moveSpan) return
state.moved = true // moved
state.autoRot = false
state.rotInDrag_radians = inits.rotInit_radians
rebase()
}
state.lastMoveTime = Date.now()
state.pPos = state.cPos
state.cPos = pos
state.rotInDrag_radians = [
state.rotVel[0] + dx * inits.mult,
state.rotVel[1] + dy * inits.mult,
state.rotVel[2] + 0
]
}
// dragended listener
let dragended = function () {
if (!state.grabbed) return
state.grabbed = false
if (!state.moved) return
let f = Math.max(0, 1 - (Date.now() - state.lastMoveTime))
state.vel = [ // velocity
xsign * (state.cPos[1] - state.pPos[1]) * inits.mult,
ysign * (state.cPos[0] - state.pPos[0]) * inits.mult
]
state.timer = requestAnimationFrame(momentum)
}
function momentum () {
if (Math.abs(state.vel[0]) < inits.epsilon && Math.abs(state.vel[1]) < inits.epsilon) return
state.vel[0] *= inits.decay
state.vel[1] *= inits.decay
state.rotInDrag_radians[0] += state.vel[0]
state.rotInDrag_radians[1] -= state.vel[1]
if (state.timer) state.timer = requestAnimationFrame(momentum)
}
/*******************************************
* @ENTY
*/
let enty = function (p = {}) {
state.rotAccum_radians = mgeom.to_radians(p.rotInit) || inits.rotInit_radians
state.timer = requestAnimationFrame(tick)
return enty
}
enty.dragstarted = dragstarted
enty.dragged = dragged
enty.dragended = dragended
enty.control = control
enty.reset = reset
enty.projection = _ => _ !== undefined ? (state.projection = _, enty) : state.projection
enty.rotation = () => mgeom.add(state.rotAccum_radians, state.rotInDrag_radians).map(mgeom.to_degrees)
return enty
}
exports.controlWen = controlWen
}))
/* -------------------------- */
/* forcebowl *
//* -------------------------- */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcebowl = global.forcebowl || {})))
}(this, function (exports) {
'use strict'
/**
* ref:
* Circular Vortex Emergence
* Philippe Rivi�re�s Block 18ef9696f217cd242f6fb8ec776dc3e3
* Updated December 29, 2016
* https://bl.ocks.org/fil/18ef9696f217cd242f6fb8ec776dc3e3
*/
/* -------------------------- */
/* static */
/* -------------------------- */
let constant = function constant (x) {
return function () {
return x
}
}
/* -------------------------- */
/* forcebowl */
/* -------------------------- */
var forcebowl = function forcebowl (__mapper = {}) {
let props = __mapper('xs').m('props')
/* -------------------------- */
/* muonApi */
/* -------------------------- */
var muonApi = function muonApi () {}
// -------------------------------------//
// force //
// -------------------------------------//
muonApi.force = function (params) {
let nodes = params.nodes
let x0 = (params.x0 !== undefined) ? params.x0 : 0
let y0 = (params.y0 !== undefined) ? params.y0 : 0
let r = (params.r !== undefined) ? params.r : 1
let act = (params.act !== undefined) ? params.act : 'reverse'
function force () {
for (let i = 0; i < nodes.length; ++i) {
let node = nodes[i]
let dx = node.x - x0,
dy = node.y - y0,
d2 = dx * dx + dy * dy
let dd2x = (node.x + node.vx) - x0
let dd2y = (node.y + node.vy) - y0
let dd2 = dd2x * dd2x + dd2y * dd2y
if (d2 < r * r && dd2 >= r * r) {
if (act === 'reverse') {
let angle = Math.atan2(dy, dx)
let angle1 = Math.atan2(node.vy, node.vx)
let angle2 = Math.PI - angle1 + 2 * angle
let norm = Math.sqrt(node.vx * node.vx + node.vy * node.vy)
node.vx = norm * Math.cos(angle2)
node.vy = norm * Math.sin(angle2)
} else if (act === 'erase') {
__mapper('muonStore').apply({'type': 'DELANIMA', 'caller': 'force limit', 'anima': node})
}
} else if (d2 > r * r && dd2 <= r * r) {
var angle = Math.atan2(dy, dx),
angle1 = Math.atan2(node.vy, node.vx),
angle2 = Math.PI - angle1 + 2 * angle,
norm = Math.sqrt(node.vx * node.vx + node.vy * node.vy)
node.vx = norm * Math.cos(angle2)
node.vy = norm * Math.sin(angle2)
}
}
}
function initialize () {
if (!nodes) return
}
force.initialize = function (_) {
nodes = _
initialize()
}
force.x0 = function (_) {
return arguments.length ? (x0 = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : x0
}
force.y0 = function (_) {
return arguments.length ? (y0 = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : y0
}
force.r = function (_) {
return arguments.length ? (r = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : r
}
return force
}
// -------------------------------------//
// muonApi //
// -------------------------------------//
return muonApi
}
exports.forcebowl = forcebowl
}))
/* -------------------------- */
/* forcebox */
/* -------------------------- */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcebox = global.forcebox || {})))
}(this, function (exports) {
'use strict'
/**
* ref:
*/
/* -------------------------- */
/* static */
/* -------------------------- */
let constant = function constant (x) {
return function () {
return x
}
}
/* -------------------------- */
/* forcebox */
/* -------------------------- */
var forcebox = function forcebox (__mapper = {}) {
let props = __mapper('xs').m('props')
/* -------------------------- */
/* muonApi */
/* -------------------------- */
var muonApi = function muonApi () {}
// -------------------------------------//
// force //
// -------------------------------------//
muonApi.force = function (params) {
let nodes = params.nodes
let west = (params.west !== undefined) ? params.west : -Infinity
let east = (params.east !== undefined) ? params.east : Infinity
let north = (params.north !== undefined) ? params.north : -Infinity
let south = (params.south !== undefined) ? params.south : Infinity
let act = (params.act !== undefined) ? params.act : 'reverse'
function force () {
for (let i = 0; i < nodes.length; ++i) {
let node = nodes[i]
let r = node.r || 1
let xw = node.x - r + (node.vx || 0) // west
let xe = node.x + r + (node.vx || 0) // est
let yn = node.y - r + (node.vy || 0) // north
let ys = node.y + r + (node.vy || 0) // south
if (act === 'reverse') {
if (xw < west) node.vx *= -1 // west
if (xe > east) node.vx *= -1 // east
if (yn < north) node.vy *= -1 // north
if (ys > south) node.vy *= -1 // south
} else if (act === 'erase') {
if (xw < west || xe > east || yn < north || ys > south) {
__mapper('muonStore').apply({'type': 'DELANIMA', 'caller': 'force limit', 'anima': node})
}
}
}
}
function initialize () {
if (!nodes) return
}
force.initialize = function (_) {
nodes = _
initialize()
}
force.north = function (_) {
return arguments.length ? (north = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : north
}
force.south = function (_) {
return arguments.length ? (south = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : south
}
force.east = function (_) {
return arguments.length ? (east = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : east
}
force.west = function (_) {
return arguments.length ? (west = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : west
}
return force
}
// -------------------------------------//
// muonApi //
// -------------------------------------//
return muonApi
}
exports.forcebox = forcebox
}))
/*******************************************
* @forcecenter
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcecenter = global.forcecenter || {})))
}(this, function (exports) {
'use strict'
var forcecenter = function forcecenter (__mapper = {}) {
let props = __mapper('xs').m('props')
/***********
* @force
*/
let force = function (params) {
let x = params.center.x || 0
let y = params.center.y || 0
let z = params.center.z || 0
let d3src = (params.src !== undefined) ? params.src : d3 // d3_force
let d3force = d3src.forceCenter(x, y, z)
return d3force
}
var enty = function () {}
enty.force = force
return enty
}
exports.forcecenter = forcecenter
}))
/***********
* @forceCollide
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forceCollide = global.forceCollide || {})))
}(this, function (exports) {
'use strict'
var forceCollide = function (__mapper = {}) {
let props = __mapper('xs').m('props')
/***********
* @force
*/
let force = function (params) {
let nodes = params.nodes || []
let strength = params.strength || 1
let radius = params.radii || 1
let iterations = params.iterations || 1
let d3src = (params.src !== undefined) ? params.src : d3 // d3_force
let d3force = d3src.forceCollide(radius)
.strength(strength)
return d3force
}
var enty = function () {}
enty.force = force
return enty
}
exports.forceCollide = forceCollide
}))
/* -------------------------- */
/* forcecrash *
//* -------------------------- */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcecrash = global.forcecrash || {})))
}(this, function (exports) {
'use strict'
/* -------------------------- */
/* static */
/* -------------------------- */
let constant = function constant (x) {
return function () {
return x
}
}
/* -------------------------- */
/* forcecrash */
/* -------------------------- */
var forcecrash = function forcecrash (__mapper = {}) {
let props = __mapper('xs').m('props')
/* -------------------------- */
/* muonApi */
/* -------------------------- */
var muonApi = function muonApi () {}
// -------------------------------------//
// force //
// -------------------------------------//
muonApi.force = function (params) {
var nodes = params.nodes
let x0 = (params.x0 !== undefined) ? params.x0 : 0
let y0 = (params.y0 !== undefined) ? params.y0 : 0
let r = (params.r !== undefined) ? params.r : 1
function force () {
for (let i = 0; i < nodes.length; ++i) {
let node = nodes[i]
let x = node.x
let y = node.y
let d2 = props.lib.distance2p([x0, y0], [x, y])
let dd = Math.sqrt(d2)
if (dd < r) {
__mapper('muonStore').apply({'type': 'DELANIMA', 'caller': 'force limit', 'anima': node})
}
}
}
function initialize () {
if (!nodes) return
}
force.initialize = function (_) {
nodes = _
initialize()
}
force.x0 = function (_) {
return arguments.length ? (x0 = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : x0
}
force.y0 = function (_) {
return arguments.length ? (y0 = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : y0
}
force.r = function (_) {
return arguments.length ? (r = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : r
}
return force
}
// -------------------------------------//
// muonApi //
// -------------------------------------//
return muonApi
}
exports.forcecrash = forcecrash
}))
/* -------------------------- */
/* forcecrop *
//* -------------------------- */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcecrop = global.forcecrop || {})))
}(this, function (exports) {
'use strict'
/**
* ref:
*/
/* -------------------------- */
/* static */
/* -------------------------- */
let constant = function constant (x) {
return function () {
return x
}
}
/* -------------------------- */
/* forcecrop */
/* -------------------------- */
var forcecrop = function forcecrop (__mapper = {}) {
let props = __mapper('xs').m('props')
/* -------------------------- */
/* muonApi */
/* -------------------------- */
var muonApi = function muonApi () {}
// -------------------------------------//
// force //
// -------------------------------------//
muonApi.force = function (params) {
let nodes = params.nodes
let west = (params.west !== undefined) ? params.west : -Infinity
let east = (params.east !== undefined) ? params.east : Infinity
let north = (params.north !== undefined) ? params.north : -Infinity
let south = (params.south !== undefined) ? params.south : Infinity
function force () {
for (let i = 0; i < nodes.length; ++i) {
let node = nodes[i]
let r = node.r || 1
let xw = node.x - r + (node.vx || 0) // west
let xe = node.x + r + (node.vx || 0) // est
let yn = node.y - r + (node.vy || 0) // north
let ys = node.y + r + (node.vy || 0) // south
if (xw < west || xe > east || yn < north || ys > south) {
__mapper('muonStore').apply({'type': 'DELANIMA', 'caller': 'force crop', 'anima': node})
}
}
}
function initialize () {
if (!nodes) return
}
force.initialize = function (_) {
nodes = _
initialize()
}
force.north = function (_) {
return arguments.length ? (north = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : north
}
force.south = function (_) {
return arguments.length ? (south = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : south
}
force.east = function (_) {
return arguments.length ? (east = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : east
}
force.west = function (_) {
return arguments.length ? (west = typeof _ === 'function' ? _ : constant(+_), initialize(), force) : west
}
return force
}
// -------------------------------------//
// muonApi //
// -------------------------------------//
return muonApi
}
exports.forcecrop = forcecrop
}))
/* -------------------------- */
/* forcecurb */
/* -------------------------- */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcecurb = global.forcecurb || {})))
}(this, function (exports) {
'use strict'
/**
* ref:
*/
/* -------------------------- */
/* static */
/* -------------------------- */
let constant = function constant (x) {
return function () {
return x
}
}
/* -------------------------- */
/* forcecurb */
/* -------------------------- */
var forcecurb = function forcecurb (__mapper = {}) {
let props = __mapper('xs').m('props')
/* -------------------------- */
/* muonApi */
/* -------------------------- */
var muonApi = function muonApi () {}
// -------------------------------------//
// force //
// -------------------------------------//
muonApi.force = function (params) {
let nodes = params.nodes
let retention = params.retention // unit retention
function force () {
for (let i = 0; i < nodes.length; ++i) {
let node = nodes[i]
let unitPassed = node.payload.tim.unitPassed
if (unitPassed === undefined) console.log(' unitPassed undefined')
if (unitPassed > retention) {
// console.log(" remove on retention", node )
__mapper('muonStore').apply({'type': 'DELANIMA', 'caller': 'force retention', 'anima': node})
}
}
}
function initialize () {
if (!nodes) return
}
force.initialize = function (_) {
nodes = _
initialize()
}
return force
}
// -------------------------------------//
// muonApi //
// -------------------------------------//
return muonApi
}
exports.forcecurb = forcecurb
}))
/* -------------------------- */
/* forceenergy */
/* -------------------------- */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forceenergy = global.forceenergy || {})))
}(this, function (exports) {
'use strict'
/* -------------------------- */
/* forceenergy */
/* -------------------------- */
var forceenergy = function forceenergy (__mapper = {}) {
let props = __mapper('xs').m('props')
// --------------------------- */
// force */
// --------------------------- */
let force = function (params) {
let nodes = params.nodes
let retention = params.retention // unit retention
function force () {
for (let i = 0; i < nodes.length; ++i) {
let node = nodes[i]
let unitPassed = node.payload.tim.unitPassed
if (unitPassed === undefined) console.log(' unitPassed undefined')
if (unitPassed > retention) {
__mapper('muonStore').apply({'type': 'DELANIMA', 'caller': 'force retention', 'anima': node})
}
}
}
function initialize () {
if (!nodes) return
}
force.initialize = function (_) {
nodes = _
initialize()
}
return force
}
/* -------------------------- */
/* muonApi */
/* -------------------------- */
var muonApi = function muonApi () {}
muonApi.force = force
return muonApi
}
exports.forceenergy = forceenergy
}))
/* -------------------------- */
/* forceMagnetic */
/* -------------------------- */
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forceMagnetic = global.forceMagnetic || {})))
}(this, function (exports) {
'use strict'
// https://bl.ocks.org/vasturiano/2da88fb89cc75d18b20d8a7776fd6860
var forceMagnetic = function forceMagnetic (__mapper = {}) {
let props = __mapper('xs').m('props')
/* -------------------------- */
/* force */
/* -------------------------- */
let force = function (params) {
let strength = params.strength || (() => 0.1)
let d3src = (params.src !== undefined) ? params.src : d3 // d3_force
console.log('d3src params', params)
// console.log("d3src",d3.forceMagnetic)
// console.log("d3src d3src", d3.forceMagnetic)
let d3force = d3.forceMagnetic()
.strength(strength)
return d3force
}
/* -------------------------- */
/* muonApi */
/* -------------------------- */
var muonApi = function muonApi () {}
muonApi.force = force
return muonApi
}
exports.forceMagnetic = forceMagnetic
}))
/***********
* @forcemanybody
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcemanybody = global.forcemanybody || {})))
}(this, function (exports) {
'use strict'
let forcemanybody = function (__mapper = {}) {
let props = __mapper('xs').m('props')
/***********
* @force
*/
let force = function (params) {
let strength = params.strength || (() => 0.1)
let theta = params.theta || (() => 0.9)
let distanceMin = params.distanceMin || 1
let distanceMax = params.distanceMax || Infinity
let d3src = (params.src !== undefined) ? params.src : d3 // d3_force
let d3force = d3src.forceManyBody()
.strength(strength)
.theta(theta)
return d3force
}
var enty = function enty () {}
enty.force = force
return enty
}
exports.forcemanybody = forcemanybody
}))
/***********
* @forcex
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcex = global.forcex || {})))
}(this, function (exports) {
'use strict'
let forcex = function (__mapper = {}) {
let props = __mapper('xs').m('props')
/***********
* @force
*/
let force = function (params) {
let position = params.position || 0
let strength = params.strength || (() => 0.1)
let d3src = (params.src !== undefined) ? params.src : d3 // d3_force
let d3force = d3src.forceX(position)
.strength(strength)
return d3force
}
var enty = function enty () {}
enty.force = force
return enty
}
exports.forcex = forcex
}))
/***********
* @forcey
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcey = global.forcey || {})))
}(this, function (exports) {
'use strict'
let forcey = function (__mapper = {}) {
let props = __mapper('xs').m('props')
/***********
* @force
*/
let force = function (params) {
let position = params.position || 0
let strength = params.strength || (() => 0.1)
let d3src = (params.src !== undefined) ? params.src : d3 // d3_force
let d3force = d3src.forceY(position)
.strength(strength)
return d3force
}
let enty = function () {}
enty.force = force
return enty
}
exports.forcey = forcey
}))
/***********
* @forcez
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.forcez = global.forcez || {})))
}(this, function (exports) {
'use strict'
let forcez = function (__mapper = {}) {
let props = __mapper('xs').m('props')
/***********
* @force
*/
let force = function (params) {
let position = params.position || 0
let strength = params.strength || (() => 0.1)
let d3src = (params.src !== undefined) ? params.src : d3_force // d3 //
let d3force = d3src.forceZ(position)
.strength(strength)
return d3force
}
let enty = function () {}
enty.force = force
return enty
}
exports.forcez = forcez
}))
/*******************************************
* @geoCox
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.geoCox = global.geoCox || {})))
}(this, function (exports) {
'use strict'
// Philippe Rivière’s Block 1aafd8fa22b62243290674384c364dd0
// Cox Projection
// https://bl.ocks.org/fil/1aafd8fa22b62243290674384c364dd0
// Updated June 14, 2017
// LICENSE# Released under the The MIT License.
// https://bl.ocks.org/Fil/52615c5735550a8fd325b0316d896d67
// https://visionscarto.net/cox-conformal-projection
// http://www.cs.dartmouth.edu/~doug/wallpaper.pdf
let geoCox = function geoCox (__mapper = {}) {
let renderport = __mapper('renderRenderport'),
width = renderport.width(),
height = renderport.height(),
scaleProj = Math.min(width / 2, height) / Math.PI
let epsilon = 1e-6, epsilon2 = epsilon * epsilon, asin = Math.asin
let pi = Math.PI, degrees = 180 / pi, asin1_3 = Math.asin(1 / 3)
let radians = Math.PI / 180
let cache = {},
cacheProject
let d3Geo = d3
/*******************************************
* @sphere
*/
// the Sphere should go *exactly* to the vertices of the triangles
// because they are singular points
function sphere () {
let degrees = 180 / Math.PI,
c = 2 * Math.asin(1 / Math.sqrt(5)) * degrees // 53.130102354156
return {
type: 'Polygon',
coordinates: [
[ [ 0, -90 ], [ -180, c ], [ 0, 90 ], [ 180, c ], [ 0, -90 ] ] // N/S
]
}
}
/*******************************************
* @prjRaw
*/
// prjlat || 1 // [1,-1] north/south
// prjlagr || 0.5 // lagrange coef
// prjrad || 2 // radius
let prj = function (prjlat = 1, prjlagr = 0.5, prjrad = 1) {
let prjRaw = function (lambda, phi) {
// Approximate \int _0 ^sm(z) dt / (1 - t^3)^(2/3)
// sm maps a triangle to a disc, sm^-1 does the opposite
function sm_1 (s) {
let w0 = [-1 / 2, Math.sqrt(3) / 2], // [Math.sin(-30 * radians), Math.cos(-30 * radians)],
w = Complex(w0),
k = Complex(0),
z = Complex(s)
let rot = w.clone().pow(d3.scan([0, 1, 2].map( // rotate to have s ~= 1
i => -(z.clone().mul(w.clone().pow(i))).re
)))
let n = z.abs()
let m = [0, 0.3]
if (n > m[0]) { // n > m[0]::0
let y = rot.clone().mul(z).mul(-1).add(1)
// let n = 3
// w1 = gamma(1/n) * gamma(1 - 2/n) / n / gamma(1 - 1/n)
// https://bl.ocks.org/Fil/852557838117687bbd985e4b38ff77d4
let w1 = 1.7666387502854533
// McIlroy formula 5 p6 and table for F3 page 16
let F0 = __mapper('xs').m('geom').coefsF0() // F0 coeficients
let F = Complex(0)
for (let i = F0.length; i--;) F = Complex(F0[i]).add(F.mul(y))
k = Complex(w1).add(y.pow(1 - 2 / 3).mul(-1).mul(F)).mul(rot.pow(2)) // mutate y
}
if (n < m[1]) { // n < m[1]::0.3
// when we are close to [0,0] we switch to another approximation:
// https://www.wolframalpha.com/input/?i=(-2%2F3+choose+k)++*+(-1)%5Ek++%2F+(k%2B1)+with+k%3D0,1,2,3,4
// the difference is _very_ tiny but necessary
// if we want projection(0,0) === [0,0]
let H0 = [ 1, 1 / 3, 5 / 27, 10 / 81, 22 / 243 ]
let z3 = z.clone().pow(3)
let h = Complex(0)
for (let i = H0.length; i--;) {
h = Complex(H0[i]).add(h.mul(z3))
}
h = h.mul(z)
k.mul(n / m[1]).add(h.mul(1 - n / m[1]))
}
return k.toVector()
}
let s = d3.geoLagrangeRaw(prjlagr)(lambda, phi) // lagrange
let s1 = [prjlat * s[1], prjlat * s[0]] // N/S
let s2 = [s1[0] / prjrad, s1[1] / prjrad] // radio
let t = sm_1(s2) // interpolation
let ret = [prjlat * t[1], prjlat * t[0]] // N/S
return ret
}
prjRaw.invert = __mapper('xs').m('math').geoInverse(prjRaw)
return prjRaw
}
/*******************************************
* @enty
*/
let p = function (proform) {
let m
let {prjlat, prjlagr, prjrad} = proform
if ({prjlat, prjlagr, prjrad} ===
cache.prjlat, cache.prjlagr, cache.prjrad &&
cacheProject !== undefined) {
m = cacheProject
} else {
cache.prjlat = prjlat
cache.prjlagr = prjlagr
cache.prjrad = prjrad
m = d3.geoProjection(prj(prjlat, prjlagr, prjrad))
cacheProject = m
}
return m
}
let enty = proform => p(proform)
return enty
}
exports.geoCox = geoCox
}))
/*******************************************
* @geofuturi
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.geofuturi = global.geofuturi || {})))
}(this, function (exports) {
'use strict'
// Philippe Rivière’s Block 14ddff5e46b6fe9341dae91c3c83304b
// Updated August 6, 2017
// Furuti cubic projection #Carlos Furuti's cubic globe #1 - http://www.progonos.com/furuti/MapProj/Normal/ProjPoly/projPoly2.html
// Based on "Earth in a Cube" by Enrico Spinielli and on my research for d3-geo-projection/pull/86 and d3-geo/issues/46.
// Re-incorporating Jason Davies’ clipPolygon() code into d3v4.
// Code base at Fil/d3-geo:clip-polygon.
// See also https://bl.ocks.org/Fil/694ba0d0bc1fc4c24eb257dc210eb01a
// forked from Fil's block: Furuti 3 - projection.clipPolygon()
// LICENSE# Released under the The MIT License.
let geofuturi = function geofuturi (__mapper = {}) {
let f = __mapper('xs').m('props'),
mgeom = __mapper('xs').m('geom'),
mpolyhedral = __mapper('xs').m('polyhedral')
let renderport = __mapper('renderRenderport'),
width = renderport.width(),
height = renderport.height(),
scaleProj = Math.min(width / 2, height) / Math.PI
let atan = Math.atan,
pi = Math.PI, degrees = 180 / pi,
sqrt1_2 = Math.SQRT1_2
/*******************************************
* @polyhedron
*/
let vertices = []
let mode = 'cartesian'
if (mode === 'spherical') {
let ang = 90,
phi1 = atan(sqrt1_2) * degrees // 35.264389682754654
vertices = [
[ (-1 * ang - 45), phi1], // 3
[ (0 * ang - 45), phi1], // 0
[ (1 * ang - 45), phi1], // 1
[ (2 * ang - 45), phi1], // 2
[ (-1 * ang - 45), -phi1], // 7
[ (0 * ang - 45), -phi1], // 4
[ (1 * ang - 45), -phi1], // 5
[ (2 * ang - 45), -phi1] // 6
]
} else {
vertices = [
[-1, -1, 1], // 0 // 0
[ 1, -1, 1], // 1 // 1
[ 1, 1, 1], // 2 // 2
[-1, 1, 1], // 3 // 3
[-1, -1, -1], // 5 // 4
[ 1, -1, -1], // 4 // 5
[ 1, 1, -1], // 7 // 6
[-1, 1, -1] // 6 // 7
].map(mgeom.normalize)
.map(mgeom.spherical)
.map(mgeom.to_degrees)
vertices = d3.merge([
vertices
])
}
let faces = [
[1, 0, 3, 2, 1], // N
[1, 2, 6, 5, 1],
[2, 3, 7, 6, 2],
[3, 0, 4, 7, 3],
[0, 1, 5, 4, 0],
[5, 6, 7, 4, 5] // S
].map(function (face) {
return face.map(function (i) {
return vertices[i]
})
})
/*******************************************
* @enty
*/
let enty = function (p = {}) {
if (!p.faciaRotation) p.faciaRotation = Math.PI / 4
if (!p.geoRotation) p.geoRotation = c => [-c[0], -c[1], 0]
if (!p.tree) p.tree = [-1, 4, 5, 2, 0, 1]
if (!p.rotate) p.rotate = [28, -4, 0] // California
if (!p.faces) p.faces = faces
if (!p.prjRaw) p.prjRaw = d3.geoGnomonicRaw
return mpolyhedral(p)
}
return enty
}
exports.geofuturi = geofuturi
}))
/***************************
* @geoHedrals
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.geoHedrals = global.geoHedrals || {})))
}(this, function (exports) {
'use strict'
let geoHedrals = function geoHedrals (__mapper = {}) {
let f = __mapper('xs').m('props'),
mpolyhedral = __mapper('xs').m('polyhedral')
const pi = Math.PI, degrees = 180 / pi, radians = pi / 180
/****************************
* @enty
*/
let enty = function (p = {}) {
if (!p.faciaRotation) p.faciaRotation = Math.PI / 4 // faciaRotation
if (!p.geoRotation) p.geoRotation = c => [-c[0], -c[1], 0] // geoRotation
if (!p.prjRaw) p.prjRaw = d3.geoGnomonicRaw // prjRaw
p.tree = f.objxx('tree', 'trees', 'treeidx', p) // tree
if (!p.tree) p.tree = [-1] // root
let {vertices, faces} = p // vertices and faces in geo data
if (vertices !== undefined) { // assume faces from degreed spherical verties
vertices = d3.merge([ vertices]) // spher degrees eg. [-45, 35.2643]
faces = faces.map(function (face) { // faces : points => vertices
return face.map(function (p) { // eg. [1, 0, 3, 2, 1]
return vertices[p]
}) // eg. [-45, 35], [-135, 35], [135, 35], [45, 354], [-45, 35]
})
} else { // assume faces as degreed spherical polygons
faces = f.v(faces)
}
p.faces = faces
return mpolyhedral(p) // get polyhedral projection
}
return enty
}
exports.geoHedrals = geoHedrals
}))
/*******************************************
* @geoMyriad
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.geoMyriad = global.geoMyriad || {})))
}(this, function (exports) {
'use strict'
// Philippe Rivière’s Block 14ddff5e46b6fe9341dae91c3c83304b
// Updated August 6, 2017
// Furuti cubic projection #Carlos Furuti's cubic globe #1 - http://www.progonos.com/furuti/MapProj/Normal/ProjPoly/projPoly2.html
// Based on "Earth in a Cube" by Enrico Spinielli and on my research for d3-geo-projection/pull/86 and d3-geo/issues/46.
// Re-incorporating Jason Davies’ clipPolygon() code into d3v4.
// Code base at Fil/d3-geo:clip-polygon.
// See also https://bl.ocks.org/Fil/694ba0d0bc1fc4c24eb257dc210eb01a
// forked from Fil's block: Furuti 3 - projection.clipPolygon()
// LICENSE# Released under the The MIT License.
let geoMyriad = function geoMyriad (__mapper = {}) {
let mkruskal = __mapper('xs').m('kruskal')
let renderport = __mapper('renderRenderport'),
width = renderport.width(),
height = renderport.height(),
scaleProj = Math.min(width / 2, height) / Math.PI
let epsilon = 1e-6, epsilon2 = epsilon * epsilon
let asin = Math.asin, atan = Math.atan
let pi = Math.PI, degrees = 180 / pi, radians = pi / 180
let asin1_3 = Math.asin(1 / 3)
let sqrt1_2 = Math.SQRT1_2
let abs = Math.abs
let eps = 1e-6
function spherical (cartesian) {
return [
Math.atan2(cartesian[1], cartesian[0]),
Math.asin(Math.max(-1, Math.min(1, cartesian[2])))
]
}
function to_degrees (v) {
return v.map(d => d * degrees)
}
function normalize (a) {
let d = Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2])
return a.map(e => e / d)
}
let d3Geo = d3
/*******************************************
* @state
*/
let state = {}
state.futuryCef1 = Math.PI / 4
state.tree = [-1, 4, 5, 2, 0, 1] // [-1, 0, 0, 0, 0, 4] //
state.rotate = [28, -4, 0]
let enxs = function (obj, objs, objidx = 0) {
if (obj !== undefined) { // if projection singular
return obj.map(d => Math.round(d))
} else if (objs !== undefined) { // if plural select one
let idx = (objidx !== undefined) ? Math.round(objidx) : 0
return objs[idx].map(d => Math.round(d))
} else if (state[obj] !== undefined) {
return state[obj].map(d => Math.round(d))
} else {
return undefined
}
}
/*******************************************
* @prjRaw
*/
let prjRaw = d3.geoGnomonicRaw
/*******************************************
* @polyhedron
*/
// --------------------------
let g = (1 + Math.sqrt(5)) / 2
let vertices = [
[0, 1, g],
[g, 0, 1],
[1, g, 0]
]
vertices = d3.merge([
vertices,
vertices.map(d => d.map(e => e * (e == 1 ? -1 : 1))),
vertices.map(d => d.map(e => e * (e > 1 ? -1 : 1))),
vertices.map(d => d.map(e => e * (e > 0 ? -1 : 1)))
])
.map(normalize)
.map(spherical)
.map(to_degrees)
let cornerpoints = {
type: 'FeatureCollection',
features: vertices.map(function (f, i) {
return {
type: 'Point',
index: i,
coordinates: f
}
})
}
let voro = d3.geoVoronoi()(cornerpoints)
let polyhedron = voro.polygons().features.map(d => d.geometry.coordinates[0])
let links = voro.links().features.map(d => d.properties)// .filter(d => d.urquhart)
links.forEach(l => { // prefer certain links
let u = d3.extent([l.source.index, l.target.index]).join('-')
l.length = 1 - 0.5 * (['0-1', '1-4', '1-8', '2-4', '2-5', '3-7', '3-8', '6-10', '8-9'].indexOf(u) > -1)
})
let k = {
type: 'FeatureCollection',
features: mkruskal(links).map(l => ({
type: 'LineString',
coordinates: [l.source.coordinates, l.target.coordinates],
properties: l
}))
}
let tree0 = [-1]
let search = polyhedron.length - 1
do {
k.features.forEach(l => {
let s = l.properties.source.index,
t = l.properties.target.index
if (tree0[s] !== undefined && tree0[t] === undefined) {
tree0[t] = s
search--
} else if (tree0[t] !== undefined && tree0[s] === undefined) {
tree0[s] = t
search--
}
})
} while (search > 0)
// tree0 = [-1, 0, 4, 8, 1, 2, 2, 3, 1, 8, 6, 3]
/*******************************************
* @enty
*/
let enty = function (proform = {}) {
let futuryCef1 = (proform.futuryCef1 !== undefined) ? proform.futuryCef1 : state.futuryCef1
let facerotation = (72 * 1.5) * radians
let {trees, treeidx, tree} = proform //
tree = enxs(tree, trees, treeidx) || tree0
let faceProjection = function (face) {
let prj = d3Geo.geoProjection(prjRaw)
let c = d3Geo.geoCentroid({type: 'MultiPoint', coordinates: face})
let rotate = [-c[0], -c[1], 0]
let translate = [0, 0]
let scale = 1 // convention
return prj.scale(scale).translate(translate).rotate(rotate)
}
let faces = polyhedron.map(function (face) {
let polygon = face.slice()
face = face.slice(0, -1) // ?
return {
face: face,
contains: function (lambda, phi) {
return d3Geo.geoContains({ type: 'Polygon', coordinates: [ polygon ] },
[lambda * degrees, phi * degrees])
},
project: faceProjection(face)
}
})
tree.forEach(function (d, i) { // tree
let node = faces[d]
node && (node.children || (node.children = [])).push(faces[i])
})
let facefn = function (lambda, phi) {
for (let i = 0; i < faces.length; i++) {
if (faces[i].contains(lambda, phi)) return faces[i]
}
}
let m = d3Geo.geoPolyhedral(
faces[0],
facefn,
facerotation, // rotation of the root face in the projected (pixel) space
true // clipPolygon http://blockbuilder.org/Fil/cb7930254c9e7062114678d62d9be5ac
)
m.faces = faces
return m
}
return enty
}
exports.geoMyriad = geoMyriad
}))
/*******************************************
* @geoNatform
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.geoNatform = global.geoNatform || {})))
}(this, function (exports) {
'use strict'
let geoNatform = function geoNatform (__mapper = {}) {
let f = __mapper('xs').m('props'),
mnat = __mapper('xs').m('nat')
let state = {},
scale = [1, 1, 1],
rotate = [0, 0, 0],
translate = [0, 0, 0],
lens = [0, 1, Infinity]
const cos = Math.cos, sin = Math.sin,
neg = x => x < 0 || (x === 0 && (1 / x < 0)),
pos = x => x > 0 || (x === 0 && (1 / x > 0)),
radians = Math.PI / 180,
degrees = 180 / Math.PI,
tau = 2 * Math.PI
let cache = {} // points, form
// ............................. pointStream
let pointStream = function (prjdef) {
let natPoint = mnat.natVertex(prjdef.form) // m.nat.natVertex (a,b,c) => [a,b,c]
let stream = function (lambda, phi, radio = 1) {
this.stream.point(...natPoint(lambda, phi, radio))
}
return stream
}
// ............................. natprofion
let natprofion = prjdef => { // projection:natPoint, form:{x,y,z}
let geoTrans = d3.geoTransform({
point: pointStream(prjdef)})
let geoProj = p => geoTrans(p)
geoProj.stream = s => geoTrans.stream(s)
return geoProj
}
// ............................. enty
let enty = function (prjdef = {}) {
let m = natprofion(prjdef)
return m
}
return enty
}
exports.geoNatform = geoNatform
}))
/*******************************************
* @geotetra
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.geotetra = global.geotetra || {})))
}(this, function (exports) {
'use strict'
// Philippe Rivière’s Block 1aafd8fa22b62243290674384c364dd0
// Cox Projection
// https://bl.ocks.org/fil/1aafd8fa22b62243290674384c364dd0
// Updated June 14, 2017
// LICENSE# Released under the The MIT License.
// https://bl.ocks.org/fil/79d2073c50e02b1b4f74e3f330183581
// https://bl.ocks.org/fil/d5313cd939947169df5c37e896e5aa38
// https://bl.ocks.org/fil/e5b449606ca1e3e120cda8d08a7f3351
let geotetra = function geotetra (__mapper = {}) {
let mpolyhedral = __mapper('xs').m('polyhedral')
let renderport = __mapper('renderRenderport'),
width = renderport.width(),
height = renderport.height(),
scaleProj = Math.min(width / 2, height) / Math.PI
let epsilon = 1e-6, epsilon2 = epsilon * epsilon, asin = Math.asin
let pi = Math.PI, degrees = 180 / pi, asin1_3 = Math.asin(1 / 3)
let radians = Math.PI / 180
let d3Geo = d3
/*******************************************
* @prjRaw
*/
// prjlat [1,-1] north/south
// prjlagr lagrange coef
// prjrad radius
let prj = function (prjlat = 1, prjlagr = 0.5, prjrad = 1) {
let prjRaw = function (lambda, phi) { // leeRaw // return d3.geoGnomonicRaw(...arguments);
function sm_1 (s) {
let w = Complex([Math.sin(-30 * radians), Math.cos(-30 * radians)]), // [-1/2, Math.sqrt(3)/2]
k = Complex(0),
h = Complex(0),
z = Complex(s).mul(Math.sqrt(2))
let rot = w.clone().pow(d3.scan([0, 1, 2].map( // rotate to have s ~= 1
i => -(z.clone().mul(w.clone().pow(i))).re
)))
let m = [0.3, 0.5]
let n = z.abs()
if (n > m[0]) {
// if |z| > m[1], use the approx based on y = (1-z)
// McIlroy formula 6 p6 and table for G page 16
let y = rot.clone().mul(z).mul(-1).add(1)
// w1 = gamma(1/3) * gamma(1/2) / 3 / gamma(5/6);
// https://bl.ocks.org/Fil/1aeff1cfda7188e9fbf037d8e466c95c
let w1 = 1.4021821053254548
let G0 = __mapper('xs').m('geom').coefsG0() // G0 coeficients
let G = Complex(0)
for (let i = G0.length; i--;) {
G = Complex(G0[i]).add(G.mul(y))
}
k = Complex(w1).add(y.sqrt().mul(-1).mul(G)).mul(rot).mul(rot)
} // n > m[0]
if (n < m[1]) {
// if |z| < m[0]
// https://www.wolframalpha.com/input/?i=series+of+((1-z%5E3))+%5E+(-1%2F2)+at+z%3D0 (and ask for "more terms")
// 1 + z^3/2 + (3 z^6)/8 + (5 z^9)/16 + (35 z^12)/128 + (63 z^15)/256 + (231 z^18)/1024 + O(z^21)
// https://www.wolframalpha.com/input/?i=integral+of+1+%2B+z%5E3%2F2+%2B+(3+z%5E6)%2F8+%2B+(5+z%5E9)%2F16+%2B+(35+z%5E12)%2F128+%2B+(63+z%5E15)%2F256+%2B+(231+z%5E18)%2F1024
// (231 z^19)/19456 + (63 z^16)/4096 + (35 z^13)/1664 + z^10/32 + (3 z^7)/56 + z^4/8 + z + constant
let H0 = [1, 1 / 8, 3 / 56, 1 / 32, 35 / 1664, 63 / 4096, 231 / 19456 ]
let z3 = z.clone().pow(3)
for (let i = H0.length; i--;) {
h = Complex(H0[i]).add(h.mul(z3))
}
h = h.mul(z)
} // n < m[1]
let t
if (n < m[0]) { t = h } else if (n > m[1]) { t = k } else {
let inter = (n - m[0]) / (m[1] - m[0]) // interpolate between m[0] and m[1]
t = k.mul(inter).add(h.mul(1 - inter))
}
return t.toVector()
}
let s = d3.geoStereographicRaw(lambda, phi) // lagrange
let t = sm_1(s)
let ret = t
return ret
}
prjRaw.invert = __mapper('xs').m('math').geoInverse(prjRaw)
return prjRaw
}
/*******************************************
* @faces
*/
let vertices = [
[0, 90],
[-180, -asin1_3 * degrees],
[-60, -asin1_3 * degrees],
[60, -asin1_3 * degrees]
]
let faces = [
[1, 2, 3, 1],
[0, 2, 1, 0],
[0, 3, 2, 0],
[0, 1, 3, 0]
].map(function (face) {
return face.map(function (i) {
return vertices[i]
})
})
/**********************
* @enty
*/
let enty = function (p = {}) {
let {prjlat, prjlagr, prjrad} = p
if (!p.faciaRotation) p.faciaRotation = Math.PI / 6
if (!p.geoRotation) p.geoRotation = c => (Math.abs(c[1]) == 90) ? [ 0, -c[1], -30 ] : [ -c[0], -c[1], 30 ]
if (!p.tree) p.tree = [-1, 0, 0, 0]
if (!p.rotate) p.rotate = [28, -4, 0]
if (!p.faces) p.faces = faces
if (!p.prjRaw) p.prjRaw = prj(prjlat, prjlagr, prjrad)
return mpolyhedral(p)
}
return enty
}
exports.geotetra = geotetra
}))
/*******************************************
* @geoUnimercator
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.geoUnimercator = global.geoUnimercator || {})))
}(this, function (exports) {
'use strict'
// https://d3js.org/d3-geo/ Version 1.9.0. Copyright 2017 Mike Bostock.
var geoUnimercator = function geoUnimercator (__mapper = {}) {
/*******************************************
* @mercatorRaw
*/
let atan = Math.atan,
exp = Math.exp,
log = Math.log,
tan = Math.tan,
pi = Math.PI,
halfPi = pi / 2
function mercatorRaw (lambda, phi) {
return [lambda, log(tan((halfPi + phi) / 2))]
}
mercatorRaw.invert = function (x, y) {
return [x, 2 * atan(exp(y)) - halfPi]
}
/*******************************************
* @enty mercator
*/
var enty = function () { // mercator
let m = mercatorProjection(mercatorRaw)
return m
}
function mercatorProjection (project) {
var m = d3.geoProjection(project),
center = m.center,
scale = m.scale,
translate = m.translate,
clipExtent = m.clipExtent,
x0 = null, y0, x1, y1 // clip extent
m.scale = function (_) {
return arguments.length ? (scale(_), reclip()) : scale()
}
m.translate = function (_) {
return arguments.length ? (translate(_), reclip()) : translate()
}
m.center = function (_) {
return arguments.length ? (center(_), reclip()) : center()
}
m.clipExtent = function (_) {
return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]
}
function reclip () {
var k = pi * scale(),
t = m(d3.geoRotation(m.rotate()).invert([0, 0]))
return clipExtent(x0 == null
? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
: [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]])
}
return reclip()
}
return enty
}
exports.geoUnimercator = geoUnimercator
}))
/*******************************************
* @geoUniwen
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.geoUniwen = global.geoUniwen || {})))
}(this, function (exports) {
'use strict'
let geoUniwen = function geoUniwen (__mapper = {}) {
let f = __mapper('xs').m('props'),
mgeom = __mapper('xs').m('geom'),
mwen = __mapper('xs').m('wen'),
cwen = __mapper('xs').c('wen')
const init = {}
init.scale = [1, 1, 1]
init.prerotate = [0, 0, 0]
init.rotate = [0, 0, 0]
init.translate = [0, 0, 0]
init.center = [0, 0, 0]
init.lens = [0, 1, Infinity]
let state = {}
state.scale = init.scale
state.rotate = init.rotate
state.translate = init.translate
state.center = init.center
state.lens = init.lens
let wenRotation = function (rot) {
let rox = mwen.matrix(rot !== undefined ? mgeom.to_radians(rot) : cwen.rotation())
return function (x, y, z = 0) {
return mwen.rotateMatrix([x, y, z], rox)
}
}
let wenRotInverse = function (rot) {
let rox = mwen.matrix(rot !== undefined ? mgeom.to_radians(rot) : cwen.rotation())
let invrox = mwen.transpose33(rox)
return function (x, y, z = 0) {
return mwen.rotateMatrix([x, y, z], invrox)
}
}
let wenFocalInverse = function (p, d, s) {
let h = Array.isArray(s) ? s : Array.of(s)
let f0 = (h[0] || 1) / (1 - p[2] / d)
let f1 = (h[1] || h[0]) / (1 - p[2] / d)
return [p[0] / f0, p[1] / f1, p[2]]
}
/**************************
* @wenProjInvert
*/
let wenProjInvert = function (point) {
let rotate = state.rotate,
scale = state.scale,
translate = state.translate || [0,0,0],
lens = state.lens
let x = point[0]
let y = point[1]
let z = point[2] || 0
let c = [x, y, z]
if (f.isPureArray(translate)) {
c = c.map((d, i) => d - (translate[i] || 0)) // inverse translate
} else { // assume multiple translates
for (let k = 0; k < translate.length; k++) {
let trans = translate[k] // if {} assume {x,y,z} => [,,]
if (typeof trans === 'object') trans = Object.values(trans).map(d => d || 0)
c = c.map((d, i) => d - (trans[i] || 0)) // translate
}
}
c = wenFocalInverse([ c[0], c[1], z ], lens[2], scale) // inverse projection
c = [ c[0], c[1], (c[2] - lens[0]) / lens[1] ] // inverse focus
c = wenRotInverse(rotate)(...c) // inverse rotation
return c
}
/**************************
* @pointStream
*/
let pointStream = function (x, y, z) {
let rotate = state.rotate,
scale = state.scale,
translate = state.translate || [0,0,0],
lens = state.lens
let c = [x, y, z]
let rot = []
if (f.isPureArray(rotate)) {
rot = rotate
} else { // assume multiple translates
for (let k = 0; k < rotate.length; k++) {
rot = mgeom.add(rot, rotate[k])
}
}
c = wenRotation(rot)(...c) // rotate
c = [ c[0], c[1], (c[2] * lens[1]) + lens[0] ] // focus
c = mwen.projection(c, lens[2], scale) // project
if (f.isPureArray(translate)) {
c = c.map((d, i) => d + (translate[i] || 0)) // translate
} else { // assume multiple translates
let trans = []
for (let k = 0; k < translate.length; k++) {
trans = mgeom.add(trans, translate[k])
}
}
this.stream.point(...c)
}
/**************************
* @uniprofion
*/
let uniprofion = () => {
let geoTrans = d3.geoTransform({
point: pointStream,
sphere: d => d })
let geoProj = p => geoTrans(p)
geoProj.stream = s => geoTrans.stream(s)
geoProj.invert = wenProjInvert
return geoProj
}
/****************************
* @enty
*/
let enty = function (prjdef = {}) {
let m = uniprofion(prjdef)
let keys = Object.keys(prjdef)
state = Object.assign({}, init, prjdef) // reste proj state
m.translate = _ => (_ !== undefined) ? (state.translate = _, m) : state.translate
m.rotate = _ => (_ !== undefined) ? (state.rotate = _, m) : state.rotate
m.scale = _ => (_ !== undefined) ? (state.scale = _, m) : state.scale
m.lens = _ => (_ !== undefined) ? (state.lens = _, m) : state.lens
return m
}
return enty
}
exports.geoUniwen = geoUniwen
}))
/****************************
* @haloAxis
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloAxis = global.haloAxis || {})))
}(this, function (exports) {
'use strict'
var haloAxis = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mstace = __mapper('xs').m('stace')
let _geoform = p => ({ // geofold
type: 'Feature',
geometry: {
'type': 'Point',
'coordinates': [0, 0]
},
properties: {}
})
// ............................. gramm
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
geofold = anigram.geofold || _geoform, // geofold
payload = anigram.payload, // payload
boform = payload.boform, // boform
ric = payload.ric, // ric
tim = payload.tim, // tim
proform = payload.proform, // proform
conform = payload.conform, // conform
uid = payload.uid, // uid
parentuid = payload.parentuid, // parentuid
axis = payload.axis // axis
let distx = axis.distx || 0,
disty = axis.disty || 0,
range = axis.range || [0,1],
domain = axis.domain || [0,1],
rotate = axis.rotate || 0,
tickSize = axis.tickSize || 2,
tickPadding = axis.tickPadding || 20,
tickFormat = axis.tickFormat || '',
scaleType = axis.scaleType,
orient = axis.orient
// tranlateX
// tranlateY
// rotate
let situs = mstace.getSitus(anigram)
let _scale = (scaleType) ? d3[scaleType]() : d3['scaleTime']()
let _d3Axis = (orient) ? d3[orient] : d3['axisBottom']
let newAnigram = { halo, geofold, payload }
newAnigram.geofold.properties = {
sort: 'axis',
ric: ric,
uid: uid,
axis: Object.assign(axis, {
scale: _scale.domain(domain).range(range),
rotate: rotate,
d3Axis: _d3Axis(_scale.domain(domain).range(range))
.tickFormat((tickFormat === '') ? '' : d3.format(tickFormat))
.tickSizeOuter(0)
.tickSize(tickSize)
.tickPadding(tickPadding),
style: {
'text-anchor': 'middle',
'font-size': 12,
'font-family': 'sans-serif',
},
})
}
newAnigrams = [...newAnigrams, ...__mapper('xs').h('ent').gramm(newAnigram)]
return newAnigrams
}
// ............................. enty
let haloAxis = {}
haloAxis.ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = 1, [anima]) : []
haloAxis.gramm = anima => gramm(anima)
let enty = haloAxis
return enty
}
exports.haloAxis = haloAxis
}))
/**********************
* @haloCamera
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloCamera = global.haloCamera || {})))
}(this, function (exports) {
'use strict'
let haloCamera = function haloCamera (__mapper = {}) {
let f = __mapper('xs').m('props'),
r = __mapper('xs').r('renderport'),
manitem = __mapper('xs').m('anitem')
// let haloCamera_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloCamera_ween = function (anima) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
geofold = anigram.geofold, // geofold
payload = anigram.payload // payload
if (payload.camera !== undefined) {
r.cameraProjer(payload.camera)
}
return []
}
let haloCamera_gramm = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
/**********************
* @enty
*/
let haloCamera = {}
haloCamera.ween = anima => haloCamera_ween(anima)
haloCamera.gramm = anima => haloCamera_gramm(anima)
let enty = haloCamera
return enty
}
exports.haloCamera = haloCamera
}))
/**********************
* @haloCore
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloCore = global.haloCore || {})))
}(this, function (exports) {
'use strict'
let haloCore = function haloCore (__mapper = {}) {
let haloCore_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloCore_gramm = anima => Array.of(__mapper('xs').m('anitem')(anima).anigram())
/**********************
* @enty
*/
let haloCore = {}
haloCore.ween = anima => haloCore_ween(anima)
haloCore.gramm = anima => haloCore_gramm(anima)
let enty = haloCore
return enty
}
exports.haloCore = haloCore
}))
/**********************
* @haloEnt
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloEnt = global.haloEnt || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **process h.ent animas**
// md: Feature Collect gj. for each feature
// md: geoform, conform, ereform and proform anigrams
// md: then pass the FeatureCollection to h.formed
// md: define `geofold.properties.geonode` if undefined
let haloEnt = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mric = __mapper('xs').m('ric'),
mboform = __mapper('xs').m('boform'),
mgeoj = __mapper('xs').m('geoj'),
mprofier = __mapper('xs').m('profier'),
mstore = __mapper('xs').m('store'),
mproj3ct = __mapper('xs').m('proj3ct'),
mstace = __mapper('xs').m('stace'),
hformed = __mapper('xs').h('formed')
// ............................. gramm
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
geofold = anigram.geofold, // geofold
payload = anigram.payload, // payload
avatars = anigram.avatars // avatars
let boform = payload.boform, // boform
ric = payload.ric, // ric
tim = payload.tim, // tim
vim = payload.vim, // vim
proform = payload.proform, // proform
conform = payload.conform, // conform
uid = payload.uid, // uid
parentuid = payload.parentuid // parentuid
let gj
gj = f.v(geofold, anigram) // get geofold
gj.properties = gj.properties || {} // recall genode
gj.properties.geonode = gj.properties.geonode || {} // recall genode properties
if (2 && 2 && !mgeoj.isValid(gj)) { console.log('** h.ent:gj not valid', geofold, gj) }
gj.properties.formGeoformed = mgeoj.deprop(gj) // store geoform
gj.properties.nodeGeoformed = gj.properties.geonode // nodeGeoformed : geonode
let gjcollection = mgeoj.featurecollect(gj) // FEATURE COLLECT
gjcollection.features = gjcollection.features.map((f, i) => { // per feature
let feature = mprofier.conformer(anigram)(f) // CONFORM
feature.properties.formConformed = mgeoj.deprop(feature) // store conform
feature.properties.nodeConformed = feature.properties.geonode // nodeConformed : geonode
if (payload.ereform) { // EREFORM
let ereformion = mprofier.ereformion(anigram)
feature = mproj3ct(feature, ereformion)
feature.properties.formEreformed = mgeoj.deprop(feature) // store ereform
feature.properties.nodeEreformed = mproj3ct(feature.properties.nodeConformed, ereformion) //
nodeConformed => nodeEreformed
} else {
feature.properties.formEreformed = feature.properties.formConformed
feature.properties.nodeEreformed = feature.properties.nodeConformed
}
if (payload.proform) { // PROFORM
let proformion = mprofier.proformion(anigram)
feature = mproj3ct(feature, proformion)
feature.properties.formProformed = mgeoj.deprop(feature) // store proform
feature.properties.nodeProformed = mproj3ct(feature.properties.nodeEreformed, proformion)
} else {
feature.properties.formProformed = feature.properties.formEreformed
feature.properties.nodeProformed = feature.properties.nodeEreformed
}
return feature
})
anigram.geofold = gjcollection // new anigram geofold is FeatureCollection
newAnigrams = hformed.gramm(anigram)
return newAnigrams // new anigrams are stored by m.animation
}
// ............................. enty
let haloGeofold_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloGeofold_gramm = anima => gramm(anima)
let haloEnt = {}
haloEnt.ween = anima => haloGeofold_ween(anima)
haloEnt.gramm = anima => haloGeofold_gramm(anima)
let enty = haloEnt
return enty
}
exports.haloEnt = haloEnt
}))
/**********************
* @haloFormed
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloFormed = global.haloFormed || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **process h.formed anigrams**
// md:
// md: expects `a.geofold` to be `geojson.FeatureCollection`
// md: for the feature collection
// md: * order the collection on z dax, `mgeoj.zorder(gjcollection)`
// md: * identify to features on index, `mric.enric(ric, anigram, gjcollection)`
// md:
// md: then for each feature,
// md: * boform, decoding style properties
// md: * set sort. `feature.properties.sort` will determine rendering. default to feature
// md: * inherit avatars
// md:
// md: then pass the collection back to `m.animation` for rendering
let haloFormed = function haloFormed (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mric = __mapper('xs').m('ric'),
mboform = __mapper('xs').m('boform'),
mgeoj = __mapper('xs').m('geoj'),
mprofier = __mapper('xs').m('profier'),
mstore = __mapper('xs').m('store'),
mproj3ct = __mapper('xs').m('proj3ct'),
mstace = __mapper('xs').m('stace')
// ............................. gramm
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
geofold = anigram.geofold, // geofold
payload = anigram.payload, // payload
avatars = anigram.avatars // avatars
let boform = payload.boform, // boform
ric = payload.ric, // ric
tim = payload.tim, // tim
vim = payload.vim, // vim
proform = payload.proform, // proform
conform = payload.conform, // conform
uid = payload.uid, // uid
parentuid = payload.parentuid // parentuid
// get GEOFORM FeatureCollection
//
let gjcollection = f.v(geofold, anigram) // get geoform
if (2 && 2 && gjcollection.type !== 'FeatureCollection') console.log('** gjcollection is not FeatureCollection', gjcollection)
gjcollection = mgeoj.zorder(gjcollection) // order features in collection
gjcollection = mric.enric(ric, anigram, gjcollection) // ric to feature or collection
newAnigrams = gjcollection.features.map((feature, i) => {
feature = mboform.boformer(anigram, feature)
feature.properties.tim = tim // tim in geofold
feature.properties.vim = vim // vim in geofold to render
feature.properties.sort = feature.properties.sort || 'feature' // svg sort
let newAnigram = {
halo: halo, // inherit halo
geofold: feature, // inherit geofold
payload: { // payload is lost in m.animation before rendering
ric: feature.properties.ric, // hoist ric
id: feature.properties.uid, // hoist uid
uid: feature.properties.uid // hoist uid
},
avatars: avatars // inherit avatars
}
return newAnigram
})
return newAnigrams // new anigrams are stored by m.animation
}
// ............................. enty
let haloGeofold_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloGeofold_gramm = anima => gramm(anima)
let haloFormed = {}
haloFormed.ween = anima => haloGeofold_ween(anima)
haloFormed.gramm = anima => haloGeofold_gramm(anima)
let enty = haloFormed
return enty
}
exports.haloFormed = haloFormed
}))
/****************************
* @haloFourier
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloFourier = global.haloFourier || {})))
}(this, function (exports) {
'use strict'
let haloFourier = function haloFourier (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mstore = __mapper('xs').m('store'),
mric = __mapper('xs').m('ric'),
mgeoj = __mapper('xs').m('geoj')
//md: ## h.fourier
//md: h.fourier anigrams per frequency cycloid
//md: cycloids in payload.fourier.transforms resulting from m.fourier.complexify
//md: anigrams turned to h.ent
//md: ### h.fourier.gramm
//md: payload.fourier.transforms, gj featurized, complexified, ntimed
//md: payload.fourier.maglast pencil radio
//md: payload.fourier.interval [0,1] delete anigrams outside
//md: payload.fourier.tolerance 1 remove sinusoids below
//md: payload.fourier.dotboform style of pencil dot
//md: payload.fourier.avatars.fourierPacer form trace
//md: payload.fourier.avatars.line sinusoid ray
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
geofold = anigram.geofold // geofold
let payload = anigram.payload, // payload
ric = payload.ric, // ric
tim = payload.tim, // tim
parentuid = payload.parentuid, // parentuid
fourier = payload.fourier,
boform = payload.boform
let path = fourier.path,
transforms = fourier.transforms,
maglast = fourier.maglast || 3, // pencil radio
interval = fourier.interval || [0,1], // fourier.period
tolerance = fourier.tolerance || 0.5
transforms = geofold.features //
//md: time in period is (t - t0) / (t1 - t0), with t unit time
let t = tim.unitTime // time % period; i,[0,vertices] => t,[0,T]
let t0 = interval[0],
t1 = interval[1],
period = t1 - t0,
tRelToPeriod = (t - t0) / period, // time relative to interval
tInPeriod = (t < interval[0] || t > interval[1]) ? 0 : 1, // time in of interval
tNotInPeriod = (t < interval[0] || t > interval[1]) ? 1 : 0 // time out of interval
//md: fidder(j,i) per feature and sinusoid
let fidder = (d,i,j) => d + '_' + i + '_' + j
//md: features are rendered simultaneously on time period
let anitems = []
for (let j=0; j<transforms.length; j++) { // FOR EACH FEATURE in time
let tfeature = transforms[j]
let coordinates = tfeature.geometry.coordinates //
var N = coordinates.length // number of fequencies
var nyquist = Math.floor (N / 2) // nyquist frequency
var w = 0 // frequency associated to cycloid index (for sorted)
let transformSorted = coordinates.slice() // sort coordinates coefs by norm
.map( (d,i) => Object.assign(d, {w:i})) // frequency on index
.filter(d => Complex(d).abs() / N > tolerance) // filter per amplitude
.sort((a,b) => Complex(b).abs() - Complex(a).abs()) // sort per amplitude
let M = transformSorted.length
var acci = Complex (0, 0) // summatory
let xn = [], yn = [], magn = [], iAnitems = []
for (let i = 0; i <= M; i++) { // FOR EACH sinusoid, new anitem
let gid = ric.gid // from ava ric
let cid = ric.cid
let fid = fidder(ric.fid, j, i)
//md: del item outside time period (ric.delled = 1)
let _ric = {gid, cid, fid, delled:tNotInPeriod} // is DELLED ?
let uid = mric.getuid(_ric) // uid
let newItem = f.cloneObj(anigram)
newItem.geofold =
// tfeature
{
type: 'Feature',
geometry: { type: 'Point', coordinates: [] },
properties: {
pointRadius: 1, // d.payload.fourier.rad,
geonode: {
type: 'Feature',
geometry: { type: 'Point', coordinates: [0,0] },
properties: { // geofold coindices with geonode
orgen: [0,0],velin: [0, 0],velang: [0, 0],prevous: [0, 0],geodelta: [0, 0]
}
},
}
}
newItem.halo = 'ent' // halo.ent
if (i < M) { // for each cycloid
//md: beyond nyquist w frequency is aliased by -N
if (transformSorted[i].w >= nyquist) transformSorted[i].w -= N // nyquist
//md: sinusoid is Sum( Xi * e^i2[pi]w[i]n/N )
//md: The sinusoid's frequency is w cycles per N samples
let phasei = Complex (0, 2 * Math.PI * transformSorted[i].w * tRelToPeriod)
let unitRooti = phasei.exp() // complex sinusoidal component e^i2[pi]w[i]n/N
let ci = unitRooti.mul(transformSorted[i]) // Xi * root(i)
acci = acci.add(ci) // add component
xn[i] = transformSorted[i].re
yn[i] = transformSorted[i].im
magn[i] = Math.sqrt (xn[i] * xn[i] + yn[i]* yn[i]) // amplitude of frequency
newItem.geofold.properties.pointRadius = magn[i] / N // sinusoid amplitude
if (i > 0) { // add ray avatar
let avaLine = f.cloneObj(payload.fourier.avatars.line)
avaLine.geofold.geometry.coordinates = [
[acci.re / N, acci.im / N], // from this cycloid
[xn[i-1], yn[i-1]] // to prevous cycloid
]
let gid = avaLine.payload.ric.gid // from ava ric
let cid = avaLine.payload.ric.cid
let fid = fidder(avaLine.payload.ric.fid, j, i)
//md: del item outside time period (ric.delled = 1)
let _ric = {gid, cid, fid, delled:tNotInPeriod} // is DELLED ?
let uid = mric.getuid(_ric) // uid
avaLine.payload.ric = _ric
newItem.avatars = Array.of(avaLine)
}
}
xn[i] = acci.re / N // averate the summatory
yn[i] = acci.im / N
//md: add pencil on last sinusoid and pacer avatar
if (i === M) {
newItem.geofold.properties.pointRadius = maglast // PENCIL radio magnitude of last
let a = f.cloneObj(payload.fourier.avatars.fourierPacer) // PACER
if (a) { // if pacer avatar
//md: no add segments ourside time period (pacer.autoN = 0)
if (tNotInPeriod) a.payload.pacer.autoN = 0 // add no segments ourside period
let gid = a.payload.ric.gid // from ava ric
let cid = a.payload.ric.cid
let fid = fidder(a.payload.ric.fid, j, i)
let _ric = {gid, cid, fid}
let uid = mric.getuid(_ric)
a.payload.ric = _ric
a.payload.uid = uid
newItem.avatars = Array.of(a)
}
}
newItem.payload.tim = tim // tim
newItem.payload.ric = _ric // ric
newItem.payload.uid = uid // uid
newItem.payload.boform = boform // boform
newItem.geofold.geometry.coordinates = [xn[i], yn[i]]
newItem.geofold.properties.geonode.geometry.coordinates = [xn[i], yn[i]]
newItem.geofold.properties.geonode.properties.orgen = [xn[i], yn[i]]
iAnitems[i] = newItem
}
//md: each point/circle anigram has radius of next sinusoid amplitude
for (let i = 0; i < iAnitems.length - 1; i++) { // for each anitem
let pointRadius = iAnitems[i].geofold.properties.pointRadius
let nextPointRadius = iAnitems[i+1].geofold.properties.pointRadius
iAnitems[i].geofold.properties.pointRadius = nextPointRadius
}
anitems = [...anitems, ...iAnitems]
}
for (let i=0; i<anitems.length; i++) {
newAnigrams = [...newAnigrams, ...__mapper('xs').h('ent').gramm(anitems[i])]
}
return newAnigrams
}
/****************************
* @enty
*/
let haloNat_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloNat_gramm = anima => gramm(anima)
let haloFourier = {}
haloFourier.ween = anima => haloNat_ween(anima)
haloFourier.gramm = anima => {
let r = haloNat_gramm(anima)
return r
}
let enty = haloFourier
return enty
}
exports.haloFourier = haloFourier
}))
/****************************
* @haloFractal
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloFractal = global.haloFractal || {})))
}(this, function (exports) {
'use strict'
// md: {filenam}
let haloFractal = function haloFractal (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mnat = __mapper('xs').m('nat'),
mric = __mapper('xs').m('ric'),
msnap = __mapper('xs').m('snap')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
const pi = Math.PI, pi2 = 2 * pi,
turn = 2 * Math.PI,
tau = 2 * Math.PI
// md: gramm
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
geofold = anigram.geofold // geofold
let payload = anigram.payload, // payload
tim = payload.tim,
fractal = payload.fractal
let name = fractal.name,
fidder = fractal.fidder,
level = (fractal.level !== undefined) ? Math.floor(fractal.level) : 2,
cfi = fractal.cf, // cf color onlevel
sides = fractal.sides || 5,
rad0 = fractal.rad0 || 90,
pencilRadius = fractal.pencilRadius || 2
let t = tim.unitPassed // unitElapsed
let fractalZcoef = fractal.zcoef || function (idx, arr) {
return Complex({
re: arr[idx].rad * Math.cos(arr[idx].ang),
im: arr[idx].rad * Math.sin(arr[idx].ang)
})
}
let fractalRad = fractal.rad || function (idx, arr) { return rad0 / Math.pow(2, idx) }
let fractalAng = fractal.ang || function (idx, arr) {
return (level === 0)
? [[[ 0, tau * 1 ]]] // begin phase
: [[[ 0, (-1) ** (idx) * (sides - 1) ** (idx) * tau * 1]]]
}
let fractalDelta = fractal.zdelta || function (idx, arr) { return Complex({re: 0, im: 0}) }
//md: rad and ang are time dependent functions
let harmonics = [] // fourier components [0,level-1]
for (let j = 0; j < level; j++) { // for j in [0, i)
let rad = msnap(fractalRad(j, rad0, sides), t) // amp time dependent
let ang = msnap(fractalAng(j, sides), t) // phase time dependent
harmonics[j] = {rad, ang }
}
// md: define cycloids aggregate components [0,level]
let anitems = []
for (let i = 0; i <= level; i++) { // for LEVEL i in [0, level-1]
let newAnitem = f.cloneObj(anitems[i - 1] || anigram) // anitems h.nat
newAnitem.halo = 'ent' // halo
newAnitem.payload = newAnitem.payload || {}
newAnitem.avatars = newAnitem.avatars || []
let ric = f.clone(anigram.payload.ric)
if (ric.fid !== undefined) { // ric.fid = ric.fid
} else if (fidder !== undefined) { ric.fid = fidder(ric.fid, i)
} else if (name !== undefined) { ric.fid = name + '_' + i
} else { ric.fid = 'fractal' + '_' + i
}
newAnitem.payload.ric = ric // ric
newAnitem.payload.uid = mric.getuid(newAnitem.payload.ric) // uid
newAnitem.payload.id = newAnitem.payload.uid // id
if (cfi !== undefined) newAnitem.payload.boform.cf = cfi(i) // boform
let coef = Complex({re: 0, im: 0}) // location
for (let k = 0; k < i; k++) {
coef = coef.add(fractalZcoef(k, harmonics))
}
let sinusLocation = coef.toVector() // location
let sinusRad = pencilRadius // initialize rad with pencil radius
if (i<level) {
sinusRad = harmonics[i].rad // get rad from harmonic
}
newAnitem.geofold = {
type: 'Feature',
geometry: {type: 'Point', coordinates: sinusLocation },
properties: { // set properties from anigram payload
pointRadius: sinusRad, // applies to type Point
geonode: {
type: 'Feature',
geometry: {type: 'Point', coordinates: [0, 0]},
properties: {
orgen: [0, 0], velin: [0, 0], velang: [0, 0], prevous: [0, 0], geodelta: [0, 0]
}
}
}
}
if (i === level) { // add trace avatars to pencil
if (newAnitem.payload.fractal.traceLine !== undefined) {
newAnitem.avatars.push(newAnitem.payload.fractal.traceLine)
}
}
anitems[i] = newAnitem
}
if (fractal.rayLine !== undefined) {
for (let i = 0; i < level; i++) {
let newAnitem = anitems[i]
let rayLine = f.clone(fractal.rayLine)
let ric = f.clone(rayLine.payload.ric)
if (ric.fid !== undefined) { // ric.fid = ric.fid
} else if (fidder !== undefined) { ric.fid = fidder(ric.fid, i)
} else if (name !== undefined) { ric.fid = name + '_' + i
} else { ric.fid = 'fractal' + '_' + i
}
rayLine.payload.ric = ric // ric
rayLine.payload.uid = mric.getuid(newAnitem.payload.ric) // uid
rayLine.payload.id = rayLine.payload.uid // id
rayLine.geofold.geometry.coordinates = [
anitems[i].geofold.geometry.coordinates,
anitems[i + 1].geofold.geometry.coordinates
]
anitems[i].avatars.push(rayLine)
}
}
for (let i = 0; i < anitems.length; i++) { // ent will ereform, proform
newAnigrams = [...newAnigrams, ...__mapper('xs').h('ent').gramm(anitems[i])]
}
return newAnigrams
}
/****************************
* @enty
*/
let haloNat_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloNat_gramm = anima => gramm(anima)
let haloFractal = {}
haloFractal.ween = anima => haloNat_ween(anima)
haloFractal.gramm = anima => {
let r = haloNat_gramm(anima)
return r
}
let enty = haloFractal
return enty
}
exports.haloFractal = haloFractal
}))
/***********
* @haloFuel
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloFuel = global.haloFuel || {})))
}(this, function (exports) {
'use strict'
let haloFuel = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mstore = __mapper('xs').m('store'),
mquad = __mapper('xs').m('quad'),
mgeom = __mapper('xs').m('geom'),
mgeoj = __mapper('xs').m('geoj')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let state = {}
state.items = [] // fuel particles
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
geofold = anigram.geofold // geofold
let payload = anigram.payload, // payload
boform = payload.boform, // boform
ric = payload.ric, // ric
tim = payload.tim, // tim
proform = payload.proform, // proform
conform = payload.conform, // conform
uid = payload.uid, // uid
parentuid = payload.parentuid // parentuid
let fuel = payload.fuel,
ra2 = fuel.ra2,
candidates = fuel.candidates,
sample = fuel.sample
let polygon
let parentAnigram = mstore.findAnigramFromUid(parentuid)
if (parentAnigram) {
let geometry = parentAnigram.geofold.geometry
if (!mgeoj.isValid(geometry)) { console.error("h.ent:gj not valid", geometry)}
polygon = mgeoj.getCoords(geometry) // outer ring
} else {
polygon = mgeom.extentPolygon([[0, 0], [width, height]]) // viewport
}
let foundcandies = mquad.candysearch(ra2, polygon, candidates, sample) // candies
let remainCandies = []
if (fuel.f === 3) { // 3 - old and new all time _e_
remainCandies = state.items
remainCandies = [...remaincandies, ...foundcandies]
} else if (fuel.f === 2) { // 2 - just new _e_
remainCandies = foundcandies
} else { // 1 - old and new in polygon
remainCandies = state.items.filter(c => d3.polygonContains(polygon, c))
remainCandies = [...remainCandies, ...foundcandies]
}
for (let i = 0; i < remainCandies.length; i++) { // for each candy ...
let idx = i
let gid = ric.gid // from ava ric
let cid = ric.cid
let fid = (ric.fid === undefined) ? ric.cid + '_' + idx : ric.fid
let _ric = {gid, cid, fid}
let _proform = { // proform each candy
'projection': 'uniwen',
'translate': remainCandies[i] // translate each candy to candy location
}
let newAnigram = {} // new anigram per fuel nat
newAnigram.halo = 'nat'
newAnigram.geofold = geofold
newAnigram.payload = payload
newAnigram.payload.ric = _ric // identify each fuel nat
newAnigram.payload.proform = _proform // proform of each fuel nat
let avaAnigrams = __mapper('xs').h('nat').gramm(newAnigram)
newAnigrams = [...newAnigrams, ...avaAnigrams]
}
return newAnigrams
}
/***************************
* @enty
*/
let haloFuel = {}
haloFuel.ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = 1, [anima]) : []
haloFuel.gramm = anima => gramm(anima)
let enty = haloFuel
return enty
}
exports.haloFuel = haloFuel
}))
/***********
* @haloImg
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloImg = global.haloImg || {})))
}(this, function (exports) {
'use strict'
let haloImg = function haloImg (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mgeoj = __mapper('xs').m('geoj'),
mprofier = __mapper('xs').m('profier'),
mboform = __mapper('xs').m('boform'),
mric = __mapper('xs').m('ric'),
mstace = __mapper('xs').m('stace')
let _geofold = p => ({ // geofold
type: 'Feature',
geometry: { type: 'Point', coordinates: [0, 0] },
properties: {
sort: 'img',
attr: {
'width': p.payload.img.style.width,
'height': p.payload.img.style.height,
'rotate': p.payload.img.style.rotate,
'xlink:href': p.payload.img.url
}
}
})
let gramm = function gramm (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(),
halo = anigram.halo, // halo
payload = anigram.payload // payload
let geofold = _geofold(anigram) // geofold
let newAnigram = {
halo,
geofold,
payload
}
newAnigrams = [...newAnigrams, ...__mapper('xs').h('ent').gramm(newAnigram)]
return newAnigrams
}
/***************************
* @enty
*/
let enty = function () {}
enty.ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = 1, [anima]) : []
enty.gramm = anima => gramm(anima)
return enty
}
exports.haloImg = haloImg
}))
/****************************
* @haloNat
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloNat = global.haloNat || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **expose nat form**
// md: h.ent with anima.geofold : `mnat.natFeature(p.payload.form)`
// md:
// md: # license
// md: MIT
let haloNat = function haloNat (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mnat = __mapper('xs').m('nat')
// .................... gramm
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram() // anigram
anigram.halo = 'ent' // halo
// anigram.geofold = p => mnat.closeFeature(mnat.natFeature(p.payload.form))
anigram.geofold = p => mnat.natFeature(p.payload.form)
newAnigrams = __mapper('xs').h('ent').gramm(anigram)
return newAnigrams
}
// .................... enty
let haloNat_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloNat_gramm = anima => gramm(anima)
let haloNat = {}
haloNat.ween = anima => haloNat_ween(anima)
haloNat.gramm = anima => haloNat_gramm(anima)
let enty = haloNat
return enty
}
exports.haloNat = haloNat
}))
/* *********************
* @haloNumform
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloNumform = global.haloNumform || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **expose numform halo**
// md:
// md:
// md: # license
// md: MIT
let haloNumform = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mstore = __mapper('xs').m('store'),
mgeoj = __mapper('xs').m('geoj')
// .................. _geofolder
let _geofolder = function (ani, prob) { // geofold
let textform = ani.payload.textform // needs text
return {
type: 'Feature',
geometry: { type: 'Point', coordinates: [0, 0] },
properties: {
sort: 'text',
}
}
}
// ............................. _stacer
let _stacer = {
autoSitus: function(ani) {
return mstace.getLocus(ani.payload.pacer.stace, ani)
},
initSitus: function(ani) {
return {x: 0, y: 0, z: 0 }
},
eventSitus: function(ani) {
return {x: crayder.pointer().x, y: crayder.pointer().y, z: 0 }
}
}
// .................. gramm
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
geofold = anigram.geofold // geofold
let payload = anigram.payload, // payload
ric = payload.ric, // ric
parentuid = payload.parentuid, // parentuid
numform = payload.numform || {}
// stacefy the numform location
let stacer = Object.assign({}, payload.pacer.stacer , _stacer)
let situs = stacer.autoSitus(anigram)
let parentCoords
let parentAnigram = mstore.findAnigramFromUid(parentuid)
if (parentAnigram) {
let geometry = parentAnigram.geofold.geometry
if (!mgeoj.isValid(geometry)) { console.error('** h.ent:gj not valid', geometry) }
parentCoords = mgeoj.getCoords(geometry) // outer ring
}
let locations = []
if (numform.pos !== undefined && parentCoords !== undefined) {
if (Array.isArray(numform.pos)) { // pos is array
locations = d3.range(numform.pos[0], numform.pos[1], numform.step)
.map(d => d % parentCoords.length) // mod
} else if (typeof (numform.pos) === 'number') { // one position
locations = [Math.floor(numform.pos % parentCoords.length)]
}
}
for (let i = 0; i < locations.length; i++) {
let idx = i
let gid = ric.gid // from ava ric
let cid = ric.cid
let fid = (ric.fid === undefined) ? ric.cid + '_' + idx : ric.fid
let _ric = {gid, cid, fid}
let _proform = { // proform each candy
'projection': 'uniwen',
'translate': parentCoords[locations[i]] // translate each candy to candy location
}
let _geoform = function (p) { // geofold
anima.geofold = _geoform
anima.payload.proform = _proform
newAnigrams = [...newAnigrams, ...__mapper('xs').h('ent').gramm(anima)]
}
return newAnigrams
}
}
// .................. enty
let haloNumform = {}
haloNumform.ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = 1, [anima]) : []
haloNumform.gramm = anima => gramm(anima)
let enty = haloNumform
return enty
}
exports.haloNumform = haloNumform
}))
/**********************
* @haloPacer
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloPacer = global.haloPacer || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **create new items at init, on auto or upon event**
// md:
// md: ### functions
// md:
// md: * ##### _geojsor
// md: usage: `_geojsor(@ani, @prob`
// md: ani.pacer.initN
// md: ani.pacer.eventN
// md: ani.pacer.autoN
// md: ani.pacer.autoP
// md: ani.pacer.outtimed
// md: ani.pacer.maxN
// md: ani.pacer.span
// md: ani.pacer.aad: {0,1} if 1, pace items are added to pacer (eg. LineString trace)
// md: ani.pacer.type: {LineString}
// md: ani.pacer.base: {geo, ere, pro}
// md:
// md:
// md: ### methods
// md:
// md: * ##### gramm
// md: `@a.p.pacer.initSitus` : situs for init items
// md: `@a.p.pacer.autoSitus` : situs for auto items, calls `m.stace.getLocus(this.stace, ani)`
// md: usage: `payload.pacer.autoSitus(anigram)`
// md: autositus in zindex: `function(a) {return mstace.getLocus(this.stace, ani) }` gets `ani.p.pacer.stance`
// md: auto time is `a.p.tim.unitPassed - a.p.pacer.outed`
// md: `@a.p.pacer.eventSitus` : situs for event items
// md: `count` new items to pacer from init, auto and event
// md:
// md: `@a.p.pacer.fidder` : new item `fid` identifier
// md: `@a.p.pacer.geojsor(@anigram, @counter)` : gets new item
// md:
// md: ## license
// md: MIT
let haloPacer = function haloPacer (__mapper = {}) {
let f = __mapper('xs').m('props'),
mgeom = __mapper('xs').m('geom'),
mwen = __mapper('xs').m('wen'),
crayder = __mapper('xs').c('rayder'),
cwen = __mapper('xs').c('wen'),
cversor = __mapper('xs').c('versor'),
mstace = __mapper('xs').m('stace'),
manitem = __mapper('xs').m('anitem'),
mric = __mapper('xs').m('ric'),
mstore = __mapper('xs').m('store'),
hent = __mapper('xs').h('ent')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
// ............................. _geofolder
let _geofolder = function (ani, prob) {
let pacerPayload = ani.payload.pacer
let geoType = pacerPayload.type || 'LineString',
base = pacerPayload.base || 'geo'
let geofold = {
type: 'Feature',
geometry: { type: geoType, coordinates: null },
properties: {}
}
let ric = ani.payload.ric
let uid = mric.getuid(ric)
let anitem = mstore.findAnigramFromUid(uid)
if (anitem !== undefined && anitem.geofold !== undefined) {
geofold = anitem.geofold
if (base === 'geo') {
if (geofold.properties.formGeoformed) { // revert geometry to formGeoformed
geofold.geometry = geofold.properties.formGeoformed.geometry
}
} else if (base === 'ere') {
if (geofold.properties.formEreformed) { // revert geometry to formEreformed
geofold.geometry = geofold.properties.formEreformed.geometry
}
} else if (base === 'pro') {
if (geofold.properties.formProformed) { // revert geometry to formProformed
geofold.geometry = geofold.properties.formProformed.geometry
}
} else {
if (geofold.properties.formGeoformed) { // revert geometry to formGeoformed
geofold.geometry = geofold.properties.formGeoformed.geometry
}
}
}
return geofold
}
// ............................. _stacer
let _stacer = {
autoSitus: function (ani) {
return mstace.getLocus(ani.payload.pacer.stace, ani)
},
initSitus: function (ani) {
return {x: 0, y: 0, z: 0 }
},
eventSitus: function (ani) {
return {x: crayder.pointer().x, y: crayder.pointer().y, z: 0 }
}
}
// ............................. ween
let haloPacerHalo_ween = anima => []
// ............................. gramm
let haloPacerHalo_gramm = function (anima, newItems = []) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
payload = anigram.payload, // payload
boform = payload.boform, // boform
ric = payload.ric, // ric
tim = payload.tim, // tim
proform = payload.proform, // proform
conform = payload.conform, // conform
uid = payload.uid, // uid
parentuid = payload.parentuid // parentuid
let pacer = payload.pacer || {}, // pacer
mousesignal = pacer.mousesignal || 0, // mousesignal
span = pacer.span || 0, // span between items
aad = pacer.aad || 0, // aad to previtem
outted = pacer.outted || 0 // outted
let count = {} // count: items in cycle
// pacer interfaces
let geofolder = payload.pacer.geofolder || _geofolder
let stacer = Object.assign({}, payload.pacer.stacer, _stacer)
let riccer = payload.pacer.riccer || function (ani) { return ani.payload.ric }
// event
if (crayder.mouse() && crayder.mouse().type === 'mouseup') { // if mouse up then reset
let svg = __mapper('renderSvg').svg()
cwen.reset(svg)
cversor.reset(svg)
}
if ((crayder.mouse() !== undefined && crayder.mouseDown() === 1) ||
(crayder.touch() !== undefined && crayder.touchStart() === 1)) { // on mouse DOWN
if (mousesignal === 0 || crayder.mouse().type === 'mousedown') { //
count.event = Math.floor(pacer.eventN) // if in state or was event
}
}
// init
if (pacer.inited === undefined || pacer.inited !== 1) {
count.init = Math.floor(pacer.initN) // count INIT
}
// auto
let cycletime = tim.unitPassed - (pacer.outed || 0)
if (cycletime >= pacer.autoP &&
tim.unitPassed > (pacer.autoT || 0)
) { // if cycle time above autopath
count.auto = Math.floor(pacer.autoN) // count AUTO
anima.payload.inited = 1 // inited
anima.payload.pacer.outed = tim.unitPassed // updated with anima
let animas = Array.of(anima) // upd ANIMA
// mstore.apply({'type': 'UPDANIMA', 'caller': 'h.pacer', animas})
mstore.apply({'type': 'UPDANIGRAM', 'caller': 'h.pacer', animas})
}
if (Object.keys(count).length > 0) { // on pace count
let stace // situs of new anitem dependent on kind
for (let counter = 0; counter < Object.keys(count).length; counter++) { // in count
let key = Object.keys(count)[counter] // count sort
if (count[key] > 0) { // if count on this sort
if (key === 'init') {
stace = stacer.initSitus(anigram) // INIT
} else if (key === 'auto') {
stace = stacer.autoSitus(anigram) // AUTO
} else if (key === 'event') {
stace = stacer.eventSitus(anigram) // EVENT
}
let situs = mstace.getLocus(stace, anima)
if (situs && typeof situs === 'object') situs = Object.values(situs)
let _ric = ric
_ric = riccer(anigram)
let uid = mric.getuid(_ric) // uid
let newItem = {}
newItem.halo = halo
newItem.geofold = geofolder(anigram)
newItem.payload = Object.assign({}, newItem.payload, anigram.payload) // newItem.payload
if (aad) { // if aad, add to LineString
// add situs to newItem coords
// coords are final space coords (after h.ent, stored at m.animation)
let coords = newItem.geofold.geometry.coordinates // domain coords
let geocoords = newItem.geofold.properties.geocoords // pre coords
if (coords && coords.length > 0) {
let presitus = coords[coords.length - 1] // last point in paced string
let d = mgeom.distance3d(presitus, situs) // distance to new coord
if (d >= span) {
coords.push(situs) // if beyond span ADD SITUS to LineString
}
} else {
coords = Array.of(situs) // coords start with first situs
}
newItem.geofold.geometry.coordinates = coords // upd coords
newItem.geofold.properties.geocoords = geocoords
let newItemsInCount = hent.gramm(newItem) // h.ent newItem
newItems = [...newItems, ...newItemsInCount] // add new items
} else { // if NOT aad
if (newItem.geofold && newItem.geofold.geometry.type === 'Point') { // POINT
let presitus = newItem.geofold.geometry.coordinates
if (presitus !== null) { // if paced item DOES exist
let d = mgeom.distance3d(presitus, situs) // distance from previous situs
if (d >= span) { // if distance from previous point greater than span
newItem.geofold.geometry.coordinates = [0, 0, 0]
newItem.payload.proform = {projection: 'uniwen', translate: situs } // proform
let newAnigrams = hent.gramm(newItem) // process newItem as h.ent
newItems = [...newItems, ...newAnigrams] // add new anigrams
}
} else { // paced item NOT exists
newItem.geofold.geometry.coordinates = [0, 0, 0]
newItem.payload.proform = {projection: 'uniwen', translate: situs} // proform
let newGrams = hent.gramm(newItem)
newItems = [...newItems, ...newGrams] // add items
}
} else { // ..... else TRACE NAT
let halo = newItem.halo
newItem.payload.proform = { projection: 'uniwen', translate: situs } // // transfer trace situs to halo through proform
let newGrams = __mapper('xs').h(halo).gramm(newItem)
newItems = [...newItems, ...newGrams] // add items
}
}
}
}
}
return newItems
}
let haloPacerHalo = function () {}
haloPacerHalo.ween = anima => haloPacerHalo_ween(anima)
haloPacerHalo.gramm = anima => haloPacerHalo_gramm(anima)
// ....................... enty
let enty = haloPacerHalo
return enty
}
exports.haloPacer = haloPacer
}))
/****************************
* @haloQuadric
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloQuadric = global.haloQuadric || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **expose nat form**
// md: h.ent with anima.geofold : `mnat.natFeature(p.payload.form)`
// md:
// md: # license
// md: MIT
let haloQuadric = function haloQuadric (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mnat = __mapper('xs').m('nat')
let pow = Math.pow
let functor = d => Array.isArray(d) ? d : Array.of(d)
let ft = p => a => p.reduce( (acc,cur,i) => acc + cur * pow(a,i) , 0)
let fn = form => // form has defined a1, a2, a3, a4 , q1, q2, q3, q4
(q=0,s=0,u=0,v=0,a=1,b=1,c=1,d=1) => {
let ret = ft(functor(form.c1))(a) * ft(functor(form.e1))(q) *
ft(functor(form.c2))(b) * ft(functor(form.e2))(s) *
ft(functor(form.c3))(c) * ft(functor(form.e3))(u) *
ft(functor(form.c4))(d) * ft(functor(form.e4))(v)
return ret
}
// .................... gramm
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram() // anigram
let form = anigram.payload.form
if (form !== undefined && typeof form === 'object') {
let entries = Object.entries(form)
for (let i=0; i < entries.length; i++) {
let entry = entries[i]
let dax = entry[0]
let formDax = entry[1]
if (formDax.fn0 === undefined && (
formDax.e1 !== undefined ||
formDax.e2 !== undefined ||
formDax.e3 !== undefined ||
formDax.e4 !== undefined ||
formDax.c1 !== undefined ||
formDax.c2 !== undefined ||
formDax.c3 !== undefined ||
formDax.c4 !== undefined )) {
formDax.e1 = (formDax.e1 === undefined) ? functor(1) : functor(formDax.e1)
formDax.e2 = (formDax.e2 === undefined) ? functor(1) : functor(formDax.e2)
formDax.e3 = (formDax.e3 === undefined) ? functor(1) : functor(formDax.e3)
formDax.e4 = (formDax.e4 === undefined) ? functor(1) : functor(formDax.e4)
formDax.c1 = (formDax.c1 === undefined) ? 1 : formDax.c1
formDax.c2 = (formDax.c2 === undefined) ? 1 : formDax.c2
formDax.c3 = (formDax.c3 === undefined) ? 1 : formDax.c3
formDax.c4 = (formDax.c4 === undefined) ? 1 : formDax.c4
formDax.fn0 = fn(formDax)
} else {
// let default to h.nat
}
}
}
anigram.halo = 'nat' // halo
anigram.payload.form = form // fn0
newAnigrams = __mapper('xs').h('nat').gramm(anigram)
return newAnigrams
}
// .................... enty
let haloNat_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloNat_gramm = anima => gramm(anima)
let haloQuadric = {}
haloQuadric.ween = anima => haloNat_ween(anima)
haloQuadric.gramm = anima => haloNat_gramm(anima)
let enty = haloQuadric
return enty
}
exports.haloQuadric = haloQuadric
}))
/*******************************************
* @haloScene
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloScene = global.haloScene || {})))
}(this, function (exports) {
'use strict'
let haloScene = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
minit = __mapper('xs').m('init')
let ween = function (anima, newAnimas = []) {
let p = anima.payload.context
minit.setContext(p)
newAnimas = Array.of(anima)
return newAnimas
}
// .................... enty
let haloNat_ween = anima => ween(anima)
let haloNat_gramm = anima => anima
let haloNat = {
ween: anima => haloNat_ween(anima),
gramm: anima => haloNat_gramm(anima)
}
let enty = haloNat
return enty
}
exports.haloScene = haloScene
}))
/***********
* @haloTextform
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.haloTextform = global.haloTextform || {})))
}(this, function (exports) {
'use strict'
//md: # md:{filename}
//md: process text anitems
//md: ## functions
//md: * [_geofold](#_geofold) - uploads payload text form to geofold properties
//md:
//md:
//md: ## methods
//md: * [ween](#ween) - process anima
//md: * [gramm](#gramm) - process anigram
//md: buils the newitem geoform and pass it to h.ent
//md:
//md: # license
//md: MIT
let haloTextform = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mgeoj = __mapper('xs').m('geoj'),
mprofier = __mapper('xs').m('profier'),
mboform = __mapper('xs').m('boform'),
mric = __mapper('xs').m('ric'),
mstace = __mapper('xs').m('stace')
// .................. _geofold
let _geofold = function (ani) { // geofold
let textform = ani.payload.textform // needs text
return {
type: 'Feature',
geometry: { type: 'Point', coordinates: [0, 0] },
properties: {
sort: 'text',
string: textform.string || '',
style: {
'rotate': textform.style['rotate'],
'font-size': textform.style['font-size'],
'font-family': textform.style['font-family'],
'text-anchor': textform.style['text-anchor'],
'width': textform.style.width,
'height': textform.style.height,
'dx': textform.style.dx,
'dy': textform.style.dy,
'textLength': textform.style.textLength,
'lengthAdjust': textform.style.lengthAdjust
}
}
}
}
// .................. gramm
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(),
halo = anigram.halo,
payload = anigram.payload
let geofold = _geofold(anigram) // geofold
let newAnigram = {
halo,
geofold,
payload
}
newAnigrams = [...newAnigrams, ...__mapper('xs').h('ent').gramm(newAnigram)]
return newAnigrams
}
// .................. enty
let haloTextform_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloTextform_gramm = anima => gramm(anima)
let haloTextform = {}
haloTextform.ween = anima => haloTextform_ween(anima)
haloTextform.gramm = anima => haloTextform_gramm(anima)
let enty = haloTextform
return enty
}
exports.haloTextform = haloTextform
}))
/**********************
* @haloTiles
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.haloTiles = global.haloTiles || {})));
}(this, function (exports) { 'use strict';
// https://bl.ocks.org/mbostock/ece50c027bdf8cc20003a17d93e4f60e
// # d3.geoProject(object, projection) <>
// Projects the specified GeoJSON object using the specified projection, returning a shallow copy of the specified GeoJSON object with projected coordinates. Typically, the input coordinates are spherical and the output coordinates are planar, but the projection can also be an arbitrary geometric transformation.
// # d3.geoIdentity() <>
// The identity transform can be used to scale, translate and clip planar geometry. It implements projection.scale, projection.translate, projection.fitExtent, projection.fitSize and projection.clipExtent.
var haloTiles = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
manitem = __mapper('xs').m('anitem'),
mgeom = __mapper('xs').m('geom'),
mgeoj = __mapper('xs').m('geoj'),
mgraticule = __mapper('xs').m('graticule')
// .................... gramm
let gramm = function (anima, newAnigrams = []) {
let anigram = manitem(anima).anigram(), // anigram
halo = anigram.halo, // halo
geofold = anigram.geofold, // geofold
payload = anigram.payload, // payload
avatars = anigram.avatars // avatars
let boform = payload.boform, // boform
ric = payload.ric, // ric
tim = payload.tim, // tim
vim = payload.vim, // vim
proform = payload.proform, // proform
conform = payload.conform, // conform
uid = payload.uid, // uid
parentuid = payload.parentuid // parentuid
let gj
gj = f.v(geofold, anigram) // get geofold
gj.properties = gj.properties || {} // recall genode
gj.properties.geonode = gj.properties.geonode || {} // recall genode properties
let graticule = payload.graticule
let range = (anigram.range !== undefined ) ? anigram.range : null
let tile = (anigram.tile !== undefined ) ? anigram.tile : null
let verts = mgraticule.gvertices(graticule) // Feature.LineString
let vertices = verts.geometry.coordinates
let faces = mgraticule.gfaces(graticule) // faces
for (let i=0; i<faces.length; i++) { // each face is a single ring polygon
let idx = i
let gid = ric.gid // from ava ric
let cid = ric.cid
let fid = ric.cid + '_' + idx
let _ric = {gid, cid, fid}
let newItem = {}
newItem.halo = 'ent'
newItem.payload = Object.assign({}, anigram.payload)
newItem.payload.ric = _ric
newItem.geofold = {type: "Polygon",coordinates: []}
let face = faces[i]
let facering = [vertices[face[0]], vertices[face[1]], vertices[face[2]] ]
newItem.geofold.coordinates = Array.of([...facering, facering[0]])
let newGrams = __mapper('xs').h('ent').gramm(newItem)
newAnigrams = [...newAnigrams, ...newGrams] // add items
}
return newAnigrams
}
// .................... enty
let haloTiles_ween = anima => (anima.payload.inited !== 1) ? (anima.payload.inited = anima.payload.gelded = 1, [anima]) : []
let haloTiles_gramm = anima => gramm(anima)
let haloTiles = {}
haloTiles.ween = anima => haloTiles_ween(anima)
haloTiles.gramm = anima => haloTiles_gramm(anima)
let enty = haloTiles
return enty
}
exports.haloTiles = haloTiles
}))
<!DOCTYPE html>
<meta charset="utf-8">
<title>animas</title>
<head >
<style>
body { margin:0;position:fixed;top:0;right:0;bottom:0;left:0; }
div#fps,svg { position: fixed; top:0; left:0; color: white; }
</style>
</head>
<body style="cursor:crosshair"></body>
<div id="viewframe" class="viewframe"></div>
<!-- d3 -->
<script src='https://d3js.org/d3.v5.min.js'></script>
<script src='https://unpkg.com/d3-require@1.0.3/dist/d3-require.min.js'></script>
<script src="https://unpkg.com/d3-octree/build/d3-octree.min.js"></script>
<script src="https://unpkg.com/versor"></script> <!-- for inertia -->
<script src="https://unpkg.com/d3-inertia"></script>
<script src='https://d3js.org/d3-geo.v1.min.js'></script>
<script src='https://unpkg.com/d3-geo-voronoi@0.0.6/build/d3-geo-voronoi.min.js'></script>
<script src='https://d3js.org/d3-geo-projection.v2.min.js'></script>
<!-- <script src='https://unpkg.com/d3-geo-polygon@1.4.2/build/d3-geo-projection-clip-polyhedral.js'></script> -->
<script src='https://unpkg.com/d3-geo-polygon@1.4.2/build/d3-geo-polygon.min.js'></script>
<!-- <script src='https:////unpkg.com/d3-force-3d@1.0/build/d3-force-3d.bundle.min.js'></script> -->
<script src='https://unpkg.com/3d-force-graph@1.22.0/dist/3d-force-graph.min.js'></script>
<script src='https://unpkg.com/d3-force-3d@1.1.0/build/d3-force-3d.min.js'></script>
<script src="https://unpkg.com/d3-force-surface/dist/d3-force-surface.min.js"></script>
<script src="https://unpkg.com/d3-force-magnetic@0.8.0/dist/d3-force-magnetic.min.js"></script>
<script src="https://unpkg.com/d3-force-bounce/dist/d3-force-bounce.min.js"></script>
<script src="https://unpkg.com/d3-force-pod/dist/d3-force-pod.min.js"></script>
<!-- topojson.js -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/topojson/3.0.0/topojson.min.js'></script>
<!-- three.js -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js'></script>
<script src='https://unpkg.com/three-trackballcontrols-web@0.0.2/dist/three-trackballcontrols.min.js'></script>
<script src='https://unpkg.com/mathjs@4.0.1/dist/math.min.js'></script>
<script src='https://cdn.jsdelivr.net/npm/@turf/turf@5/turf.min.js'></script>
<!-- tensorflowjs -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.8.0"></script>
<script src="script-ents.js"></script>
<script>
// md: # md:{filename}
// md: **sine pacing graticules**
// md:
// md: # license
// md: MIT
let muonAlima = function (__mapper) {
let mgraticule = __mapper('xs').m('graticule'),
cwen = __mapper('xs').c('wen')
let renderport = __mapper('renderRenderport'),
width = renderport.width(),
height = renderport.height(),
scaleProj = Math.min(width / 2, height) / Math.PI
// .................. pics
let tim = {'td': 19800, 't0': 0, 't1': 1000, 't2': 1, 't3': 1, nostop: 1, tp: t => Math.sin((Math.PI / 2) * t)}
let form2d = {
'x': {
'm1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1, // circle
'ra2': 90, 'v0': 0, 'v1': 1, 'w4': 0, 'seg5': 8, 'pa6': 0, 'pb7': -1
},
'y': {
'm1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1, // circle
'ra2': 90, 'v0': 0, 'v1': 1, 'w4': 0, 'seg5': 8, 'pa6': 0, 'pb7': -1
}
}
let conform2d = {
projection: 'natform',
form: form2d
}
let proform2da = {
prerotate: [[[ cwen.rotation ]]],
projection: 'uniwen',
translate: [ -150, 0],
rotate: [ [[[0, 360]]], [[[0, 360]]] ],
scale: 1
}
let proform2db = {
prerotate: [[[ cwen.rotation ]]],
projection: 'uniwen',
translate: [ 150, 0],
rotate: [ 0, [[[0, 360]]], 0 ],
scale: 1
}
let form3d = {
'x': {
'm1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1, // circle
'ra2': 90, 'v0': 0, 'v1': 1, 'w4': 0, 'seg5': 8, 'pa6': 0, 'pb7': -1
},
'y': {
'm1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1, // circle
'ra2': 90, 'v0': 0, 'v1': 1, 'w4': 0, 'seg5': 8, 'pa6': 0, 'pb7': -1
},
'z': {
'm1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1, // circle
'ra2': 90, 'v0': 0, 'v1': 1, 'w4': 0, 'seg5': 4, 'pa6': 0, 'pb7': -1
}
}
let conform3d = {
projection: 'natform',
form: form3d
}
let proform3d = {
prerotate: [[[ cwen.rotation ]]],
projection: 'uniwen',
translate: [ 0, 0, 0],
rotate: [ 0, [[[0, 360]]], 0 ],
scale: 1
}
// .................. sceneForm
let sceneForm = {
halo: 'scene',
payload: {
tim: tim,
ric: {gid: 'gratiform', cid: 'gratiform', fid: 'context'},
context: {svg: 1, versor: 0, wen: 1, webgl: 0, bck: 0}
}
}
// .................. gratiform
let gratiform2da = {
halo: 'ent',
geofold: p => mgraticule.vhMultiLine(p.payload.graticule),
payload: {
tim: tim,
ric: {gid: 'gratiform', cid: 'gratiform', fid: 'gratiform2da'},
boform: { 'csx': 0, 'cf': [[[666, 555, 666]]], 'cs': [[[333, 666, 333]]], 'cw': 0.9, 'co': [[[0.09, 0.03, 0.09]]], 'cp': [[[0.9, 1.9, 0.9]]]},
conform: conform2d,
proform: proform2da,
graticule: {
frame: [ [ [-180, 180, 90, 90], [-90, 90, 45, 45] ] ] // X,Y
}
}
}
// .................. gratiform
let gratiform2db = {
halo: 'ent',
geofold: p => mgraticule.vhMultiLine(p.payload.graticule),
payload: {
tim: tim,
ric: {gid: 'gratiform', cid: 'gratiform', fid: 'gratiform2db'},
boform: { 'csx': 0, 'cf': [[[666, 555, 666]]], 'cs': [[[333, 666, 333]]], 'cw': 0.9, 'co': [[[0.09, 0.03, 0.09]]], 'cp': [[[0.9, 1.9, 0.9]]]},
conform: conform2d,
proform: proform2db,
graticule: {
frame: [ [ [-180, 180, 90, 90], [-90, 90, 45, 45] ] ] // X,Y
}
}
}
// .................. gratiform
let gratiform3d = {
halo: 'ent',
geofold: p => mgraticule.vhMultiLine(p.payload.graticule),
payload: {
tim: tim,
ric: {gid: 'gratiform', cid: 'gratiform', fid: 'gratiform3d'},
boform: { 'csx': 0, 'cf': [[[666, 555, 666]]], 'cs': [[[333, 666, 333]]], 'cw': 0.9, 'co': [[[0.09, 0.03, 0.09]]], 'cp': [[[0.9, 1.9, 0.9]]]},
conform: conform3d,
proform: proform3d,
graticule: {
frame: [ [ [-180, 180, 90, 90], [-90, 90, 45, 45] ] ] // X,Y
}
}
}
// .................. animaApi
let animas = [
sceneForm, // h.context
gratiform2da, // h.ent g.natform
gratiform3d, // h.ent g.natform
gratiform2db // h.ent g.natform
]
let animaApi = function () {
__mapper('xs').m('store').apply({'type': 'UPDANIMA', 'caller': 'alima', 'animas': animas})
}
return animaApi
}
let __mapper = muonMapper.muonMapper()
__mapper({'xs': xs.xs(__mapper)}) // PROXIES
__mapper({'muonAnimation': muonAnimation.muonAnimation(__mapper)})
__mapper({'muonAlima': muonAlima(__mapper)}).muonAlima(__mapper)
</script>
<body style="cursor:crosshair"></body>
MIT License
Copyright (c) 2016
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
/***************************
* @muonAnimas
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonAnimas = global.muonAnimas || {})))
}(this, function (exports) {
'use strict'
var muonAnimas = function () {
var state = {}
// shapes (C) 2018 Andrew Pritchard (MIT License), but rachael, rhyno
state.shapes = {
horse : "[[644.16953,950.54991],[653.49955,952.41593],[666.56158,950.54991],[675.8916,944.9518999999999],[680.5566,940.2869],[678.69058,937.48789],[673.09259,926.29188],[670.29358,913.2298499999999],[677.75759,905.76582],[679.6236,890.83781],[673.09259,865.64676],[669.36059,836.7236899999999],[669.36059,802.20265],[667.49458,777.94459],[654.43255,762.08355],[641.37053,736.89252],[637.6385200000001,725.69649],[637.6385200000001,709.83545],[642.30352,690.24242],[646.03552,666.91737],[649.76755,638.92733],[650.70055,614.66927],[648.11821,591.34422],[640.4375299999999,570.8181999999999],[633.9065199999999,557.75618],[635.7724999999999,556.82317],[643.2365399999999,562.42117],[648.8345399999998,570.8181999999999],[659.1072599999999,587.28235],[665.6285699999999,612.80328],[675.8915999999998,646.39134],[677.7575899999998,655.72136],[697.3506299999998,656.65436],[713.2116599999998,655.72136],[727.2066899999999,651.05633],[730.0056899999998,643.59233],[722.5416799999998,619.3343],[715.2943199999999,592.33384],[703.8250299999999,569.0088000000001],[688.9536199999999,552.1581600000001],[666.5615799999999,540.9621500000001],[644.1695299999999,539.09612],[622.7104899999999,544.69415],[608.7154599999999,540.9621500000001],[582.5914099999999,532.5651200000001],[551.8023699999999,526.9671000000001],[510.75027999999986,526.03411],[481.82721999999984,530.6991200000001],[451.9711599999998,535.3641300000002],[422.11510999999985,539.0961200000002],[398.79006999999984,540.0291300000001],[364.26898999999986,526.9671000000001],[339.07792999999987,511.10609000000005],[326.01590999999985,498.04407000000003],[303.62388999999985,472.85301000000004],[284.96384999999987,449.52797000000004],[261.6387999999999,422.47090000000003],[235.51474999999988,400.07889],[213.12270999999987,385.15084],[187.93165999999988,376.75381000000004],[163.6736199999999,370.22280000000006],[146.8795899999999,367.4238200000001],[133.8175699999999,353.4287700000001],[125.4205399999999,337.5677300000001],[124.1625299999999,347.0626800000001],[122.6215199999999,357.1607800000001],[117.0235099999999,345.9647600000001],[113.2914999999999,342.2327600000001],[115.1575299999999,354.3617900000001],[117.02350999999989,364.6248000000001],[102.09549999999989,369.2898100000001],[90.89946399999988,377.6868300000001],[86.23445999999988,383.2848300000001],[87.16745299999988,388.8828400000001],[79.70345699999989,399.1458500000001],[84.36844799999989,399.1458500000001],[81.56946899999988,404.7438800000001],[64.77541399999988,425.2699000000001],[52.646400999999884,437.3989400000001],[39.584381999999884,452.3269900000001],[26.522350999999887,470.05401000000006],[25.589331999999885,476.58501000000007],[25.589331999999885,486.38153000000005],[28.854839999999886,491.5130500000001],[31.653857999999886,498.51056000000005],[35.85238399999989,503.64205000000004],[40.51737499999989,507.84058000000005],[50.780388999999886,509.24008000000003],[56.378411999999884,509.24008000000003],[61.976433999999884,508.77357],[64.77541399999988,504.57507],[67.10792799999989,499.91006],[68.97393999999989,497.11105],[78.30396099999989,492.91254999999995],[91.83248199999989,487.78102999999993],[100.69596999999989,480.31701999999996],[106.29399999999988,477.05150999999995],[117.49002999999988,477.05150999999995],[130.08552999999986,475.65201999999994],[138.48255999999986,468.65450999999996],[145.94656999999987,469.121],[149.67857999999987,471.45349],[154.34359999999987,481.71653],[160.87460999999988,501.77607],[167.4056299999999,525.1011100000001],[173.9366299999999,560.0886800000001],[182.8001599999999,583.8802300000001],[186.9986599999999,593.6767400000001],[187.46514999999988,621.2002900000001],[186.9986599999999,654.3218400000001],[193.9961699999999,678.1134000000001],[210.3237099999999,701.4384500000001],[225.2517399999999,714.5004700000001],[230.3832299999999,745.28952],[233.64873999999992,778.4110800000001],[234.5817299999999,834.3912100000001],[233.64873999999992,881.5077900000001],[230.3832299999999,891.3043000000001],[225.2517399999999,905.7658200000001],[224.7852199999999,915.5623400000001],[215.9217199999999,927.2248800000001],[209.85719999999992,933.2893900000001],[209.39069999999992,937.0213900000001],[202.39319999999992,946.3514200000001],[200.06067999999993,950.08342],[203.32618999999994,953.81542],[210.79019999999994,954.28192],[220.12021999999993,953.34893],[229.91673999999992,951.94943],[234.5817299999999,950.54991],[235.9812499999999,948.21741],[236.9142499999999,946.81791],[240.1797599999999,943.5524],[239.7132499999999,939.3539000000001],[235.9812499999999,934.22238],[235.5147499999999,929.55739],[238.7802599999999,923.49287],[243.4452599999999,920.6938600000001],[249.6217599999999,917.6716200000001],[254.3623499999999,913.5669300000001],[255.9710599999999,903.48558],[255.8548499999999,880.08721],[255.1077999999999,847.4532300000001],[258.8397999999999,829.2596900000001],[263.50479999999993,812.9321500000001],[266.7702999999999,789.1406200000001],[270.5023099999999,755.0860400000001],[276.10032999999993,730.8280100000002],[284.0413899999999,717.2292700000002],[286.3493899999999,714.9880500000002],[289.16239999999993,714.0339800000002],[307.8224399999999,714.5004700000002],[336.27899999999994,714.5004700000002],[367.06803999999994,713.5674700000002],[400.6560999999999,714.5004700000002],[425.3806699999999,712.1679600000002],[449.1722099999999,707.0364700000002],[473.4302699999999,694.9074300000002],[488.3582699999999,687.4434200000002],[498.6212899999999,685.5774100000002],[513.0828399999999,678.1134000000002],[529.8768699999999,676.7138900000002],[534.0753699999999,687.4434200000002],[546.2043999999999,705.1704500000002],[559.2664199999998,731.7610000000002],[572.3284499999999,756.0190600000002],[581.1919699999999,776.5450900000002],[585.8569699999998,786.3416100000002],[589.5889699999998,803.1356400000002],[595.1869899999998,816.1976600000002],[596.5864899999998,827.8602000000002],[596.1199799999998,856.7832300000002],[595.6534899999998,876.3762600000002],[591.4549899999998,889.4382900000003],[590.9884899999998,897.8353200000003],[583.0579599999999,910.4308500000003],[576.0604499999998,922.0933600000003],[569.5294399999998,931.8898700000003],[568.1299499999998,936.5549000000003],[573.2614399999998,937.4878900000003],[587.7229799999998,937.4878900000003],[598.9189899999998,933.7558900000004],[602.6509999999997,928.6243600000004],[601.7180099999997,923.9593700000004],[600.3185099999997,915.5623400000004],[603.1174899999997,909.4978600000004],[610.5815199999997,903.8998300000004],[616.1795199999997,898.7683100000004],[616.6460499999997,887.5723100000004],[617.1125399999997,867.5127700000004],[617.1125399999997,833.4581900000004],[620.3780499999997,809.2001600000004],[623.1770499999997,787.2746100000004],[622.7105399999997,782.6096000000003],[612.4475099999997,771.8800700000004],[600.7850099999997,756.9520600000004],[594.2539999999997,742.9570300000004],[576.5269499999997,724.7634900000004],[563.9314199999997,710.3019800000004],[549.9363999999997,696.3069300000004],[570.9289499999998,719.1654700000004],[588.6559699999998,735.9595000000004],[596.5864899999998,745.7560200000004],[603.5840199999998,761.1505600000004],[617.5790399999997,777.4780800000004],[627.3755499999997,787.7411000000004],[632.0405599999998,800.8031300000005],[636.7055699999999,811.5326700000005],[646.0355899999998,825.5276800000005],[649.7675999999998,847.4532300000005],[653.4995999999998,863.3142400000005],[655.3655899999998,886.1727800000004],[655.8321199999998,899.2348200000005],[657.6980999999998,906.2323500000005],[656.7651099999998,916.0288700000004],[653.4995999999999,923.9593700000005],[651.1670899999999,931.4233800000005],[646.03559,944.0189100000006],[643.23659,946.8179100000006],[644.16958,950.5499100000005],[644.1696,950.5499100000005],[644.1695299999999,950.5499100000005]]",
basicSquare : "[[0, 0], [0, 25], [0, 50], [0, 75], [0, 100], [25, 100], [50, 100], [75, 100], [100, 100], [100, 75], [100, 50], [100, 25], [100, 0], [75, 0], [50, 0], [25, 0]]",
square : "[[0, 0], [0, 10], [0, 20], [0, 30], [0, 40], [0, 50], [0, 60], [0, 70], [0, 80], [0, 90], [0, 100], [10, 100], [20, 100], [30, 100], [40, 100], [50, 100], [60, 100], [70, 100], [80, 100], [90, 100], [100, 100], [100, 90], [100, 80], [100, 70], [100, 60], [100, 50], [100, 40], [100, 30], [100, 20], [100, 10], [100, 0], [90, 0], [80, 0], [70, 0], [60, 0], [50, 0], [40, 0], [30, 0], [20, 0], [10, 0]]",
deviatedSquare : "[[0, 0], [0, 10], [0, 20], [0, 30], [0, 40], [0, 50], [0, 60], [0, 70], [0, 80], [0, 90], [0, 100], [10, 100], [20, 100], [30, 100], [40, 100], [50, 100], [60, 100], [300, 300], [70, 100], [80, 100], [90, 100], [100, 100], [100, 90], [100, 80], [100, 70], [100, 60], [100, 50], [100, 40], [100, 30], [100, 20], [100, 10], [100, 0], [90, 0], [80, 0], [70, 0], [60, 0], [50, 0], [40, 0], [30, 0], [20, 0], [10, 0]]",
lion: "[[1021.5,582.4],[1013.7515625,551.3203125],[999.3375,533.9375],[979.2,524.7],[951.3828125,504.06875],[934.9375,465.7],[925.1,412.1],[904.7375,297.15],[891.8,268.0],[865.853125,242.19375],[828.075,222.275],[779.2,204.9],[719.75,190.5],[684.6,189.6],[558.5,185.1],[433.3,191.6],[399.4375,184.8625],[391.9,176.1],[424.3,181.3875],[432.4,177.9],[411.3,172.5],[366.525,150.7875],[334.2,141.9],[355.4625,137.2875],[361.2,132.0],[325.6125,132.3],[293.7,123.6],[320.7,113.1],[300.0828125,116.728125],[276.6625,112.425],[249.5,102.3],[272.9,97.8],[239.7375,88.7375],[216.7,89.8],[225.3375,83.7875],[230.6,85.2],[209.446875,78.06875],[187.675,79.15],[163.8,86.0],[151.225,81.5625],[122.0,82.3],[129.8875,85.1125],[135.3,96.1],[113.8625,91.1125],[96.7828125,93.5265625],[84.1,106.9],[92.45,104.425],[100.8,116.8],[89.4125,119.6375],[73.0,139.5],[85.2,134.5],[62.675,151.5625],[38.5,184.9],[45.0375,177.5],[64.1,170.1],[58.1375,178.15],[53.0,198.8],[48.6,218.6],[19.7,259.2],[9.55,275.2875],[3.6,298.8],[14.2,307.7],[18.9375,318.725],[35.3,331.7],[38.5,343.65],[60.9,357.1],[55.3,351.9],[75.3,352.2],[66.9,349.7],[85.8,336.3],[95.4125,335.7],[107.5,326.7],[119.325,347.825],[125.3,380.8],[132.0,360.0],[137.4,376.7],[135.3,404.5],[147.5,379.8],[151.9875,402.5875],[150.4,432.8],[163.0,412.1],[166.0375,427.85],[179.2,451.7],[179.2,438.2],[187.3,458.9],[194.5,446.3],[170.2,533.7],[147.7,596.8],[138.7,613.9],[120.7,637.4],[107.2,634.9875],[94.88125,638.4546875],[82.9,650.8],[79.525,656.9875],[85.6,659.8],[89.875,667.3375],[111.7,671.5],[146.8,672.3],[156.7,665.7125],[169.3,643.6],[183.7,629.2],[188.0875,630.4375],[194.5,614.8],[233.2,549.9],[251.3125,524.35],[272.8,480.5],[275.95,489.1625],[289.9,503.9],[283.9375,494.9],[285.4,475.1],[284.9875,481.8875],[294.4,495.8],[297.1,464.3],[304.975,478.8125],[306.1,502.1],[314.65,491.625],[323.2,445.3],[330.4,477.7],[337.6,448.9],[343.225,454.6375],[347.5,473.2],[352.9,462.7375],[355.6,443.5],[367.3,487.6],[379.9,536.3],[385.5,572.3],[385.9625,588.6125],[392.5,611.0],[392.8375,629.0],[381.7,649.7],[366.4,653.75],[355.121875,662.609375],[348.4,679.4],[353.8,679.4],[359.65,685.025],[384.4,686.6],[392.6125,690.1375],[423.1,687.9],[431.425,677.525],[438.4,655.0],[438.9625,641.6125],[445.6,628.9],[448.975,624.175],[445.6,601.9],[442.5625,574.4],[447.4,530.7],[447.4,459.5],[457.2,457.0],[450.8,452.0],[469.3,451.3],[456.5,444.2],[475.0,445.6],[460.0,439.2],[508.1984375,442.146875],[546.8625,436.15],[581.9,423.5],[624.8625,398.025],[647.5,388.6],[663.3203125,393.4296875],[675.2125,404.7375],[685.3,421.4],[713.175,468.25],[735.2,488.4],[751.0,527.2],[772.0875,570.2],[775.1,590.4],[764.15,628.1875],[755.9,644.6],[727.4,648.2],[710.725,658.2375],[707.4,666.7],[705.9125,673.325],[708.7,674.1],[723.55,682.9875],[733.0,680.4],[752.9125,685.125],[765.4,683.1],[783.4,670.5],[823.0,608.7],[826.8,651.5],[805.3,668.5],[793.6875,685.6375],[794.3,694.9],[795.85,701.6125],[798.9,700.9],[815.0625,704.6],[820.8,700.5],[857.9,694.1],[867.2125,679.9375],[869.7,668.4],[873.5,582.1],[875.5,559.7],[881.2765625,526.4828125],[877.3125,509.6625],[866.3,502.9],[849.621875,492.871875],[837.5,476.075],[827.6,453.3],[826.1125,431.365625],[833.175,403.0],[846.7,368.0],[862.3375,343.8125],[863.8,325.7],[869.2,305.9],[882.8546875,329.7234375],[892.7125,365.4625],[900.7,412.2],[916.915625,472.15],[938.55,510.05],[965.6,535.6],[972.7859375,567.8890625],[985.9625,589.6875],[1004.3,605.9],[997.8875,590.675],[997.1,578.9],[1008.321875,587.984375],[1011.95,600.95],[1010.6,617.6],[1019.09375,600.45625],[1018.475,583.8],[1011.5,566.2],[1021.5,582.4],[1021.5,582.4]]",
rachael: "[[25,121,0],[24,120,0],[24,118,0],[24,117,0],[24,116,0],[24,115,0],[24,114,0],[24,113,0],[24,112,0],[23,111,0],[23,110,0],[23,109,0],[22,108,0],[21,107,0],[21,106,0],[20,105,0],[20,104,0],[19,103,0],[19,102,0],[18,102,0],[18,101,0],[18,100,0],[17,99,0],[16,98,0],[16,97,0],[16,96,0],[16,95,0],[16,93,0],[16,92,0],[16,91,0],[16,90,0],[16,88,0],[17,87,0],[17,86,0],[17,85,0],[18,84,0],[18,83,0],[19,82,0],[20,80,0],[20,79,0],[21,79,0],[21,78,0],[22,77,0],[23,76,0],[24,76,0],[24,75,0],[24,74,0],[25,74,0],[26,74,0],[26,73,0],[26,72,0],[28,72,0],[28,71,0],[28,70,0],[29,69,0],[30,68,0],[30,67,0],[31,66,0],[31,65,0],[32,64,0],[32,62,0],[33,62,0],[34,60,0],[34,59,0],[34,58,0],[35,58,0],[36,57,0],[36,56,0],[37,55,0],[38,54,0],[38,53,0],[39,53,0],[40,52,0],[40,51,0],[44,48,0],[45,48,0],[45,47,0],[46,46,0],[46,44,0],[46,43,0],[46,42,0],[45,41,0],[45,40,0],[44,40,0],[43,39,0],[42,38,0],[40,38,0],[38,37,0],[37,36,0],[35,36,0],[33,36,0],[32,36,0],[31,36,0],[30,35,0],[28,35,0],[26,34,0],[25,34,0],[24,33,0],[23,32,0],[22,32,0],[22,31,0],[22,30,0],[21,28,0],[21,26,0],[21,24,0],[21,22,0],[21,21,0],[21,20,0],[21,18,0],[22,17,0],[22,16,0],[22,14,0],[22,12,0],[23,11,0],[23,10,0],[23,8,0],[23,7,0],[23,6,0],[23,5,0],[23,4,0],[23,2,0],[17,-5,0],[15,-6,0],[14,-6,0],[16,-7,0],[16,-8,0],[17,-8,0],[18,-9,0],[18,-10,0],[19,-12,0],[19,-14,0],[19,-15,0],[19,-16,0],[19,-18,0],[18,-19,0],[16,-19,0],[14,-20,0],[13,-20,0],[10,-20,0],[8,-22,0],[2,-32,0],[2,-36,0],[3,-36,0],[4,-38,0],[4,-39,0],[4,-41,0],[5,-42,0],[5,-43,0],[5,-44,0],[5,-45,0],[5,-47,0],[5,-48,0],[4,-50,0],[3,-50,0],[2,-52,0],[0,-52,0],[-1,-53,0],[-3,-54,0],[-4,-55,0],[-6,-55,0],[-8,-55,0],[-11,-55,0],[-12,-55,0],[-14,-54,0],[-16,-53,0],[-18,-52,0],[-20,-51,0],[-22,-49,0],[-22,-48,0],[-23,-46,0],[-23,-42,0],[-23,-38,0],[-30,0,0],[-34,16,0],[-40,32,0],[-41,38,0],[-43,42,0],[-44,49,0],[-46,52,0],[-47,57,0],[-49,64,0],[-51,72,0],[-52,76,0],[-52,78,0],[-52,81,0],[-51,83,0],[-49,86,0],[-48,86,0],[-45,87,0],[-42,87,0],[-36,87,0],[-32,88,0],[-26,89,0],[-17,92,0],[-12,95,0],[-8,96,0],[-4,98,0],[-2,98,0],[-1,100,0],[0,100,0],[2,102,0],[3,104,0],[6,107,0],[8,110,0],[9,111,0],[11,112,0],[13,114,0],[14,115,0],[16,116,0],[17,116,0],[18,116,0],[20,116,0]]",
rhyno: "[[13.27,87],[15.27,96],[20.84,89.48],[19.7,85],[18.96,82.05],[17.1,80.05],[17.08,77],[17.08,77],[18.27,71],[18.27,71],[18.27,71],[22.14,88],[22.14,88],[22.14,88],[24.71,98],[24.71,98],[24.71,98],[20.7,117],[20.7,117],[20.7,117],[26.95,131],[26.95,131],[26.95,131],[25.27,144],[25.27,144],[38.35,140.82],[39.65,146.73],[52.27,142],[49.03,138.47],[42.89,134.73],[41.26,131.96],[39.89,128.95],[40.72,125.23],[41.26,122],[42.12,112],[42.3,108.41],[46.27,99],[51.71,108.48],[48.03,116.68],[50.61,121.96],[53.05,126.93],[61.33,129.46],[62.51,133.61],[63.09,134.66],[62.36,139.41],[62.51,141],[72.38,140.1],[76.64,143.34],[88.27,140],[85.5,132.26],[81.44,134.3],[75.35,126.28],[74.11,124.65],[72.86,122.89],[72.15,120.96],[71.25,118.53],[69.2,102.66],[69.39,100],[69.58,97.27],[70.59,94.64],[71.27,92],[84.32,103.53],[97.97,107.98],[115.27,108],[115.27,108],[141.27,104],[141.27,104],[141.27,104],[153.27,103],[153.27,103],[152.51,109.83],[150.58,109.9],[149.61,115],[148.85,118.98],[149.86,123.1],[148.28,128],[146.86,132.42],[144.26,134.46],[143.59,137.98],[142.44,144.05],[147.33,143.47],[150.27,144.57],[150.27,144.57],[158.27,149.04],[158.27,149.04],[158.27,149.04],[175.55,149.83],[177.21,147.42],[180.42,142.75],[171.73,138.12],[172.5,131],[173.02,126.17],[179.61,107.97],[182.91,104.39],[182.91,104.39],[194.27,97],[194.27,97],[197.63,99.74],[208.36,97.67],[213.27,92],[213.27,92],[228.98,111.58],[228.98,111.58],[231.84,114.51],[235.72,116.09],[238.99,118.52],[244.2,122.39],[250.37,127.17],[257.27,125.01],[264.74,122.67],[264.67,117.72],[269.4,113.52],[269.4,113.52],[290.27,99],[290.27,99],[291.27,95.03],[294.59,92.28],[296.98,89],[300.3,84.45],[302.27,80.54],[303.27,75],[303.27,75],[288.27,86.44],[288.27,86.44],[288.27,86.44],[267.27,90],[267.27,90],[267.27,90],[272.27,77],[272.27,77],[263.32,77],[254.34,78.9],[250.92,68],[250.1,65.38],[248.86,53.63],[249.59,51.74],[250.64,49],[254.89,46.78],[256.86,44.63],[259.05,42.23],[259.55,40.03],[260.27,37],[256.13,38.75],[244.58,43.61],[240.44,42.45],[240.44,42.45],[230.27,36],[230.27,36],[230.33,22.21],[214,20.61],[208.27,16],[194.97,19.12],[182.62,12.36],[171.27,12.84],[164.13,13.14],[149.82,20.81],[139.27,20.82],[139.27,20.82],[120.27,19.49],[120.27,19.49],[120.27,19.49],[99.27,14.8],[99.27,14.8],[90.44,14.11],[80.96,20.47],[68.99,20.07],[68.99,20.07],[51.37,20.02],[49.27,20.69],[41.38,23.23],[25.38,36.69],[21.66,44],[18.87,49.5],[17.43,58.88],[16.15,65],[13.88,75.88],[13.27,87],[13.27,87]]"
}
state.eye = { 'm1': [[[4, 3.93]]], 'm2': [[[4, 3.93]]], 'n1': 2, 'n2': 2, 'n3': [[[2, 1]]], 'a': [[[2, 3]]], 'b': 1 }
state.hexagon = { 'm1': 6, 'm2': 6, 'n1': 1000, 'n2': 400, 'n3': 400, 'a': 1, 'b': 1 }
state.star = { 'm1': 5, 'm2': 5, 'n1': 2, 'n2': 7, 'n3': 7, 'a': 1, 'b': 1 }
state.pentagon = { 'm1': 5, 'm2': 5, 'n1': 1000, 'n2': 600, 'n3': 600, 'a': 1, 'b': 1 }
state.star = { 'm1': 5, 'm2': 5, 'n1': 2, 'n2': 7, 'n3': 7, 'a': 1, 'b': 1 }
state.circle = { 'm1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1 }
state.hexagon = { 'm1': [[[4, 4, 5, 5, 4]]], 'm2': [[[4, 4, 5, 5, 4]]], 'n1': 2, 'n2': [[[2, 2, 7, 7, 2]]], 'n3': [[[2, 2, 7, 7, 2]]], 'a': 1, 'b': 1 }
state.cirsquare = { 'm1': 4, 'm2': 4, 'n1': [[[2, 2, 100, 100, 2]]], 'n2': [[[2, 2, 100, 100, 2]]], 'n3': [[[2, 2, 100, 100, 2]]], 'a': 1, 'b': 1 }
state.square = { 'm1': 4, 'm2': 4, 'n1': 100, 'n2': 100, 'n3': 100, 'a': 1, 'b': 1 }
state.dynsquare = { 'm1': [[[4, 5]]], 'm2': [[[4, 5]]], 'n1': [[[100, 100, 100, 100]]], 'n2': [[[200, 200, 100, 100]]], 'n3': [[[200, 200, 100, 100]]], 'a': [[[1, 1, 1, 1]]], 'b': [[[1, 1, 1, 1]]]}
state.simfly = { 'm1': 10.07, 'm2': 13.45, 'n1': 0.75, 'n2': 0.32, 'n3': 10, 'a': 1, 'b': 1 }
state.tri = { 'm1': [[[3, 3]]], 'm2': [[[3, 3]]], 'n1': 1, 'n2': 1, 'n3': 1, 'a': 1, 'b': 1 }
state.C0011 = {
'm1': 3.93, 'm2': 3.93, 'n1': 2, 'n2': 2, 'n3': 1, 'a': 2.5, 'b': 1
} // http://paulbourke.net/geometry/supershape/C_0011.jpg
state.antenna = {
'x': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1},
'y': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1,},
'z': {'m1':4,'m2':2,'n1':2,'n2':2,'n3':2,'a':6,'b':1, },
}
state.cilinder = {
'x': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1},
'y': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1,},
'z': {'m1':4,'m2':4,'n1':100,'n2':100,'n3':100,'a':1,'b':1},
}
state.circform = { 'm1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1,
'ra2': 90,'v0': 0,'v1': 1,'w4': 0,'seg5': 360,'pa6': 0,'pb7': -1,}
state.cup = {
'x': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1},
'y': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1,},
'z': {'m1':3,'m2':3,'n1':2,'n2':2,'n3':2,'a':6,'b':1},
}
state.embedded = {
'x': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1},
'y': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1,},
'z': {'m1':4,'m2':2,'n1':2,'n2':2,'n3':2,'a':6,'b':1, },
}
state.fly = {
'x': {
'm1': 10.07,
'm2': 13.45,
'n1': 0.75,
'n2': 0.32,
'n3': 10,
'a': 1,
'b': 1, // fly
'ra2': 162,
'v0': 0,
'v1': 1,
'w4': [[[0, 0, 0, -9 * 90, -9 * 90, 0, 0]]],
'seg5': 360,
'pa6': 0,
'pb7': -1,
},
'y': {
'm1': 10.07,
'm2': 13.45,
'n1': 0.75,
'n2': 0.32,
'n3': 10,
'a': 1,
'b': 1, // fly
'ra2': 162,
'v0': 0,
'v1': 1,
'w4': [[[0, 0, 0, -9 * 90, -9 * 90, 0, 0]]],
'seg5': 360,
'pa6': 0,
'pb7': -1,
},
'z': {
'm1': [[[3, 3]]],
'm2': [[[3, 3]]],
'n1': 1,
'n2': 1,
'n3': 1,
'a': 1,
'b': 1, // tri
'ra2': [[[30, 30, 162 / Math.sqrt(2), 162 / Math.sqrt(2), 162 / Math.sqrt(2), 162 / Math.sqrt(2), 262 / Math.sqrt(2) ]]],
'v0': 0,
'v1': 1,
'w4': 0,
'seg5': 360,
'pa6': 0,
'pb7': -1,
}
}
state.img = {
halo: 'img',
geofold: p => ({
type: 'Feature',
geometry: {
'type': 'Point',
'coordinates': [ 0, 0 ]
},
properties: {
sort: 'img',
'xlink:href': p.payload.img.url,
style: p.payload.img.style
}
}),
payload: {
tim: {'td': 1000, 't0': 0, 't1': 1000, 't2': 1, 't3': 1},
ric: {'gid': 'imgg', 'cid': 'imgc', 'fid': 'imgf'},
boform: { 'csx': 0, 'cf': [[[22, 22]]], 'cs': 22, 'cw': [[[0.7, 0.7]]], 'co': [[[0.7, 0.7]]], 'cp': [[[0.5, 0.5]]]},
proform: {
projection: 'uniwen',
translate: [ 30, 40 ]
},
img: {
url: 'zimg-501.jpg',
'style': {
'width': [[[60, 60]]],
'height': [[[40, 40]]],
'rotate': [[[ 0, 0 ]]]
}
}
}
}
state.movingantenna = {
'x': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1},
'y': {'m1': 4, 'm2': 4, 'n1': 2, 'n2': 2, 'n3': 2, 'a': 1, 'b': 1,},
'z': {'m1': [[[3,3,8,8,4,4,4,4]]],
'm2': [[[3,3,1,1,1,1,2,2]]],
'n1': 2,
'n2': 2,
'n3': 2,
'a': [[[6,6,1,1,6,6,6,6]]],
'b': 1,
'ra2': 1,
'v0': 0,
'v1': 1,
'w4': 0,
'seg5': 360,
'pa6': 0,
'pb7': -1,
},
}
state.satellite = {
'x': {
'm1': 4,'m2': 4,'n1': 2,'n2': 2,'n3': 2,'a': 1,'b': 1,
'ra2': 1,'v0': 0,'v1': 1,'w4': 0,'seg5': 360,'pa6': 0,'pb7': -1,
'dom3': [-180, 180],
},
'y': {
'm1': 4,'m2': 4,'n1': 2,'n2': 2,'n3': 2,'a': 1,'b': 1,
'ra2': 1,'v0': 0,'v1': 1,'w4': 0,'seg5': 360,'pa6': 0,'pb7': -1,
'ra2': 1,'v0': 0,'v1': 1,'w4': 0,'seg5': 360,'pa6': 0,'pb7': -1,
'dom3': [-180, 180],
},
'z': {
"m1":8,"m2":1,"n1":2,"n2":2,"n3":2,"a":1,"b":1, // antenna
'ra2': 1,'v0': 0,'v1': 1,'w4': 0,'seg5': 360,'pa6': 0,'pb7': -1,
'dom3': [-180, [[[90,180]]] ],
}
}
state.forms = {
asterisk: {
"gid":"xsf","cid":"asterisk",
"m1": 12,"m2":12,"n1":0.3,"n2":0,"n3":10,"a":1,"b":1,
"tx":360, "ty":185,
"w4": 90,
"ra2":160,
"seg5":360, "pa6":0, "pb7":-1,
// "fuel":{
// "gid":"light","cid":"rings",
// "f":2,"sam":12,
// "m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
// "w4":0,"ra2":3,"seg5":0,
// "cf":999,"cs":100,"cw":0.11,"co":1,
// },
"marks":{
"gid":"marks","cid":'mark',"cid":'mark1',
"m1":-900,"m2":-900,"n1":2,"n2":2,"n3":1,"a":1,"b":6,
"p":0,
"cf":222,"cs":900,"cw":0.1,"co":1,"cp":1,
"w4":90,"ra2":8,"seg5":72,"kx":1,"ky":1,
},
"cf":940,"cs":540,"cw":0.5 ,"co":1,
"v0":0,"v1":1,
},
bean: {"cid":"bean","m1":2,"m2":2,"n1":1,"n2":4,"n3":8,"a":1,"b":1,"w4":0,"ra2":160},
butterfly: {"cid":"butterfly","m1":3,"m2":3,"n1":1,"n2":6,"n3":2,"a":.6,"b":1,"w4":90,"fuel":0,"ra2":160},
circle: {"cid":"circle","m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,"w4":0,"ra2":160},
clover: {"cid":"clover","m1":6,"m2":6,"n1":.3,"n2":0,"n3":10,"a":1,"b":1,"w4":0,"ra2":160},
cloverFour: {"cid":"cloverFour","m1":8,"m2":8,"n1":10,"n2":-1,"n3":-8,"a":1,"b":1,"w4":0,"ra2":160},
cross: {"cid":"cross","m1":8,"m2":8,"n1":1.3,"n2":0.01,"n3":8,"a":1,"b":1,"w4":0,"ra2":160},
diamond: {"cid":"diamond","m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":1,"b":1,"w4":0,"ra2":160},
drop: {"cid":"drop","m1":1,"m2":1,"n1":0.5,"n2":0.5,"n3":0.5,"a":1,"b":1,"w4":90,"ra2":160},
ellipse: {"cid":"ellipse","m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,"w4":0,"ra2":160},
gear: {"cid":"gear","m1":19,"m2":19,"n1":100,"n2":50,"n3":50,"a":1,"b":1,"w4":0,"ra2":160},
heart: {"cid":"heart","m1":-7.33,"m2":-1.4,"n1":13.18,"n2":4.07,"n3":-18.38,"a":11.71,"b":-15.46,"w4":90,"ra2":160},
hexagon: {"cid":"hexagon","m1":6,"m2":6,"n1":1000,"n2":400,"n3":400,"a":1,"b":1,"w4":0,"ra2":160},
malteseCross: {"cid":"malteseCross","m1":8,"m2":8,"n1":.9,"n2":.1,"n3":100,"a":1,"b":1,"w4":0,"ra2":160},
pentagon: {"cid":"pentagon","m1":5,"m2":5,"n1":1000,"n2":600,"n3":600,"a":1,"b":1,"w4":0,"ra2":160},
rectangle: {"cid":"rectangle","m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":2,"b":1,
"tx":365, "ty":185,
"w4":0,"ra2":160,
"cf":[540,900],"co":0.7,
"seg5":12,
},
roundedStar: {"cid":"roundedStar","m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,"w4":0,"ra2":160},
square: {"cid":"square","m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1, "w4": 0, "ra2":160},
star: {"cid":"star","m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,"w4":0,"ra2":160},
triangle: {"cid":"triangle","m1":3,"m2":3,"n1":100,"n2":200,"n3":200,"a":1,"b":1,"w4":0,"ra2":160},
randomform: {"cid":"randomform","cid":"random", "m2": "rnd", "m1": "rnd", "n1": "rnd", "n2": "rnd", "n3": "rnd", "a": "rnd", "b": "rnd", "w4": 90, "ra2":160},
fly: {
"cid":"fly",
"m1":10.07,"m2":13.45,"n1":0.75,"n2":0.32,"n3":10,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":0,
"tx":340,"ty":165,
"w4":90,"seg5":360,"ra2":158.11,
"hc":0},
geo1: {"cid":"geo1","m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,"pa6":0,"pb7":-1,"cf":1000,"tx":350,"ty":200,"w4":0,"seg5":360,"ra2":158.11,"fuel":0,"dots":0,"hc":0,"tt":458.05,"v0":0,"v1":80},
geo2: {"cid":"geo2","m1":4,"m2":-140.01,"n1":-398,"n2":9,"n3":2,"a":1,"b":1,"pa6":0,"pb7":-1,
"cf":884,
"tx":350,"ty":200,"w4":0,"seg5":360,"ra2":158.11,"fuel":0,"dots":0,"hc":0,"v0":1,"v1":-71},
geo3: {"cid":"geo3","m1":-1000,"m2":-156,"n1":-1000,"n2":0,"n3":576,"a":21,"b":-572,"pa6":0,"pb7":-1,"cf":1000,"tx":350,"ty":200,"w4":0,"seg5":360,"ra2":160,"fuel":0,"dots":0,"hc":0,"tt":201.96,"v0":143,"v1":-1000},
geo4: {"cid":"geo4","m1":-722,"m2":-680,"n1":-2,"n2":75,"n3":661,"a":283,"b":160,"pa6":0,"pb7":-1,"cf":742,"tx":368,"ty":200,"w4":90,"seg5":360,"ra2":90,"fuel":0,"dots":0,"hc":0,"tt":297.93,"v0":245,"v1":-957},
geo5: {"cid":"geo5","m1":-1000,"m2":-803,"n1":30,"n2":-17,"n3":100,"a":1,"b":1,"pa6":0,"pb7":-1,"cf":333,"tx":350,"ty":200,"w4":270,"seg5":360,"ra2":106.99,"fuel":0,"dots":0,"hc":0,"tt":458,"v0":114,"v1":1000},
geo6: {"cid":"geo6","m1":-144,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":708,
"tx":350,"ty":200,
"w4":540,
"seg5":360,"ra2":158.11,"fuel":0,"dots":0,
"v0":0,"v1":1,
},
geo7: {"cid":"geo7","m1":-839,"m2":-8,"n1":8,"n2":-212,"n3":381,"a":24.9,"b":20,"pa6":0,"pb7":-1,"cf":809,"tx":350,"ty":182,"w4":1188,"seg5":360,"ra2":158.11,"fuel":0,"dots":0,"hc":0},
geo8: {"cid":"geo8","m1":-737,"m2":-195,"n1":144,"n2":59,"n3":381,"a":20.98,"b":20,"pa6":0,"pb7":-1,"cf":572,"tx":350,"ty":200,"w4":972,"seg5":360,"ra2":158.11,"fuel":0,"dots":0,"hc":0},
geo9: {"cid":"geo9","m1":-144,"m2":2,"n1":1,"n2":4,"n3":8,"a":622.7,"b":20,"pa6":0,"pb7":-1,"cf":419,"tx":350,"ty":200,"w4":90,"seg5":360,"ra2":158.11,"fuel":0,"dots":0,"hc":0},
bird: [
{
"ric":{"typ":"form","gid":"bird","cid":"bird","fid":"bird",},
"formA":{
"m1":5,"m2":5,"n1":70,"n2":30,"n3":100,"a":2.7,"b":2.8,
"v0":1,"v1":-1,
"w4":-90,"ra2":60,"seg5":360,
},
"stateA":350,
"stateB":200,
"pic":{
"cf":50,
}
},
],
bean2: {"cid":"bean2","m1":12,"m2":12,"n1":0.3,"n2":0,"n3":10,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":54,"tx":350,"ty":165,
"w4":0,"seg5":360,"ra2":160,"fuel":0,"hc":0,
"v0":1,"v1":-6,
"dots":1,
"cf":910},
drop2:{"cid":"drop2","m1":1,"m2":1,"n1":0.5,"n2":0.5,"n3":0.5,"a":1,"b":1,
"w4": 90,
"v0":1,"v1":-6,
"dots":1,
"cf":800,
"tx":350,"ty":165
},
decagonform:{
"cid":"decagonform","gid":"xsf","cid":"xsf",
"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":410,
"tx":350,"ty":165,
"w4":0,"seg5":360,
"ra2":158,
"hc":0,
"v0":0,"v1":-80,
},
geo10: {"cid":"geo10","gid":"xsf","cid":"xsf","t0":0,"t1":1000,"t2":1,"t3":1,"m1":-76,"m2":10,"n1":1000,"n2":150,"n3":350,"a":1,"b":1,"pa6":0,"pb7":-1,"cf":900,"tx":350,"ty":165,"w4":0,"seg5":360,"ra2":160,"fuel":0,"dots":1,"hc":0,"v0":0,"v1":1},
geo11: {"cid":"geo11","gid":"xsf","cid":"xsf","t0":0,"t1":1000,"t2":1,"t3":1,"m1":144,"m2":5,"n1":70,"n2":30,"n3":100,"a":2.7,"b":2.8,"pa6":0,"pb7":-1,"cf":20,"tx":350,"ty":200,"w4":90,"seg5":360,"ra2":60,"fuel":0,"dots":0,"hc":0,"v0":0,"v1":1,"tt":168.99, "dots":1},
asterisk2:[{
"cid":"asterisk2","td":1000, "t0":0, "t1":1000, "t2":1, "t3":1,
"cid":"asterisk","m1":[12,220],"m2":[12,220],"n1":0.3,"n2":[0,0],"n3":10,"a":1,"b":1,"tx":[340,340],"ty":[165,165],"w4":[0, 90],"ra2":[90,90],"cf":[500,500],"seg5":360,
}],
line:[{"cid":"line","m1":[8.37,8.37],"m2":[8.37,8.37],"n1":[1.79,1.79],"n2":[980.4,980.4],"n3":[8,8],"a":[1.33,1.33],"b":1,"tx":[240,400],"ty":[100,265],"w4":[90,560],"ra2":[30,80],"seg5":256,"cf":[55,10],
"hc":250, "hs":400,
}],
sea:[
{
"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1,
"cid":"ship",
"m1":2.85,"m2":2.85,"n1":2.85,"n2":6,"n3":10.02,"a":3.73,"b":1,"tx":[350,350],"ty":[265,270],"w4":[60,120, 60, 120, 90],"ra2":[90,90],"seg5":360,
"cf":[450,455]},
{"cid":"see",
"m1":19.8,"m2":19.8,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,
"tx":[330,330],"ty":[770,800],
"w4":[90,180],"ra2":[600,600],"seg5":360,
"cf":[995,999]},
{"cid":"sun",
"m1":[6,40],"m2":[6,40],"n1":[100,120],"n2":[200,220],"n3":[200,230],"a":1,"b":1,"tx":[60,500],"ty":[175,90],"w4":[1.5,4.5],"ra2":[30,130],"seg5":360,
"cf":[500,550]},
{"cid":"mast",
"t0":0,"t1":90,"m1":8,"m2":8,"n1":2,"n2":5,"n3":2,"a":9,"b":6,"tx":300,"ty":165,"w4":0,"ra2":90,"seg5":256,"cf":400}
],
helex:[{
"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1,
"cid":"helex",
"m1":[12,120],"m2":[12,120],"n1":0.3,"n2":[0,0],"n3":10,"a":1,"b":1,
"tx":[340,340],"ty":[165,165],
"w4":[0, 90],"ra2":[90,90],
"cf":[300,400],"seg5":360,
"v0":1,"v1":-4,
}],
drops:[
{"t0":0,"t1":1000,"t2":1,"t3":5,
"cid":"drop1","m1":[1,4],"m2":[1,4],"n1":[0.5,0.7],"n2":[0.5,0.5],"n3":[0.5,0.6],"a":1,"b":0.1,"tx":[240,400],"ty":[140,300],"w4":90,"ra2":[190,90],"seg5":360,"cf":[100,700]},
{"t0":0, "td":1000, "t1":1000, "t2":100,
"cid":"drop2","m":[1.5,8],"n1":[0.5,0.95],"n2":[0.5,0.5],"n3":[0.5,0.5],"a":1,"b":0.1,"tx":[235,390],"ty":[150,310],"w4":90,"ra2":[180,80],"seg5":360,"cf":[550,900]},
{"cid":"heart1",
"t0":0, "t1":1000, "t3":100,
"m1":[1,1],"m2":[1,1],"n1":[1.8,1.8],"n2":[1,1],"n3":[-8,-8],"a":20,"b":0.18,
"tx":[520,520],"ty":[100,100],
"w4":100,
"ra2":[90,40],
"seg5":360,
"cf":[980,970]
}
],
time:[
{
"cid":"circleright",
"td":9000,"t0":0,"t1":500,"tw":1,
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2,2],"n3":[2,2],"a":[1,1],"b":[1,1],"tx":[200,500],"ty":50,"w4":[0,0],"ra2":[20,20],"seg5":360,"cf":[80,90]
},
{"cid":"circlereverse",
"td":9000,"t0":0,"t1":-100,
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2,2],"n3":[2,2],"a":[1,1],"b":[1,1],"tx":[200,500],"ty":100,"w4":[0,0],"ra2":[20,20],"seg5":360,"cf":[80,90]},
{"cid":"circlestepped",
"td":9000,"t0":0,"t1":800,"t2":100,
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2,2],"n3":[2,2],"a":[1,1],"b":[1,1],"tx":[200,500],"ty":150,"w4":[0,0],"ra2":[20,20],"seg5":360,"cf":[80,90]},
{"cid":"tiltsingle",
"td":9000,"t0":0,"t1":800,"t3":5,
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2,2],"n3":[2,2],"a":[1,1],"b":[1,1],"tx":[200,500],"ty":200,"w4":[0,0],"ra2":[20,20],"seg5":360,"cf":[80,90]},
{"cid":["a1","a9"],
"td":9000,"t0":0,"t1":800,"t2":50,
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2,2],"n3":[2,2],"a":[1,1],"b":[1,1],"tx":[200,500],"ty":250,"w4":[0,0],"ra2":[20,20],"seg5":360,"cf":[80,90]},
{"cid":["a10","a20"],
"td":9000,"t0":0,"t1":-800,"t2":90,
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2,2],"n3":[2,2],"a":[1,1],"b":[1,1],"tx":[200,500],"ty":300,"w4":[0,0],"ra2":[20,20],"seg5":360,"cf":[80,90]},
{
"cid":"circlerightdelayed",
"td":9000,"t0":200,"t1":600,
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2,2],"n3":[2,2],"a":[1,1],"b":[1,1],
"tx":[200,500],"ty":350,"w4":[0,0],"ra2":[20,20],"seg5":360,"cf":[80,90]
},
],
// sandclock on b {"m1":4,"m2":4,"n1":2,"n2":25,"n3":2,"a":1,"b":-636,"cf":54,"cs":100,"cw":1,"co":1,"hs":0,"hw":1,"ho":1,"tx":340,"ty":165,"w4":0,"seg5":360,"pa6":0,"pb7":-1,"ra2":160,"fuel":0,"dots":0,"trc":0,"v0":0,"v1":1,"gid":"xsf","cid":"random"}
// ellipses {"gid":"xsf","cid":"xsf","m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,"tx":340,"ty":165,"seg5":360,"w4":0,"ra2":160,"dots":1,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":-59,"co":0.31,"tt":254.81,"hs":400,"t0":0,"t1":1000,"t2":1,"t3":1}
// shape ,"m1":-5.78,"m2":-6.55,"n1":-18.45,"n2":-5.02,"n3":6.54,"a":-10.12,"b":18.39,
// "m1":7.97,"m2":7.04,"n1":13.63,"n2":18.46,"n3":7.68,"a":-19.6,"b":-18.34,
// fruit "m1":1.53,"m2":-13.7,"n1":-3.36,"n2":16.18,"n3":5.23,"a":-1.55,"b":-12.98,
// insect "m1":7.85,"m2":-5.15,"n1":2.74,"n2":-13.4,"n3":-12.86,"a":-11.47,"b":19.46,
ellipse2:[{
"cid":"ellipsesun",
"m1":[4,4],"m2":[4,362],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[12,9,12],"b":[6,6],
"tx":[340,340],"ty":[165,165],
"w4":[-30,30],"ra2":[130,130],
"seg5":360,
"cf":[440, 500, 450],
"v0":0,"v1":1,
}],
// module {"gid":"xsf","cid":"random","m1":-2.75,"m2":-7.35,"n1":16.22,"n2":11.14,"n3":16.04,"a":5.68,"b":-7.54,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"co":0.31,"tt":254.81,"hs":400}
gear2:[{"cid":"gear","m1":[19,19],"m2":[19,19],"n1":[100,10],"n2":[50,370],"n3":[50,230],"a":1,"b":1,"tx":[240,500],"ty":[265,100],"w4":[90,270],"ra2":[30,130],"seg5":360,"cf":[5,50]}],
heart2:[{"cid":"heart1","m1":[1,1.6],"m2":[1,1.6],"n1":[1.8,0.9],"n2":[1,1],"n3":[-8,0.6],"a":1,"b":0.18,"tx":[240,360],"ty":[100,165],"w4":1.5 * 180 / Math.PI,"ra2":[120,30],"seg5":256,"cf":[5,40]},
{"cid":"heart2","m1":[1,1.6],"m2":[1,1.6],"n1":[1.8,0.9],"n2":[1,1],"n3":[-8,0.6],"a":1,"b":0.18,"tx":[400,380],"ty":[300,145],"w4":[90,120],"ra2":[100,25],"seg5":256,"cf":[15,50]}],
maltese2: // **************
{"gid": "maltese", "cid": "maltese","m1":8,"m2":8,"n1":0.9,"n2":0.1,"n3":100,"a":1,"b":1, "seg5":360,"w4":0,"ra2":40,"cf":[50,55], "pa6":0, "pb7":-1,
"df":[{"tx":350,"ty":170,"m1":8,"m2":8,"n1":0.9,"n2":0.1,"n3":100,"a":1,"b":1, "ra2":60, "seg5":256,"w4":0, "pa6":0, "pb7":-1},
{"tx":0,"ty":0, "m1":8, "m2":8, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "ra2":60, "w4": 0, "seg5":256, "pa6":0, "pb7":-1}],
// "tx":
// [{"tx":350,"ty":170,"m1":8,"m2":8,"n1":0.9,"n2":0.1,"n3":100,"a":1,"b":1, "ra2":60, "seg5":256,"w4":0, "pa6":0, "pb7":-1},
// {"tx":0,"ty":0, "m1":8, "m2":8, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "ra2":60, "w4": 0, "seg5":256, "pa6":0, "pb7":-1},
// ],
// "ty":
// [{"tx":120,"ty":120,"m1":8,"m2":8,"n1":0.9,"n2":0.1,"n3":100,"a":1,"b":1, "ra2":20, "seg5":256,"w4":90, "pa6":0, "pb7":-1},
// {"tx":0,"ty":0, "m1":8, "m2":8, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "ra2":80, "seg5":256, "w4": 90, "pa6":0, "pb7":-1}
// ],
"hc":500},
triangles:[
{
"t0":0,"t1":1000, "t2":10, "t3":1,
"cid":["f1","f10"],
"m1":[3,3],"m2":[3,3],"n1":100,"n2":200,"n3":200,"a":1,"b":1,
"tx":100,"ty":75,
"w4":[0,360],"seg5":360,
"ra2":[60,10],
"cf":[500,1000],
"v0":0,"v1":-1,
},
{
"t0":0,"t1":1000, "t2":50, "t3":1,
"cid":["f11","f20"],
"m1":3,"m2":3,"n1":[100,100],"n2":200,"n3":200,"a":1,"b":1,"pa6":0,
"pa6":0,"pb7":-1,
"tx":320,"ty":75,
"w4":[30,390],"seg5":360,
"ra2":[60,0],"fuel":0,"dots":0,"hc":0,
"cf":[1000,450],
"v0":0,"v1":1,
},
{
"t0":0,"t1":1000, "t2":100, "t3":1,
"cid":["f21","f30"],
"m1":[3,3],"m2":[3,3],"n1":100,"n2":200,"n3":200,"a":2,"b":2,
"df":{"tx":100, "ty":175,"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "w4":0, "ra2":60, "seg5":320, "pa6":0,"pb7":-3},
// "tx":[{"tx":100, "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "w4":0, "ra2":60, "seg5":320, "pa6":0,"pb7":-3}],
// "ty":[{"tx":175, "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "w4":90, "ra2":20, "seg5":360, "pa6":0,"pb7":-3}],
"pa6":0,"pb7":-3,
"w4":270,"seg5":360,
"ra2":[40,10],
"cf":[500,1000],
"v0":0,"v1":1,
},
{
"t0":0,"t1":1000, "t2":100, "t3":1,
"cid":["f41","f50"],
"m1":[3,3],"m2":[3,3],"n1":100,"n2":200,"n3":200,"a":1,"b":1,
"tx":[300,300],"ty":175,
"w4":[0,60],
"seg5":360,
"ra2":[60,20],
"cf":[500,1000],
"v0":[0,0],
"v1":[1,1],
},
{
"t0":0,"t1":1000, "t2":50, "t3":1,
"cid":["f51","f60"],
"m1":3,"m2":3,"n1":[100,100],"n2":200,"n3":200,"a":1,
"b":1,"pa6":0,
"pa6":0,"pb7":-1,
"tx":100,"ty":[325,225],
"w4":[30,390],"seg5":360,
"ra2":[60,0],"fuel":0,"dots":0,"hc":0,
"cf":[1000,450],
"v0":1,"v1":-41,
},
{
"t0":0,"t1":1000, "t2":10, "t3":1,
"cid":["f61","f70"],
"m1":[3,3],"m2":[3,3],"n1":100,"n2":200,"n3":200,"a":1,"b":1,
"df":{"tx":300, "ty":300, "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "w4":0, "ra2":60, "seg5":320},
// "tx":[{"tx":300, "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "w4":0, "ra2":60, "seg5":320}],
// "ty":[{"tx":300, "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "w4":90, "ra2":60, "seg5":320}],
"w4":[0,360],"seg5":720,
"ra2":[30,30],
"cf":[500,1000],
"v0":0,"v1":1,
},
{
"t0":0,"t1":1000, "t2":10, "t3":1,
"cid":["f71","f80"],
"m1":[3,3],"m2":[3,3],"n1":100,"n2":200,"n3":200,"a":1,"b":1,
"tx":500,"ty":75,
"w4":[0,360],"seg5":360,
"ra2":[40,40],
"cf":[500,1000],
"v0":0,"v1":1,
},
{
"t0":0,"t1":1000, "t2":10, "t3":1,
"cid":["f81","f90"],
"m1":[3,3],"m2":[3,3],"n1":100,"n2":200,"n3":200,"a":1,"b":1,
"tx":500,"ty":200,
"w4":[0,360],"seg5":360,
"ra2":[40,10],
"cf":[500,1000],
"v0":0,"v1":-11,
},
{
"t0":0,"t1":1000, "t2":20, "t3":1,
"cid":["f91","f100"],
"m1":[3,3],"m2":[3,3],"n1":100,"n2":200,"n3":200,"a":1,"b":1,
"df":{
"tx":500,"ty":340,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
"w4":0,
"ra2":20},
// "tx":[{
// "tx":500,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "w4":0,
// "ra2":20}
// ],
// "ty":[{
// "tx":340,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "w4":90,
// "ra2":20}
// ],
"w4":[0,720],"seg5":360,
"ra2":[40,40],
"cf":[500,500],"cs":[350,350],
"v0":0,"v1":1,
},
],
stars1:[
{"cid":"square","m1":[6,40],"m2":[6,40],"n1":[100,120],"n2":[200,220],"n3":[200,230],"a":1,"b":1,"tx":[240,500],"ty":[265,100],"w4":[90,720],"ra2":[30,130],"seg5":360,"cf":[5,50]},
{"cid":"stem","m1":[9.85,9.85],"m2":[9.85,9.85],"n1":[6.25,6.25],"n2":[13.02,13.02],"n3":[3.57,3.57],"a":[13.8,13.8],"b":1,"tx":[220,360],"ty":[100,265],"w4":[90,720],"ra2":[30,80],"seg5":360,"cf":[55,10]},
{"cid":"cross","m1":[16,19],"m2":[16,19],"n1":[64,68],"n2":[20,23],"n3":[54,58],"a":[3,5],"b":[16,18],"tx":[240,400],"ty":[100,265],"w4":[90,360],"ra2":[30,80],"seg5":256,"cf":[55,10]},
{"tx":[290,440],"ty":[90,255],"cid":"star","m":24.9,"n1":11.97,"n2":100,"n3":100,"a":1,"b":1,"w4":[0,270],"ra2":[20,90],"seg5":256,"cf":53,"pa6":0,"pb7":-1,"t0":0,"t1":100},
{"cid":"stars3", "m1":[12,300],"m2":[12,300],"n1":.3,"n2":[0,5],"n3":10,"a":1,"b":1,"tx":[340,300],"ty":[165,300],"w4":0,"ra2":[158,90],"cf":[10,40],"seg5":360},
{"cid":"stars2", "t0": 0, "t1": 90, "m1":[4,8],"m2":[4,8],"n1":2,"n2":[2,5],"n3":2,"a":9,"b":6,"tx":[340,300],"ty":[300,165],"w4":0,"ra2":[158,90],"seg5":256,"cf":[10,40]}
],
loups: [
{"cid":"back","m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,
"tx":[300,300],"ty":[250,250],
"w4":0,"ra2":[630,630],"seg5":360,
"cf":[5,5]
,"hc":0
,"fuel":0
},
{"m1":11.75,"m2":358.1,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,
"tx":400,
"ty":100,
"ra2":60,
"cf":945},
{
"t0":0,"t1":-1000,
"gid":"loups", "cid":"plane",
"m1":[4.5,4.7],"m2":[550,560],"n1":[28,28],"n2":[25,26],"n3":[35,40],"a":[30,31],"b":[19,20],
"df":{
"tx":255,"ty":125,
"m1":4,"m2":4,"n1":100,"n2":-100,"n3":100,"a":-1,"b":-1,
"w4":0},
// "tx":{
// "tx":255,
// "m1":4,"m2":4,"n1":100,"n2":-100,"n3":100,"a":-1,"b":-1,
// "w4":0},
// "ty":{
// "tx":125,
// "m1":4,"m2":4,"n1":100,"n2":-100,"n3":100,"a":-1,"b":-1,
// "w4":90},
"w4":[90,90],"ra2":[158,50],"seg5":360,
"cf":54,
"pa6":0,"pb7":-1,
"hc":50,
},
{
"gid":"loups", "cid":"loup",
"tt":{"t0":0,"t1":1000,"t3":10},
"m1":6.25,"m2":[6.5,5.75],"n1":-1.57,"n2":0,"n3":10,"a":1,"b":1,
"tx":[[[510,500],[510,500]]],
"ty":300,
"w4":210,"ra2":100,"seg5":360,"pa6":0,"pb7":-1,
"cf":5,
"hc":0,
"fuel":0,
},
],
copter:[
{"tt":{"td":5000, "t0":0, "t1":1000},
// ,"m1":17.47,"m2":16.47,"n1":10.07,"n2":50,"n3":50,"a":1,"b":1
// ,"m1":9.65,"m2":14.3,"n1":1.17,"n2":0.32,"n3":4.54,"a":1,"b":1
// ,"m1":65.99,"m2":65.99,"n1":19.37,"n2":11.32,"n3":142.5,"a":9.36,"b":1.79
// ,"m1":358.1,"m2":358.1,"n1":3.07,"n2":9.85,"n3":200,"a":1,"b":1
// ,"m1":8.57,"m2":7.1,"n1":5.82,"n2":6.25,"n3":19.96,"a":2.33,"b":1
// , "m1":5.82,"m2":730.5,"n1":0.32,"n2":0,"n3":17.71,"a":4.94,"b":0.97
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7,
"w4":[90, 90],"ra2":[100,150],"seg5":360,
"df":
{"tx":300,"ty":200,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
"ra2":60, "seg5":360,"w4":0,
"pa6":0, "pb7":180, // no return
},
// "tx":
// {"tx":300,"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":60, "seg5":360,"w4":0,
// "pa6":0, "pb7":180, // no return
// },
// "ty":
// {"tx":200,"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":60, "seg5":360,
// "w4":90,
// "pa6":0, "pb7":-4,
// },
"hc":500,
"cf":50}
],
copters:[
{"cid":"back",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":300,
"ty":250,
"w4":0,"ra2":630,"seg5":360,"cf":5,
"hc":0
},
{
"cid":"ship1",
"tt":{"t1":9000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7
,"w4":[90, 90],"ra2":30,"seg5":360
,"tx":
{"tx":100,"ty":0,"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6, "ra2":40, "seg5":360,"w4":0, "v0":0, "v1":1}
,"ty":
{"tx":100,"ty":0,"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6, "ra2":40, "seg5":360,"w4":90, "pa6":0, "pb7":-1 , "v0":0, "v1":0}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship2",
"tt":{"t1":18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7
,"w4":[90, 90],"ra2":30,"seg5":360
,"tx":
{"tx":200,"ty":0,"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "ra2":40, "seg5":360,"w4":0, "v0":0, "v1":1}
,"ty":
{"tx":100,"ty":0,"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "ra2":40, "seg5":360,"w4":90, "pa6":0, "pb7":-3 , "v0":0, "v1":0}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship3",
"tt":{"t1":18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7
,"w4":[90, 90],"ra2":30,"seg5":360
,"tx":
{"tx":300,"ty":0,"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "ra2":40, "seg5":360,"w4":0, "v0":1, "v1":4}
,"ty":
{"tx":100,"ty":0,"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1, "ra2":40, "seg5":360,"w4":90, "pa6":0, "pb7":-1 , "v0":1, "v1":4}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship4",
"tt":{"t1":-18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7
,"w4":[90, 90],"ra2":30,"seg5":720
,"tx":
{"tx":400,"ty":0,"m1": 12, "m2": 12, "n1": 0.3, "n2": 0, "n3": 10, "a": 1, "b": 1, "ra2":40, "seg5":360,"w4":0, "pa6":0, "pb7":-1, "v0":1, "v1":-3}
,"ty":
{"tx":100,"ty":0,"m1": 12, "m2": 12, "n1": 0.3, "n2": 0, "n3": 10, "a": 1, "b": 1, "ra2":40, "seg5":360,"w4":90, "pa6":0, "pb7":-1, "v0":1, "v1":-3}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship5",
"tt":{"t1":18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7
,"w4":[90, 90],"ra2":30,"seg5":360
,"tx":
{"tx":500,"ty":0,
"m1":12,"m2":144,"n1":-2,"n2":0,"n3":10,"a":1,"b":1,
"ra2":60, "seg5":360,"w4":90, "pa6":0, "pb7":-1,
"v0":1, "v1":3}
,"ty":
{"tx":100,"ty":0,
"m1":12,"m2":144,"n1":-2,"n2":0,"n3":10,"a":1,"b":1,
"ra2":60, "seg5":360,"w4":180, "pa6":0, "pb7":-1 ,
"v0":1, "v1":3}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship6",
"tt":{"t1":-18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7
,"w4":[90, 90],"ra2":30,"seg5":360
,"tx":
{"tx":100,"ty":0,
"m1":3,"m2":-8,"n1":9,"n2":7,"n3":2,"a":-2,"b":-2,
"v0":2,"v1":-2,
"ra2":40, "seg5":360,"w4":0, "pa6":0, "pb7":-1}
,"ty":
{"tx":200,"ty":0,
"m1":3,"m2":-8,"n1":9,"n2":7,"n3":2,"a":-2,"b":-2,
"v0":2,"v1":-2,
"ra2":40, "seg5":360,"w4":90, "pa6":0, "pb7":-1}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship7",
"tt":{"t1":18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7
,"w4":[90, 90],"ra2":30,"seg5":360
,"tx":
{"tx":200,"ty":0,
"m1":12,"m2":12,"n1":0.3,"n2":0,"n3":10,"a":1,"b":1,
"v0":1,"v1":-6,
"ra2":60, "seg5":360,"w4":90, "pa6":0, "pb7":-1}
,"ty":
{"tx":200,"ty":0,
"m1":12,"m2":12,"n1":0.3,"n2":0,"n3":10,"a":1,"b":1,
"v0":1,"v1":-6,
"ra2":60, "seg5":360,"w4":180, "pa6":0, "pb7":-1}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship8",
"tt":{"t1":18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7
,"w4":[90, 90],"ra2":30,"seg5":360
,"tx":
{"tx":300,"ty":0,
"m1":4,"m2":4,"n1":489,"n2":161,"n3":100,"a":2,"b":1,
"v0":1,"v1":-3,
"ra2":50, "seg5":360,"w4":0, "pa6":0, "pb7":-1}
,"ty":
{"tx":200,"ty":0,
"m1":4,"m2":4,"n1":489,"n2":161,"n3":100,"a":2,"b":1,
"v0":1,"v1":-3,
"ra2":50, "seg5":360,"w4":90, "pa6":0, "pb7":-1}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship9",
"tt":{"t1":18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7
,"w4":[90, 90],"ra2":30,"seg5":360
,"tx":
{"tx":400,"ty":0,
"m1":8,"m2":8,"n1":0.9,"n2":0.1,"n3":100,"a":1,"b":1,
"v0":1,"v1":4,
"ra2":40, "seg5":720,"w4":0, "pa6":0, "pb7":-1}
,"ty":
{"tx":200,"ty":0,
"m1":8,"m2":8,"n1":0.9,"n2":0.1,"n3":100,"a":1,"b":1,
"v0":1,"v1":4,
"ra2":40, "seg5":720,"w4":90, "pa6":0, "pb7":-1}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship10a",
"tt":{"t1":18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7,
"w4":[90, 90],"ra2":30,"seg5":360,
"tx":
{"tx":500,"ty":0,
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"v0":1,"v1":-5,
"ra2":70,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":200,"ty":0,
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"v0":1,"v1":-5,
"ra2":70,"seg5":360,"pa6":0,"pb7":-1,
"w4":90}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship10b",
"tt":{"t1":18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7,
"w4":[90, 90],"ra2":30,"seg5":360,
"tx":
{"tx":500,"ty":0,
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"v0":1,"v1":5,
"ra2":70,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":200,"ty":0,
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"v0":1,"v1":5,
"ra2":70,"seg5":360,"pa6":0,"pb7":-1,
"w4":90}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship11",
"tt":{"t1":18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7,
"w4":[90, 90],"ra2":30,"seg5":360,
"tx":
{"tx":100,"ty":0,
"m1":29,"m2":18,"n1":7,"n2":0,"n3":10,"a":1,"b":1,
"v0":1,"v1":3,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":300,"ty":0,
"m1":29,"m2":18,"n1":7,"n2":0,"n3":10,"a":1,"b":1,
"v0":1,"v1":3,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":90}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship12",
"tt":{"t1":-18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7,
"w4":[90, 90],"ra2":30,"seg5":360,
"tx":
{"tx":200,"ty":0,
"m1":-144,"m2":-432,"n1":-958,"n2":76,"n3":500,"a":-653,"b":127,
"v0":1,"v1":-5,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":300,"ty":0,
"m1":-144,"m2":-432,"n1":-958,"n2":76,"n3":500,"a":-653,"b":127,
"v0":1,"v1":-5,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":90}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship13",
"tt":{"t1":-18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7,
"w4":[90, 90],"ra2":30,"seg5":360,
"tx":
{"tx":300,"ty":0,
"m1":-42,"m2":25,"n1":0.3,"n2":0,"n3":10,"a":1,"b":1,
"v0":2,"v1":12,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":300,"ty":0,
"m1":-42,"m2":25,"n1":0.3,"n2":0,"n3":10,"a":1,"b":1,
"v0":2,"v1":12,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":90}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship14",
"tt":{"t1":-18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7,
"w4":[90, 90],"ra2":30,"seg5":360,
"tx":
{"tx":400,"ty":0,
"m1":5,"m2":5,"n1":483,"n2":551,"n3":568,"a":1,"b":1,
"v0":1,"v1":5,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":300,"ty":0,
"m1":5,"m2":5,"n1":483,"n2":551,"n3":568,"a":1,"b":1,
"v0":1,"v1":5,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":90}
,"hc":500,"hs":900
,"cf":50
},
{
"cid":"ship15",
"tt":{"t1":-18000},
"m1":13.45,"m2":19.37,"n1":10.7,"n2":18.95,"n3":18.68,"a":18.21,"b":10.7,
"w4":[90, 90],"ra2":30,"seg5":360,
"tx":
{"tx":500,"ty":0,
"m1":12,"m2":26,"n1":-2,"n2":0,"n3":10,"a":1,"b":1,
"v0":1,"v1":3,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":300,"ty":0,
"m1":12,"m2":26,"n1":-2,"n2":0,"n3":10,"a":1,"b":1,
"v0":1,"v1":3,
"ra2":60,"seg5":360,"pa6":0,"pb7":-1,
"w4":90}
,"hc":500,"hs":900
,"cf":50
},
],
background:[
{"cid":"back",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "v0":1,"v1":-71,
"v0":1,"v1":[-71,71],
"tx":300,"ty":250,
"w4":0,"ra2":630,"seg5":360,
"cf":5,"cs":500,
"hc":0
},
],
comp1:[
{
"cid":"spiral1",
"tt":{"td":18000},
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,"ra2":120,"seg5":720,
"tx":200,
"ty":200,
"hc":500,
"cf":[590,150,590],"cs":[9],"cw":0.5,
"v0":0.1,"v1":[-21,21],
},
{
"cid":"spiral2",
"tt":{"td":18000},
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":[-21,1],"b":[21,1],
"w4":90,"ra2":120,"seg5":720,
"tx":450,
"ty":200,
"hc":500,
"cf":[590,150,590],"cs":[9],"cw":0.5,
"v0":0.1,"v1":[-21,21],
},
],
spiral1:[
{
"cid":"spiral2",
"tt":{"td":9000,"t0":0,"t1":1000,"t2":60,"t3":1},
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[90, 90],"ra2":120,"seg5":360,
"tx":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":0,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-6,
"v0":0,"v1":-12,
},
]],
"ty":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-6,
"v0":0,"v1":-12,
}
]],
"ra2":15,
"hc":500,"hs":400,
"pa6":0,"pb7":-1,
"cf":550,"cs":850,
},
{
"cid":"spiral3",
"tt":{"td":9000,"t0":0,"t1":1000,"t2":60,"t3":1},
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[90, 90],"ra2":120,"seg5":360,
"tx":[[
{
"tx":400,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":0,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-1,
"v0":1,"v1":-3,
},
]],
"ty":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-1,
"v0":1,"v1":-3,
}
]],
"ra2":15,
"hc":500,"hs":400,
"pa6":0,"pb7":-1,
"cf":550,"cs":850,"cw":0.1,
},
],
timedot:[
{
"cid":"spiral1",
"tt":{"td":4000,"t0":0,"t1":500,"t2":1,"t3":1},
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[90, 90],"ra2":120,"seg5":360,
"tx":[100, 500],
"ty":100,
"ra2":5,
"hc":500,"hs":100,
"pa6":0,"pb7":-1,
"cf":550,"cs":850,
},
{
"cid":"spiral2",
"tt":{"td":4000,"t0":500,"t1":1000,"t2":1,"t3":1},
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[90, 90],"ra2":120,"seg5":360,
"tx":[100, 500],
"ty":200,
"ra2":5,
"hc":500,"hs":100,
"pa6":0,"pb7":-1,
"cf":550,"cs":850,
},
{
"cid":"spiral3",
"tt":{"td":4000,"t0":0,"t1":1000,"t2":1,"t3":1},
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[90, 90],"ra2":120,"seg5":360,
"tx":[100, 500],
"ty":300,
"ra2":5,
"hc":500,"hs":100,
"pa6":0,"pb7":-1,
"cf":550,"cs":850,
},
],
comps:[
{
"cid":"c3",
"tt":{"td":9000,"t0":0,"t1":-1000},
"m1":[0,144],"m2":[-143,-90],"n1":754,"n2":-212,"n3":2,"a":-24.9,"b":1
,"v0":1,"v1":-71
,"w4":[0, 0],"ra2":90,"seg5":360
,"tx":150
,"ty":200
,"hc":500
,"cf":190
},
{
"cid":"c4",
"tt":{"td":9000,"t0":0,"t1":1000},
"m1":[0,144],"m2":[-143,-67],"n1":754,"n2":-212,"n3":2,"a":-24.9,"b":1
,"v0":1,"v1":-71
,"w4":[0, 0],"ra2":90,"seg5":360
,"tx":400
,"ty":200
,"hc":500
,"cf":50
},
],
comp2:[
{"cid":"c5",
"m1":4,"m2":-144,"n1":[600,700],"n2":9,"n3":[-750,-30],"a":[1,1],"b":1,
"pa6":0,"pb7":-1,"cf":884,
"tx":125,
"ty":200,
"w4":0,"seg5":360,"ra2":90,"fuel":0,"dots":0,"hc":0,
"tt":456.86,
"v0":1,"v1":71
},
],
pols:[
{"cid":"c6",
"m1":4,"m2":-144,"n1":754,"n2":[-144,-25],"n3":76,"a":-59,"b":8,
"pa6":0,"pb7":-1,"cf":884,
"tx":300,
"ty":200,
"w4":0,"seg5":360,"ra2":90,"fuel":0,"dots":0,"hc":0,
"tt":456.86,
"v0":1,"v1":-1000
},
{"cid":"c7",
"m1":8,"m2":93,"n1":1000,"n2":[-212,8],"n3":2,"a":-25,"b":1,
"pa6":0,"pb7":-1,"cf":884,
"tx":475,
"ty":200,
"w4":0,"seg5":360,"ra2":90,"fuel":0,"dots":0,"hc":0,
"tt":456.86,
"v0":1,"v1":-71
},
{"cid":"c8",
"m1":4,"m2":-144,"n1":[1,1000],"n2":-127,"n3":[1,1000],"a":-59,"b":1,"pa6":0,
"pa6":0,"pb7":-1,"cf":884,
"tx":125,"ty":200,
"w4":0,"seg5":360,"ra2":90,"fuel":0,"dots":0,"hc":0,
"tt":456.86,
"v0":1,"v1":-71
},
],
decas:[
// {
// "cid":"form1",
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "pa6":0,"pb7":-1,
// "cf":950,"cs":450,"cw":1,"c0":1,
// "tx":100,
// "ty":50,
// "w4":60,"seg5":360,"ra2":40,
// "fuel":0,"dots":0,"hc":0,
// "v0":1,"v1":-71,
// },
// {
// "cid":"ref1",
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "pa6":0,"pb7":-1,
// "cf":950,"cs":450,"cw":1,"c0":1,
// "tx":175,
// "ty":200,
// "w4":60,"seg5":360,"ra2":120,
// "fuel":0,"dots":0,"hc":0,
// "v0":1,"v1":[-70,-71],
// },
// {
// "cid":"move1",
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "tx":{
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "tx":100,
// "w4":0,"seg5":999,"ra2":36,
// "fuel":0,"dots":0,"hc":0,
// "v0":0,"v1":-71
// },
// "ty":{
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "tx":350,
// "w4":90,"seg5":999,"ra2":36,
// "fuel":0,"dots":0,"hc":0,
// "v0":0,"v1":-71
// },
// "pa6":0,"pb7":-1,
// "cf":0,
// "w4":60,"seg5":360,"ra2":12,
// "fuel":0,"dots":0,
// "hc":500,"hs":600, "ho":1,
// "v0":1,"v1":-71,
// },
// {
// "cid":"form2",
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "pa6":0,"pb7":-1,"cf":275,
// "tx":500,"ty":50,
// "w4":60,"seg5":360,"ra2":40,"fuel":0,"dots":0,"hc":0,
// "v0":1,"v1":108,
// "tt":{"t0":0,"t1":1000,"t2":1,"t3":1}
// },
// {
// "cid":"ref2",
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "pa6":0,"pb7":-1,"cf":275,
// "tx":425,"ty":200,
// "w4":60,"seg5":360,"ra2":120,"fuel":0,"dots":0,"hc":0,
// "v0":1,"v1":[107,108],
// "tt":{"t0":0,"t1":1000,"t2":1,"t3":1}
// },
// {
// "cid":"move2",
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "tx":{
// "m1":10,"m2":10,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "tx":500,
// "w4":0,"seg5":360,"ra2":36,
// "fuel":0,"dots":0,"hc":0,
// "v0":0,"v1":108
// },
// "ty":{
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "tx":350,
// "w4":90,"seg5":360,"ra2":36,
// "fuel":0,"dots":0,"hc":0,
// "v0":0,"v1":108
// },
// "pa6":0,"pb7":-1,
// "cf":950,"cs":450,"cw":1,"c0":1,
// "w4":60,"seg5":360,"ra2":12,
// "fuel":0,"dots":0,
// "hc":500,"hs":600, "ho":1,
// "v0":1,"v1":108
// },
// {
// "cid":"ref0",
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "pa6":0,"pb7":-1,
// "cf":950,"cs":450,"cw":1,"c0":1,
// "tx":300,
// "ty":50,
// "w4":60,"seg5":360,"ra2":40,
// "fuel":0,"dots":0,"hc":0,
// "v0":0,"v1":1,
// },
{
"cid":"move0",
"m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
"tx":{
"m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
"tx":300,
"w4":0,"seg5":360,"ra2":36,
"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":1
},
"ty":{
"m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
"tx":350,
"w4":90,"seg5":360,"ra2":36,
"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":1
},
"pa6":0,"pb7":-1,
"cf":950,"cs":450,"cw":1,"c0":1,
"w4":60,"seg5":360,"ra2":12,
"fuel":0,"dots":0,
"hc":500,"hs":600, "ho":1,
"v0":0,"v1":1,
},
],
comp9:[{"m1":4,"m2":[-300,300],"n1":2,"n2":-34,"n3":-25,"a":223.84,"b":480.6,"pa6":0,"pb7":-1,"cf":0,"tx":300,"ty":200,"w4":0,"seg5":360,"ra2":158.11,"fuel":0,"dots":0,"hc":0
},
],
comp12:[
{"m1":10,"m2":10,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,"pa6":0,"pb7":-1,"cf":275,"tx":350,"ty":200,"w4":60,"seg5":360,"ra2":160,"fuel":0,"dots":0,"hc":0,"v0":1,"v1":90,"t0":0,"t1":1000,"t2":1,"t3":1
}
],
comp13:[
{"m1":10,"m2":10,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,"pa6":0,"pb7":-1,"cf":275,"tx":350,"ty":200,"w4":60,"seg5":360,"ra2":160,"fuel":0,"dots":0,"hc":0,"v0":1,"v1":72,"t0":0,"t1":1000,"t2":1,"t3":1}
],
comp14:[
{"m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,"pa6":0,"pb7":-1,"cf":0,"tx":350,"ty":200,"w4":60,"seg5":360,"ra2":160,"fuel":0,"dots":0,"hc":0,"v0":1,"v1":315,"t0":0,"t1":1000,"t2":1,"t3":1}
],
// {"gid":"xsf","cid":"xsf0","m1":-4,"m2":3,"n1":2,"n2":1,"n3":-2,"a":-1,"b":-0.3284489413621783,"tx":300,"ty":200,"seg5":360,"w4":90,"ra2":158.11388300841898,"dots":0,"fuel":0,"hc":0,"cf":900,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"t0":0,"t1":1000,"t2":1,"t3":1,"c":0}
// {"gid":"xsf","cid":"xsf1","m1":4,"m2":-7,"n1":5,"n2":3,"n3":8,"a":1.0077314500013017,"b":1.007044210001186,"tx":350,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":-3.865725000650855,"cs":150,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":385.8568297775459,"hs":550,"ho":1}
starbridge: [
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1},
"cid":"back",
"m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,
"tx":[301,300],
"ty":[250,250],
"w4":0,"ra2":[630,630],"seg5":360,"cf":[5,5],
"v0":1,"v1":-71,
"fuel":0,"hc":0,"dots":0
},
// {"cid":"back",
// "tt":{"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1},
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "v0":1,"v1":[-71,71],
// "tx":300,"ty":250,
// "w4":0,"ra2":630,"seg5":360,
// "cf":5,"cs":500,
// "hc":0
// },
{"cid":"mountains",
"m1":41.97,"m2":41.97,"n1":1.6,"n2":1.17,"n3":0.68,"a":1,"b":0.95,
"tx":340,"ty":585,
"w4":[0,0.5],"ra2":388.11,"seg5":[90,90],
"cf":[369,269],
"pa6":0,"pb7":-1, "fuel":0,
"v0":1,"v1":-25
},
{"cid":"see",
"m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,"tx":[350,350],"ty":[930,930],"w4":[90,180],"ra2":[630,630],"seg5":360,"cf":[985,999]},
{
"cid":"ship2",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"pa6":0,"pb7":-1,
"cf":500,"cs":100,
"tx":500,
"ty":100,
"w4":[0,45],"seg5":360,"ra2":100,"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":80},
{
"cid":"ship1",
"m1":144,"m2":-195,"n1":-178,"n2":-195,"n3":76,"a":-8,"pa6":0,"pb7":-1,
"cf":[400,508],
"tx":{
"m1":4,"m2":4,"n1":25,"n2":3.85,"n3":2,"a":9,"b":6,
"tx":350,"ty":270,
"w4":0,"ra2":260,"seg5":360,
"pa6": 180,"pb7":360 },
"ty":{
"m1":4,"m2":4,"n1":25,"n2":3.85,"n3":2,"a":9,"b":6,
"tx":350,"ty":270,
"w4":-90,"ra2":260,"seg5":360,
"pa6": 180,"pb7":360},
"w4":[0,360],"seg5":360,"ra2":50,"fuel":0,"dots":0,"hc":0,
"v0":42,"v1":331
},
{"cid":[1,10],
"m1":24,"m2":24,"n1":[30,300],"n2":30,"n3":509.02,"a":539.4,"b":9,
"pa6":1.47,"pb7":2.12,
"cf":[500,0],
"tx":120,"ty":111,
"w4":432,"seg5":300.24,"ra2":[100,240],"fuel":1,"dots":0,"hc":0,
"v0":0,"v1":1
},
{
"cid":"star2",
"m1":-737,"m2":-195,"n1":144,"n2":59,"n3":381,"a":20.98,"b":20,
"pa6":0,"pb7":-1,
"cf":[522,900],
"tx":
{"tx":290,"ty":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"v0":1,"v1":-1,
"ra2":180,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":250,"ty":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"v0":1,"v1":-1,
"ra2":180,"seg5":360,"pa6":0,"pb7":-1,
"w4":90},
"w4":972,"seg5":360,"ra2":158.11,"fuel":0,"dots":0,
"hc":60,
"v0":0,"v1":1,
},
// {"cid":"bridge",
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "tx":[[
// {"m1":2,"m2":2,"n1":3,"n2":3,"n3":0.2,"a":0.9,"b":6,"tx":350,"ty":0,"w4":0,"ra2":50,"seg5":360,"pa6":1,"pb7":-1},
// {"m1":4,"m2":4,"n1":30,"n2":3,"n3":2,"a":9,"b":6,"tx":350,"ty":0,"w4":0,"ra2":150,"seg5":360,"pa6":1,"pb7":-1}]],
// "ty":{"m1":4,"m2":4,"n1":30,"n2":3,"n3":2,"a":9,"b":6,"tx":240,"ty":90,"w4":90,"ra2":120,"seg5":360,"pa6":1,"pb7":-1}
// ,"w4":[0,360],"seg5":300,"ra2":20 ,"fuel":1,"cf":850}
// ],
// flower2: [
// {"cid":"back","m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,"tx":[300,300],"ty":[280,280]
// ,"w4":0,"ra2":[630,630],"seg5":360
// ,"cf":[5,5]
// ,"fuel":0},
// {"cid":"flower",
// "tt":{"t0":0,"t1":1000, "t2":1, "t3":1 },
// "m1":[24,24],"m2":[24,24],"n1":[1,1],"n2":[1,-3],"n3":[2,12],"a":[9,9],"b":[9,9],
// "tx":[380,380],"ty":[195,195],
// "w4":[0,0],"ra2":[20,150],"seg5":360,"cf":[10,0]
// ,"fuel":1},
],
elipticalstar: [{
"cid":"star2",
"m1":-737,"m2":-195,"n1":144,"n2":59,"n3":381,"a":20.98,"b":20,
"pa6":0,"pb7":-1,
"cf":[522,900],
"tx":
{"tx":290,"ty":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"v0":1,"v1":-1,
"ra2":180,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":250,"ty":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"v0":1,"v1":-1,
"ra2":180,"seg5":360,"pa6":0,"pb7":-1,
"w4":90},
"w4":972,"seg5":360,"ra2":158.11,"fuel":0,"dots":0,
"hc":60,
"v0":0,"v1":1,
},
{"tx":290,"ty":100,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"v0":1,"v1":-1,
"ra2":180,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
],
battlefield:[
{"cid":"back","m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,"tx":[300,300],"ty":[250,250],"w4":0,"ra2":[630,630],"seg5":360,"cf":[530,0], "hc":0, "fuel":0},
{"cid":"opencloud","m1":2,"m2":2,"n1":2,"n2":8,"n3":6,"a":1,"b":1,"tx":[300,300],"ty":[-50,100],"w4":270,"ra2":[30,330],"seg5":360,"cf":[0,0], "fuel":1},
{"cid":"mountains","t0":0,"t1":100,"m1":41.97,"m2":41.97,"n1":1.6,"n2":1.17,"n3":0.68,"a":1,"b":0.95,"tx":340,"ty":805,"w4":[0,0.5],"ra2":658.11,"seg5":[82,81.93],"cf":[369,269],"pa6":0,"pb7":-1, "fuel":0},
{"cid":"sun1","m1":12,"m2":12,"n1":10.07,"n2":50,"n3":50,"a":1,"b":1,"tx":[130,130],"ty":[100,90],"w4":[60,90],"ra2":[80,80],"seg5":360,"cf":[598,538]},
{"cid":"sun2","m1":1.6,"m2":1.6,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,"tx":[510,570],"ty":[110,95],"w4":[90,180],"ra2":[100,105],"seg5":360,"cf":[575,521]},
{"cid":"see","m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,"tx":[350,350],"ty":[890,890],"w4":[90,180],"ra2":[630,630],"seg5":360,"cf":[985,999]},
{"cid":"ship1","t0":0, "t1":100, "m1":[4,7],"m2":[4,7],"n1":[0.5,0.5],"n2":[0.5,0.5],"n3":[0.5,0.5],"a":1,"b":0.1,"tx":[230,380],"ty":[120,310],"w4":[90,90],"ra2":[40,120],"seg5":256,"cf":[500,500]},
{"cid":"ship2"
,"tt":{"t0":0, "t1":1000}
,"m1":7,"m2":7,"n1":[0.5,0.5],"n2":[0.5,0.5],"n3":[0.5,0.5],"a":1,"b":0.1
,"tx":{"m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,"tx":350,"ty":840,"w4":0,"ra2":630,"seg5":360}
,"ty":[120,310]
,"w4":[90,90],"ra2":[40,270],"seg5":256
,"cf":[435,440]
, "hc":500},
{
"cid":"stara",
"tt":{"t0":0,"t1":1000, "t2":1, "t3":1 },
"m":8,"n1":0.5,"n2":0.5,"n3":0.5,"a":1,"b":0.1,
"tx":{
"m1":4,"m2":4,"n1":25,"n2":3.85,"n3":2,"a":9,"b":6,
"tx":350,"ty":270,
"w4":0,"ra2":260,"seg5":360,
"pa6": 180,"pb7":360 },
"ty":{
"m1":4,"m2":4,"n1":25,"n2":3.85,"n3":2,"a":9,"b":6,
"tx":350,"ty":270,
"w4":-90,"ra2":260,"seg5":360,
"pa6": 180,"pb7":360},
"w4":90,"ra2":[25,30],"seg5":[256,100],
"cf":130,
"hc":500
},
{"cid":"starb",
"m1":8,"m2":8,"n1":0.5,"n2":0.5,"n3":0.5,"a":1,"b":0.1,
"tx":{
"m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,
"tx":350,"ty":550,
"w4":0,"ra2":630,"seg5":360,
"pa6": 200, "pb7": 300 },
"ty":{
"m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,
"tx":150,
"w4":90,"ra2":30,"seg5":360,
"pa6": 200,"pb7": 300
},
"w4":90,"ra2":[25,30],"seg5":[256,100],
"cf":530,
"hc":500
},
{"cid":"star2","t0":0,"t1":100,"m1":8,"m2":8,"n1":0.5,"n2":0.5,"n3":0.5,"a":1,"b":0.1,"tx":[350, 390],"ty":110,"w4":90,"ra2":20.01,"seg5":[100,256],"cf":530},
{
"cid":"star3",
"m1":7.62,"m2":7.62,"n1":3.19,"n2":1.28,"n3":6.98,"a":0.01,"b":6.35,
"tx": {"tx":250,
"m1":4,"m2":4,"n1":30,"n2":3,"n3":2,"a":9,"b":6,
"w4":0,"ra2":380,"seg5":360,
"pa6": 200, "pb7": 325},
"ty": {"tx":350,
"m1":4,"m2":4,"n1":30,"n2":3,"n3":2,"a":9,"b":6,
"w4":-90,"ra2":380,"seg5":360 ,
"pa6": 200, "pb7": 325},
"w4":[0,360],"seg5":300,"ra2":100,"cf":130, "hc":500,
},
],
hearts:[
{"t0":0, "t1":30,"cid":"heart01","m1":[1,1],"m2":[1,1],"n1":[1.8,2],"n2":[1,2],"n3":[-4,2],"a":[1,15,1],"b":[0.18,1],"tx":[240,360],"ty":[130,165],"w4":1.5 * 180 / Math.PI,"ra2":[120,30],"seg5":256,"cf":[5,40]},
{"t0":0, "t1":30,"cid":"heart02","m1":[1,1.2],"m2":[1,1.2],"n1":[1.9, 0.72],"n2":[1.2,3],"n3":[-3.8,0.6],"a":[12,5],"b":0.18,"tx":[280,363],"ty":[140,218],"w4":90,"ra2":[100,25],"seg5":256,"cf":[15,50]},
{"t0":30, "t1":70,"cid":"heart11","m1":[1,1.23],"m2":[1,1.23],"n1":[1.8,2],"n2":[1,2],"n3":[-4,2.1],"a":[1,1],"b":[0.18,1],"tx":[240,340],"ty":[280,165],"w4":1.5 * 180 / Math.PI,"ra2":[120,30],"seg5":256,"cf":[5,40]},
{"t0":30, "t1":70,"cid":"heart12","m1":[1,1.18],"m2":[1,1.18],"n1":[1.9, 0.52],"n2":[1.16,1.53],"n3":[-3.8,0.5],"a":[12,5],"b":0.18,"tx":[272,343],"ty":[300,222],"w4":90,"ra2":[100,28],"seg5":256,"cf":[15,50]},
],
spacebridge:[
// {"cid":"back","m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,"tx":[300,300],"ty":[250,250]
// ,"w4":0,"ra2":[630,630],"seg5":360
// ,"cf":[5,5]
// ,"fuel":0},
// {"m1":11.75,"m2":358.1,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,
// "tx":500,
// "ty":100,
// "ra2":60,
// "cf":945},
// {"cid":"see","m1":4,"m2":4,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,"tx":[350,350],"ty":[890,890],"w4":[90,180],"ra2":[630,630],"seg5":360,"cf":[5,10]},
{"cid":["f100","f101"],
"tt":{"t0":200,"t1":1000, "t2":1, "t3":1 },
"m1":7.62,"m2":7.62,"n1":3.19,"n2":1.28,"n3":6.98,"a":0.01,"b":6.35,
"tx": {"m":4,"n1":30,"n2":3,"n3":2,"a":9,"b":6,
"tx":350,
"w4":0,"ra2":630,"seg5":360,
"pa6":240,"pb7": 290},
"ty": {"m":4,"n1":30,"n2":3,"n3":2,"a":9,"b":6,
"tx":350,
"w4":0,"ra2":630,"seg5":360,
"pa6": 240, "pb7": 290},
"w4":[0,270],"seg5":300,"ra2":100, "fuel":1, "hc":500,
"cf":10},
// {"cid":[1,10]
// ,"tt":{"t0":0,"t1":200, "t2":20, "t3":1 }
// ,"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1
// ,"tx": {"m1":34,"m2":26,"n1":24,"n2":3,"n3":3,"a":9,"b":2,"tx":250,"ty":660,"w4":0,"ra2":530,"seg5":360 ,"pa6": 240, "pb7": 290}
// ,"ty": {"m1":48,"m2":25,"n1":27,"n2":4,"n3":2,"a":2,"b":6,"tx":250,"ty":640,"w4":0,"ra2":580,"seg5":360 , "pa6": 240, "pb7": 290}
// ,"w4":[0,270],"seg5":[60,60],"ra2":10, "fuel":0
// ,"cf":999},
// {"cid":[11,20]
// ,"tt":{"t0":0,"t1":200, "t2":20, "t3":1 }
// ,"m1":6,"m2":6,"n1":30,"n2":100,"n3":100,"a":1,"b":1
// ,"tx": {"m1":64,"m2":26,"n1":24,"n2":3,"n3":3,"a":9,"b":2,"tx":250,"ty":560,"w4":0,"ra2":530,"seg5":360 ,"pa6": 240, "pb7": 320}
// ,"ty": {"m1":78,"m2":25,"n1":27,"n2":4,"n3":2,"a":2,"b":6,"tx":250,"ty":540,"w4":0,"ra2":580,"seg5":360 , "pa6": 240, "pb7": 320}
// ,"w4":[0,270],"seg5":[60,60],"ra2":10, "fuel":0
// ,"cf":999},
// {"cid":[21,30],
// "tt":{"t0":0,"t1":200, "t2":20, "t3":1 },
// "m1":6,"m2":6,"n1":30,"n2":100,"n3":100,"a":1,"b":1
// ,"tx": {"m1":129,"m2":129,"n1":24,"n2":3,"n3":3,"a":9,"b":2,"tx":250,"ty":560,"w4":0,"ra2":530,"seg5":360 ,"pa6": 240, "pb7": 320}
// ,"ty": {"m1":168,"m2":168,"n1":27,"n2":4,"n3":2,"a":2,"b":6,"tx":250,"ty":540,"w4":0,"ra2":580,"seg5":360 , "pa6": 240, "pb7": 320},
// "w4":[0,270],"seg5":[60,60],"ra2":10, "fuel":0,
// "cf":999}
],
circle2:[
{"cid":"back","m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
"tx":340,"ty":165,
"w4": 90,
"seg5":360,"ra2":158.11,
"cf":[200,250,500],
"pa6":0,"pb7":-1,
},
{"cid":"sun","t0":0,"t1":1000,"t2":1,"t3":1,"m1":19,"m2":19,"n1":100,"n2":50,"n3":50,"a":1,"b":1,"pa6":0,"pb7":-1,"cf":[0,0,550],"tx":400,"ty":100,"w4":0,"seg5":360,"ra2":[20,60],"fuel":0,"dots":0,"hc":0,"v0":0,"v1":1},
{"cid":"stem","t0":0,"t1":1000,"t2":1,"t3":1,"m1":2,"m2":2,"n1":1,"n2":-8,"n3":[-1,-70],"a":246,"b":1,"pa6":0,"pb7":-1,"cf":[0,0,750],"tx":300,"ty":280,"w4":90,"seg5":360,"ra2":68,"fuel":0,"dots":0,"hc":0,"v0":0,"v1":1},
{"cid":"flower","t0":0,"t1":1000,"t2":1,"t3":1,"m1":[1,26],"m2":[1,26],"n1":[110,200],"n2":60,"n3":[0.5,5],"a":26,"b":-25,"pa6":0,"pb7":-1,"cf":[0,0,750],"tx":300,"ty":[300,150],"w4":-90,"seg5":360,"ra2":[10,140],"fuel":0,"dots":0,"hc":0,"v0":0,"v1":1},
{"cid":"front",
"t1":-1000,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
"tx":340,"ty":165,
"w4": 90,
"seg5":360,"ra2":158.11,
"cf":[0,0],
"pa6":0,"pb7":[ 360, 1, 360, 1],
"v0":0,"v1":1
},
],
multistar:[
{"gid":"xsf","cid":"xsf0","m1":432,"m2":246,"n1":-42,"n2":-127,"n3":42,"a":41,"b":127,"tx":350,"ty":195,"seg5":360,"w4":90,"ra2":[16,160],"dots":0,"fuel":0,"hc":0,"cf":986,"cs":986,"cw":0.1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":386.16646214997377,"hs":550,"ho":1}
],
longdisk:[
{"cid": "needle",
"m1":0.585,
"m2":-0.025,
"n1":[0.01, 0.5],
"n2":[0, 0],
"n3":[0.00001,0.000001],
"a":0,
"b":[0.212,0],
"tx":350,
"ty":165,
"seg5":360,
"w4":90,
"ra2":[160, 160],
"dots":0,
"fuel":0,
"hc":0,
"cf":449.93902500063996,
"cs":-1,
"cw":1,
"pa6":0,
"pb7":-1,
"v0":0,"v1":1,
"tt":386.16646214997377,
"hs":550,"ho":1,
"v0":0,"v1":1}
],
randomanima:[
{"cid": "randomanima",
"td":1000,
"m1":["rnd", "rnd"],
"m2":["rnd", "rnd"],
"n1":["rnd", "rnd"],
"n2":["rnd", "rnd"],
"n3":["rnd", "rnd"],
"a":["rnd", "rnd"],
"b":["rnd", "rnd"],
"tx":350,
"ty":165,
"seg5":360,
"w4":90,
"ra2":[160, 160],
"dots":0,
"fuel":0,
"hc":0,
"cf":450,
"cs":-1,
"cw":1,
"pa6":0,
"pb7":-1,
"v0":0,"v1":1,
"hs":550,"ho":1,
"v0":0,
"v1":1}
],
stars3:[
{
"tt":{"td":9000,"t0":0,"t1":9000, "t2":1, "t3":1},
"cid":"back",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":300,
"ty":250,
"w4":0,"ra2":630,"seg5":360,"cf":5,
"hc":0
},
{
"cid":"ship1",
"tt":{"td":9000,"t0":0,"t1":9000, "t2":1, "t3":1},
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":[0, 360],"ra2":3,"seg5":120,
"tx":
{"tx":300,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 6,
"ra2":40, "seg5":360,
"w4":0,
"pa6":0, "pb7":-6 ,
"v0":1, "v1":6},
"ty":
{"tx":200,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 6,
"ra2":40, "seg5":360,
"w4":90,
"pa6":0, "pb7":-6 ,
"v0":1, "v1":6},
"hc":40 , "hs":650, // trace
"cf":650, "cs":650, // ship
},
{
"cid":"ship2",
"tt":{"td":9000,"t0":0,"t1":9000, "t2":1, "t3":1},
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":[0, 360],"ra2":3,"seg5":120,
"tx":
{"tx":300,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 6,
"ra2":50, "seg5":360,
"w4":0,
"pa6":0, "pb7":-9 ,
"v0":0, "v1":1},
"ty":
{"tx":200,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 6,
"ra2":50, "seg5":360,
"w4":90,
"pa6":0, "pb7":-9 ,
"v0":0, "v1":1},
"hc":40 , "hs":650, // trace
"cf":650, "cs":650, // ship
},
{
"cid":"ship9",
"tt":{"td":9000,"t0":0,"t1":9000, "t2":1, "t3":1},
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":[0, 360],"ra2":3,"seg5":120,
"tx":
{"tx":300,
"m1":5,"m2":5,"n1":20,"n2":60,"n3":60,"a":1,"b":1,
"ra2":185, "seg5":360,
"w4":0,
"pa6":0, "pb7":-9 ,
"v0":0, "v1":1},
"ty":
{"tx":200,
"m1":5,"m2":5,"n1":20,"n2":60,"n3":60,"a":1,"b":1,
"ra2":185, "seg5":360,
"w4":90,
"pa6":0, "pb7":-9 ,
"v0":0, "v1":1},
"hc":40 , "hs":650, // trace
"cf":650, "cs":650, // ship
},
],
stars4:[
{
"cid":"ship1",
"td":9000,"t0":0,"t1":1000, "t2":1, "t3":1,
// "m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"m1":-4.35,"m2":-11.47,"n1":-11.09,"n2":19.1,"n3":15.52,"a":-8.17,"b":-13.39,
"w4":[90, 90],"ra2":24,"seg5":120,
"tx":
[
[20,320],
{
"m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
"ra2":180,
"seg5":360,
"w4":0,
"pa6":0, "pb7":-1 ,
"v0":0.1, "v1":6},
{
"m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
"ra2":80, "seg5":720,
"w4":0,
"pa6":0, "pb7":-1 ,
"v0":0.1, "v1":-6},
],
"ty":
[
{"tx":150,
"m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
"ra2":80, "seg5":720,
"w4":90,
"pa6":0, "pb7":-1 ,
"v0":1, "v1":6},
],
"fuel":0,
"hc":4000 , "hs":900, // trace
"cf":900, "cs":900, // ship
},
// {
// "cid":"ship2",
// "tt":{"td":9000,"t0":300,"t1":1000, "t2":1, "t3":1},
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "w4":[0, 720],"ra2":[3,30],"seg5":120,
// "tx":[150, 500],
// "ty":[150, 120],
// "kx":1.5,
// "ky":0.5,
// "fuel":0,
// "pa6":0, "pb7":-1 ,
// "v0":1, "v1":-6,
// "hc":0 , "hs":550, // trace
// "cf":0, "cs":550, // ship
// },
// {
// "cid":"ship3",
// "tt":{"td":9000,"t0":350,"t1":1000, "t2":1, "t3":1},
// "m1":5,"m2":5,"n1":1000,"n2":150,"n3":150,"a":1,"b":1,
// "w4":[0, 720],"ra2":[3,30],"seg5":120,
// "tx":[150, 500],
// "ty":[160, 180],
// "kx":1.1,
// "ky":0.7,
// "fuel":0,
// "pa6":0, "pb7":-1 ,
// "v0":1, "v1":6,
// "hc":0 , "hs":450, // trace
// "cf":0, "cs":450, // ship
// },
],
stars5:
[
{
"gid":"stars","cid":"ship1",
"td":9000,"t0":0,"t1":1000, "t2":1, "t3":1,
"m1":[100,600],"m2":[100,600],"n1":[2,1],"n2":[2,3],"n3":[2,3],"a":12,"b":6,
"w4":90,"ra2":64,"seg5":360,
"fuel":0,
"hc":4000 , "hs":900, // trace
"cf":900, "cs":900, "cw":0.3, "co":0.9, // ship
"v0":0, "v1":1,
"nums":18,
"markp":1,
"tx":0,
"ty":0,
"dx":100,
"dy":100,
"df":
{
"tx":0,
"ty":0,
"dx":0,
"dy":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"ra2":24,
"seg5":360,
"w4":0,
"pa6":0, "pb7":-1 ,
"v0":0, "v1":1
}
},
{
"gid":"stars","cid":"ship2",
"td":9000,"t0":0,"t1":1000, "t2":1, "t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":2,"b":2,
"w4":90,"ra2":48,"seg5":360,
"fuel":0,
"hc":4000 , "hs":900, // trace
"cf":100, "cs":900, "cw":0.3, "co":1, // ship
"v0":0, "v1":1,
"nums":18,
"markp":1,
"tx":0,
"ty":0,
"dx":100,
"dy":100,
"df":
{
"tx":0,
"ty":0,
"dx":0,
"dy":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"ra2":24,
"seg5":360,
"w4":0,
"pa6":0, "pb7":-1 ,
"v0":0, "v1":1
}
},
],
anima:
[
// {"m1": [1, 4, 4, 4, 4, 4],
// "m2": [1, 4],
// "n1": [0.5, 2, 2, 2, 2, 2],
// "n2": [2, 0.5],
// "n3": [0.5, 2, 2, 2, 2, 2],
// "a": [1, 6, 6, 6, 6, 6],
// "b": [1, 9, 9, 9, 9, 9],
// "w4": 90,
// "tx":[350,350],
// "ty":[165,165],
// "dots":0
// }
// {
// "tt":{"t0":0,"t1":500, "t2":1, "t3":1},
// "m1": [1, 4],
// "m2": [1, 4],
// "n1": [0.5, 3],
// "n2": [0.5, 1],
// "n3": [0.5, 2],
// "a": [1, 6],
// "b": [1, 6],
// "pa6":0,
// "pb7":-1,
// "cf":{
// "m1":4,
// "m2":4,
// "n1":2,
// "n2":2,
// "n3":2,
// "a":1,
// "b":1,
// "pa6":0,
// "pb7":-1
// },
// "cs": 150,
// "tx":[350,350],
// "ty":165, // [165,400],
// "w4":90,
// "seg5":360,
// "ra2":[160,160],
// "fuel":0,
// "hc":0, "hs":550, "ho":1,
// "v0":0,"v1":1,
// "dots":0
// },
{
"tt":{"t0":0,"t1":1000, "t2":1, "t3":1},
"m1": [1, 1, 1, 1, 1, 0.2],
"m2": [1, 0.2],
"n1": [0.5, 0.8],
"n2": [0.5, 0.5],
"n3": [0.5, 1],
"a": [1, 0.1],
"b": [1, 0.18],
"m1": [0.2, 1],
"m2": [0.2, 1],
"n1": [0.8, 0.5],
"n2": [0.5, 0.5],
"n3": [1, 0.5],
"a": [0.1, 1],
"b": [0.18, 1],
"pa6":0,
"pb7":-1,
"cf":[0,450],
"cs": 150,
"tx":[350,350],
"ty":165, // [165,400],
"w4":90,
"seg5":360,
"ra2":[160,160],
"fuel":0,
"hc":0, "hs":550, "ho":1,
"v0":0,"v1":1,
"dots":0
},
// {"cid": "needle",
// "m1":0.585,
// "m2":-0.025,
// "n1":[0.01, 0.5],
// "n2":[0, 0],
// "n3":[0.00001,0.000001],
// "a":0,
// "b":[0.212,0],
// "tx":350,
// "ty":165,
// "seg5":360,
// "w4":90,
// "ra2":[160, 160],
// "dots":0,
// "fuel":0,
// "hc":0,
// "cf":449.93902500063996,
// "cs":-1,
// "cw":1,
// "pa6":0,
// "pb7":-1,
// "v0":0,"v1":1,
// "tt":386.16646214997377,
// "hs":550,"ho":1,
// "v0":0,"v1":1}
],
// skull: {"gid":"xsf","cid":"xsf1","m1":1,"m2":3,"n1":1,"n2":0,"n3":34,"a":1.0002627999972902,"b":1.000239439997531,"tx":350,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":-0.13139999864506535,"cs":150,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":386.08103341586207,"hs":550,"ho":1}
// bear : {"gid":"xsf","cid":"xsf1","m1":4,"m2":11,"n1":-3,"n2":3,"n3":8,"a":1.0077314500013017,"b":1.007044210001186,"tx":350,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":-3.865725000650855,"cs":150,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":385.8568297775459,"hs":550,"ho":1}
// drop: {"gid":"xsf","cid":"xsf0","m1":0.449,"m2":-1,"n1":0.212,"n2":-0.907,"n3":0.025,"a":0.9998780500012799,"b":-0.246,"tx":350,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":449.93902500063996,"cs":150,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":386.16646214997377,"hs":550,"ho":1,"v0":0.001,"v1":-0.364}
// steps on
// {"m1":-144,"m2":4,"n1":1,"n2":[2,15],"n3":7,"a":1,"b":1,"pa6":0,"pb7":-1,"cf":708,"tx":336,"ty":100,"w4":270,"seg5":360,"ra2":90,"fuel":0,"dots":0,"hc":0,"v0":0,"v1":432,"gid":null,"cid":null,"t0":0,"t1":1000,"t2":1,"t3":1,"tt":457.79}
rocket1:[
{"gid":"xsf","cid":"rocket1",
"tt":{"td":6000, "t0":0, "t1":-400, "t2":1, "t3":1, "tw":0},
"m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":17,"a":8.98,"b":0.19,
"tx":[{"tx":320,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 6,
"ra2":40, "seg5":360,
"w4":0,
"pa6":90, "pb7":180 ,
"v0":0, "v1":0}],
"ty":[
{"tx":100,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 6,
"ra2":40, "seg5":360,
"w4":90,
"pa6":90, "pb7":180 ,
"v0":0, "v1":1}],
"seg5":360,
"w4":[-90,-30],
"ra2":90,"dots":0,"fuel":0,
"hc":40,"hs":450,
"cf":54,"cs":450,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{"gid":"xsf","cid":"fuel",
"tt":{"td":6000, "t0":400, "t1":1000, "t2":1, "t3":1, "tw":0},
"m1":[6,2],"m2":0.84,"n1":[2,2],"n2":[113,113],"n3":364,"a":-164,"b":0.19,
"tx":[320, 320],
"ty":[190, 270],
"seg5":360,
"w4":-90,
"ra2":60,"dots":0,"fuel":0,
"hc":40,"hs":450,
"cf":54,"cs":54,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"fuel":1,
"ky":[1,0.4]
},
{"gid":"xsf","cid":"rocket1",
"tt":{"td":6000, "t0":400, "t1":1000, "t2":1, "t3":1, "tw":0},
"m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":17,"a":8.98,"b":0.19,
"tx":[320, 320],
"ty":[100, 195],
"seg5":360,
"w4":-90,
"ra2":90,"dots":0,"fuel":0,
"hc":40,"hs":450,
"cf":54,"cs":450,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"ky":1
},
],
space:[
{
"gid":"xsf","cid":"rocket1",
"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1, "tw":0,
"m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":14,"a":8.98,"b":0.19,
// "m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":17,"a":0.98,"b":8.19,
// "m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":2,"b":1,
"dx":250,
"dy":300,
"df":{
"dx":0,
"dy":0,
"tx":0,
"ty":0,
"num":1,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 9,
"ra2":200,
"seg5":360,
"w4":0,
"pa6":-90, "pb7":160 ,
"v0":0, "v1":1
},
"seg5":360,
"w4":[-90,-20],
"ra2":160,
"hc":90,"hs":450,
"cf":794,"co":0.5,"cs":450,"cw":0.01,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"fuel":3,
},
{
"gid":"xsf","cid":"rocket2",
"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1, "tw":0,
"m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":17,"a":8.98,"b":0.19,
// "m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":17,"a":0.98,"b":8.19,
// "m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":2,"b":1,
"dx":370,
"dy":300,
"df":{
"dx":0,
"dy":0,
"tx":0,
"ty":0,
"num":1,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 7,
"ra2":200,
"seg5":360,
"w4":0,
"pa6":-90, "pb7":160 ,
"v0":0, "v1":1
},
"seg5":360,
"w4":[-90,-20],
"ra2":160,
"dots":0,
"hc":90,"hs":450,
"cf":654,"co":0.5,"cs":450,"cw":0.01,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"fuel":2,
},
{
"gid":"xsf","cid":"rocket3",
"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1, "tw":0,
"m1":-7.66,"m2":-3.1,"n1":16.24,"n2":5.98,"n3":17,"a":8.98,"b":0.19,
// "m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":17,"a":0.98,"b":8.19,
// "m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":2,"b":1,
"dx":490,
"dy":300,
"df":{
"dx":0,
"dy":0,
"tx":0,
"ty":0,
"num":1,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 6,
"ra2":200,
"seg5":360,
"w4":0,
"pa6":-90, "pb7":160 ,
"v0":0, "v1":1
},
"seg5":360,
"w4":[-90,-20],
"ra2":160,
"hc":90,"hs":450,
"cf":794,"co":0.5,"cs":450,"cw":0.01,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"fuel":1,
},
],
// light: {"gid":"xsf","cid":"0random","m1":-1.172844926046709,"m2":[18.202117701694753,22],"n1":4.8971667433713755,"n2":10.18108914298886,"n3":1.170017720503214,"a":-4.961653504761162,"b":-6.393658109914263,"tx":300,"ty":200,"seg5":360,"w4":90,"ra2":100,"dots":0,"fuel":0,"hc":0,"cf":900,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
random: [
{
"cid":"rect1",
"m1": 4, "m2": 4, "n1": 100, "n2": 100, "n3": 100, "a": 1, "b": 2,
"tx":160, "ty":195,
"w4": -4, "ra2":200,
"kx":1.3,"ky":1.0,
"cf":60, "cs":650,
},
{
"cid":"rect2",
"m1": 4, "m2": 4, "n1": 100, "n2": 100, "n3": 100, "a": 1, "b": 2,
"tx":435, "ty":195,
"w4": 4, "ra2":200,
"kx":1.3,"ky":1.0,
"cf":60, "cs":650,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random11",
"tx":100, "ty":85,
"m1": [1001, 1002], "m2": 1001, "n1": 1001, "n2": 1001, "n3": 1001, "a":[1001, 1002], "b": 1001,
"w4": 75, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":450, "cs":650,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random12",
"tt":{"td":1000},
"tx":200, "ty":65,
"m1": [1001, 1002], "m2": 1001, "n1": 1001, "n2": 1001, "n3": 1001, "a":[1001, 1002], "b": 1001,
"w4": 75, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":450, "cs":650,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random13",
"tx":400, "ty":65,
"m1": 1001, "m2": 1001, "n1": [1001, 1002], "n2": 1001, "n3": 1001, "a":1001, "b": [1001, 1002],
"w4": 105, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":950, "cs":450,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random14",
"tx":500, "ty":85,
"m1": 1001, "m2": 1001, "n1": [1001, 1002], "n2": 1001, "n3": 1001, "a":1001, "b": [1001, 1002],
"w4": 105, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":950, "cs":450,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random21",
"tx":110, "ty":210,
"m1": 1001, "m2": 1001, "n1": 1001, "n2": [1001, 1002], "n3": 1001, "a":1001, "b": [1001, 1002],
"w4": 75, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":450, "cs":650,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random22",
"tx":210, "ty":190,
"m1": 1001, "m2": 1001, "n1": 1001, "n2": [1001, 1002], "n3": 1001, "a":1001, "b": [1001, 1002],
"w4": 75, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":450, "cs":650,
},
{
"tt":{"td":1000},
"cid":"random23",
"tx":390, "ty":190,
"m1": 1001, "m2": 1001, "n1": [1001, 1002], "n2": 1001, "n3": 1001, "a":[1001, 1002], "b": 1001,
"w4": 105, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":950, "cs":450,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random24",
"tx":490, "ty":210,
"m1": 1001, "m2": 1001, "n1": [1001, 1002], "n2": 1001, "n3": 1001, "a":[1001, 1002], "b": 1001,
"w4": 105, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":950, "cs":450,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random31",
"tx":130, "ty":335,
"m1": [1001, 1002], "m2": 1001, "n1": [1001, 1002], "n2": 1001, "n3": [1001, 1002], "a":1001, "b": 1001,
"w4": 75, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":450, "cs":650,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"tx":230, "ty":315,
"m1": [1001, 1002], "m2": 1001, "n1": [1001, 1002], "n2": 1001, "n3": [1001, 1002], "a":1001, "b": 1001,
"w4": 75, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":450, "cs":650,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random33",
"tx":370, "ty":315,
"m1": 1001, "m2": [1001, 1002], "n1": 1001, "n2": [1001, 1002], "n3": 1001, "a":1001, "b": [1001, 1002],
"w4": 105, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":950, "cs":450,
},
{
"tt":{"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"random34",
"tx":470, "ty":335,
"m1": 1001, "m2": [1001, 1002], "n1": 1001, "n2": [1001, 1002], "n3": 1001, "a":1001, "b": [1001, 1002],
"w4": 105, "ra2":50,
"v0":0,"v1":1,
"kx":1.0,"ky":1.0,
"cf":950, "cs":450,
},
],
// fly: {"gid":"xsf","cid":"random","m1":9.376323695575222,"m2":5.207981871992011,"n1":15.734896690518418,"n2":-19.083784893678548,"n3":-16.52796710191664,"a":-2.974024535303874,"b":13.640515798226618,"tx":320,"ty":105.26838333337865,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":40,"cf":54,"cs":450,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":270.4133841801238,"hs":450,"ky":1}
// heart: {"gid":"xsf","cid":"random","m1":212,"m2":1.1211775962968318,"n1":-11.744692494126161,"n2":15.210815368997501,"n3":14.824726897055456,"a":-11.094747628719608,"b":13.566224533623927,"tx":320,"ty":105.26838333337865,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":40,"cf":54,"cs":450,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":270.4133841801238,"hs":450,"ky":1}
// head: {"gid":"xsf","cid":"random","m1":4.860489698459833,"m2":15.218805823025487,"n1":8.148189953352869,"n2":-15.20991195267559,"n3":12.487689723947373,"a":1.5105212785935063,"b":7.038922511476926,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":40,"cf":54,"cs":450,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":289.51872461420805,"hs":450}
//
// plane: {"gid":"xsf","cid":"random","m1":-76,"m2":-59,"n1":-25,"n2":-1.883857565749416,"n3":15.68332653295431,"a":-4.568705718909474,"b":19.92454765940593,"tx":340,"ty":165,"seg5":360,"w4":270,"ra2":142,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":0}
// bull: {"gid":"xsf","cid":"random","m1":-6.744785008345344,"m2":-15.726333569625242,"n1":7.5902764893744745,"n2":2.224359017018971,"n3":3.057895646237103,"a":11.64302225758214,"b":14.543195340709172,"tx":320,"ty":125.82187083332565,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":40,"cf":54,"cs":450,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":206.94209625729403,"hs":450,"ky":1}
// egg: {"gid":"xsf","cid":"0random","m1":1.83469919704737,"m2":-2.878857416364893,"n1":0.30737943915095034,"n2":-3.7020289748145503,"n3":8.960611152036687,"a":-7.596071446547736,"b":-8.015245090640708,"tx":300,"ty":200,"seg5":360,"w4":273,"ra2":100,"dots":0,"fuel":0,"hc":0,"cf":900,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
eyes: [
{"gid":"xsf","cid":"000random","m1":4,"m2":[0,1],"n1":2.6,"n2":7,"n3":10,"a":10.5,"b":5.43,"tx":300,"ty":200,"seg5":360,"w4":90,"ra2":100,"dots":0,"fuel":0,"hc":0,"cf":900,"cs":[10,400],"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1
},
],
// http://www.thisiscolossal.com/2015/11/blooms-of-insect-wings-created-by-photographer-seb-janiak/
// warrior: {"gid":"xsf","cid":"random","m1":4.96,"m2":15.36,"n1":16.16,"n2":-14.23,"n3":-9.48,"a":16.32,"b":15.52,"tx":300,"ty":200,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":900,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1},
// {"gid":"xsf","cid":"random","m1":17.63,"m2":11.29,"n1":-18.88,"n2":13.95,"n3":18.07,"a":-12.99,"b":4.38,"tx":300,"ty":200,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":900,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// lemon: {"gid":"xsf","cid":"random","m1":-13.59,"m2":-4.33,"n1":19.89,"n2":3.65,"n3":3.26,"a":-16.04,"b":6.6,"tx":300,"ty":200,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":900,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// wing: {"gid":"xsf","cid":"random","m1":-8.95,"m2":18.74,"n1":9.07,"n2":2.01,"n3":-13.07,"a":16.35,"b":0.1,"tx":300,"ty":200,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":900,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// eagle: {"gid":"xsf","cid":"random","m1":-4.09,"m2":-9.95,"n1":7.8,"n2":11,"n3":14.3,"a":-11.18,"b":-6.34,"tx":300,"ty":200,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":900,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// stick : {"gid":"xsf","cid":"random","m1":144,"m2":-5.07,"n1":16.62,"n2":[55,79],"n3":19.57,"a":18.94,"b":16.18,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":538,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// doubleface: {"gid":"xsf","cid":"random","m1":-17.52,"m2":4.38,"n1":15.44,"n2":7.79,"n3":7.18,"a":13.67,"b":15.08,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":500,"cf":54,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"hs":600,"ho":1,"t":399.27}
comps1317:[
{
"tt":{"td":1000},
"cid":"comp1",
"m1":-17.61,"m2":-15.18,"n1":3.5,"n2":-3.89,"n3":-12.66,"a":10.14,"b":6.26,
"w4":[90, 90],"ra2":90,"seg5":360,
"dots":0,"fuel":0,
"tx":150,"ty":100,
"hc":500,
"cf":[300,590],"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{"gid":"xsf","cid":"comp2",
"m1":-12.71,"m2":14.92,"n1":8.57,"n2":-4.84,"n3":-13.08,"a":-11.7,"b":11.88,
"tx":300,"ty":100,
"seg5":360,"w4":90,"ra2":90,"dots":0,"fuel":0,
"hc":500,
"cf":590,"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{"gid":"xsf","cid":"comp3",
"m1":-16.63,"m2":-0.06,"n1":11.97,"n2":-13.12,"n3":-13.13,"a":7.28,"b":6.66,
"tx":450,"ty":100,
"seg5":360,"w4":90,"ra2":90,"dots":0,"fuel":0,
"hc":500,
"cf":[400,590],"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"comp4",
"m1":-2.59,"m2":-7.76,"n1":14.51,"n2":11.72,"n3":4.37,"a":-17.2,"b":-13.98,
"w4":[90, 90],"ra2":90,"seg5":360,
"dots":0,"fuel":0,
"tx":150,"ty":300,
"hc":500,
"cf":590,"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"comp5",
"m1":-19.42,"m2":-0.57,"n1":-10.5,"n2":-5.89,"n3":17.27,"a":-8.42,"b":11.36,
"tx":300,"ty":300,
"seg5":360,"w4":90,"ra2":90,"dots":0,"fuel":0,
"hc":500,
"cf":590,"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{"gid":"xsf","cid":"comp6",
"m1":3.34,"m2":10.22,"n1":13.3,"n2":-0.79,"n3":-16.11,"a":-9.45,"b":-3.01,
"tx":450,"ty":300,
"seg5":360,"w4":90,"ra2":90,"dots":0,"fuel":0,
"hc":500,
"cf":600,"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{"gid":"xsf","cid":"comp7",
"m1":-4.39,"m2":5.54,"n1":-10.1,"n2":-2.02,"n3":17.75,"a":-16.59,"b":-10.04,
"tx":520,"ty":40,
"seg5":360,"w4":90,"ra2":60,"dots":0,"fuel":0,
"hc":500,
"cf":590,"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{"gid":"xsf","cid":"comp8",
"m1":9.57,"m2":1.03,"n1":16.67,"n2":12.96,"n3":12.83,"a":-12.09,"b":-9.49,
"tx":230,"ty":200,
"seg5":360,"w4":90,"ra2":90,"dots":0,"fuel":0,
"hc":500,
"cf":590,"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{"gid":"xsf","cid":"comp9",
"m1":15.93,"m2":3.91,"n1":16.84,"n2":9.26,"n3":9.74,"a":-0.92,"b":-15,
"tx":380,"ty":200,
"seg5":360,"w4":90,"ra2":40,"dots":0,"fuel":0,
"hc":500,
"cf":590,"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{"gid":"xsf","cid":"comp10",
"m1":-0.84,"m2":11.05,"n1":19.46,"n2":-18.47,"n3":4.52,"a":0.31,"b":-8.04,
"tx":510,"ty":200,
"seg5":360,"w4":90,"ra2":40,"dots":0,"fuel":0,
"hc":500,
"cf":590,"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
}
,
{"gid":"xsf","cid":"comp11",
"m1":-5.83,"m2":0.17,"n1":3.03,"n2":4.61,"n3":-12.9,"a":19.48,"b":18.45,
"tx":110,"ty":200,
"seg5":360,"w4":90,"ra2":40,"dots":0,"fuel":0,
"hc":500,
"cf":600,"cs":400,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
}
],
pentagons:[
{
"td":18000,"t0":0,"t1":300,"t2":1,"t3":1,
"cid":"pentagon11",
"m1":5,"m2":5,"n1":1000,"n2":600,"n3":600,"a":1,"b":1,
"tx":[[[100,310]]],"ty":[[[100,200]]],
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[40,80]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[1,999]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon12",
"m1":5,"m2":5,"n1":331,"n2":585,"n3":585,"a":1,"b":1,
"tx":[[[225,310]]],"ty":[[[100,200]]],
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[40,80]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[1,999]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon13",
"m1":5,"m2":5,"n1":144,"n2":585,"n3":585,"a":1,"b":1,
"tx":[[[350,310]]],"ty":[[[100,200]]],
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[40,80]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[1,999]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon14",
"m1":-144,"m2":134,"n1":1000,"n2":600,"n3":600,"a":1,"b":1,
"tx":[[[475,310]]],"ty":[[[100,200]]],
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[40,80]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[1,999]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon21",
"m1":5,"m2":5,"n1":9,"n2":7,"n3":7,"a":1,"b":1,
"tx":[[[100,310]]],"ty":[[[300,200]]],
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[40,80]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[1,999]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon22",
"m1":5,"m2":5,"n1":1000,"n2":600,"n3":600,"a":1,"b":1,
"tx":[[[225,310]]],"ty":[[[300,200]]],
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[40,80]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[1,999]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1000
},
{
"td":18000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon23",
"m1":5,"m2":5,"n1":1000,"n2":8,"n3":600,"a":1,"b":1,
"tx":[[[350,310]]],"ty":[[[300,200]]],
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[40,80]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[1,999]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":144,
},
{
"td":18000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon24",
"m1":5,"m2":5,"n1":42,"n2":600,"n3":600,"a":1,"b":1,
"tx":[[[475,310]]],"ty":[[[300,200]]],
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[40,80]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[1,999]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"td":18000,"t0":300,"t1":1000, "t2":1, "t3":10,
"cid":"pentagon11",
"m1": 5, "m2": 5, "n1": 1000, "n2": 600, "n3": 600, "a": 1, "b": 1,
"tx":310,"ty":200,
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[60,280, 40]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[100,999, 0, 100]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":300,"t1":1000, "t2":1, "t3":10,
"cid":"pentagon12",
"m1":5,"m2":5,"n1":331,"n2":585,"n3":585,"a":1,"b":1,
"tx":310,"ty":200,
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[80,280, 40]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[200,999, 0, 200]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":300,"t1":1000, "t2":1, "t3":10,
"cid":"pentagon13",
"m1":5,"m2":5,"n1":144,"n2":585,"n3":585,"a":1,"b":1,
"tx":310,"ty":200,
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[100,280, 40]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[300,999, 0, 300]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":300,"t1":1000, "t2":1, "t3":10,
"cid":"pentagon14",
"m1":-144,"m2":134,"n1":1000,"n2":600,"n3":600,"a":1,"b":1,
"tx":310,"ty":200,
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[40,80]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[1,999]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":300,"t1":1000, "t2":1, "t3":10,
"cid":"pentagon21",
"m1":5,"m2":5,"n1":9,"n2":7,"n3":7,"a":1,"b":1,
"tx":310,"ty":200,
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[120,280, 40]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[400,999, 0, 400]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"td":18000,"t0":300,"t1":1000, "t2":1, "t3":10,
"cid":"pentagon22",
"m1":5,"m2":5,"n1":1000,"n2":600,"n3":600,"a":1,"b":1,
"tx":310,"ty":200,
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[140,280, 40]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[500,999, 0, 500]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1000,
},
{
"td":18000,"t0":300,"t1":1000, "t2":1, "t3":10,
"cid":"pentagon23",
"m1":5,"m2":5,"n1":1000,"n2":8,"n3":600,"a":1,"b":1,
"tx":310,"ty":200,
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[160,280, 40]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[600,999, 0, 600]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":144,
},
{
"td":18000,"t0":300,"t1":1000, "t2":1, "t3":10,
"cid":"pentagon24",
"m1":5,"m2":5,"n1":42,"n2":600,"n3":600,"a":1,"b":1,
"tx":310,"ty":200,
"w4": [[[0,360]]],
"seg5":360,
"ra2":[[[180,280, 40]]],
"dots":0,"fuel":0,
"hc":0,
"cf":[[[700,999, 0, 600]]],"cs":[[[400,500]]],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
// circle {"gid":"xsf","cid":"00comp11","m1":178,"m2":280,"n1":280,"n2":314,"n3":-93,"a":1,"b":8,"tx":340,"ty":165,"seg5":360,"w4":0,"ra2":150,"dots":0,"fuel":0,"hc":500,"cf":54,"cs":400,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":381,"tt":301.8}
// eyes on a {"gid":"xsf","cid":"0random","m1":1.56,"m2":-3.76,"n1":21,"n2":-32,"n3":-41,"a":36,"b":-13.97,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":433.63,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"tt":221.58}
forms:[
{
"gid":"xsf","cid":"random",
"m1":-3.3,"m2":-8,"n1":-8,"n2":9,"n3":9,"a":15.56,"b":11.84,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"random",
"m1":-3.49,"m2":-2.82,"n1":18.76,"n2":19.8,"n3":16.04,"a":-14.35,"b":10.88,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"random",
"m1":-19.53,"m2":6.37,"n1":17.73,"n2":-6.9,"n3":0.98,"a":0.49,"b":-8.49,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"random",
"m1":12.35,"m2":-9.73,"n1":14.12,"n2":-6.99,"n3":2.16,"a":0.08,"b":-19.91,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
lights:[
{
"gid":"xsf","cid":"l1",
"m1":-25,"m2":-330,"n1":382,"n2":[324,244],"n3":9,"a":-8,"b":144,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"l2",
"m1":-1.3,"m2":15.37,"n1":25,"n2":42,"n3":12.14,"a":12.72,"b":3.62,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"l3",
"m1":212,"m2":-93,"n1":[1,10],"n2":178,"n3":9,"a":-25,"b":-25,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,
"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"l4",
"m1":212,"m2":-93,"n1":[1,10],"n2":178,"n3":9,"a":-25,"b":-25,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
heads:[
{
"gid":"xsf","cid":"random",
"m1":-1.18,"m2":12.37,"n1":7.15,"n2":7.99,"n3":5.86,"a":5.52,"b":-14.37,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
}
],
suns:[
{
"gid":"xsf","cid":"random",
"m1":144,"m2":161,"n1":8,"n2":8,"n3":14.19,"a":-4.62,"b":-12.8,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
}
],
geos:[
{
"gid":"xsf","cid":"f1",
"m1":-25,"m2":-364,"n1":11.79,"n2":6.8,"n3":-5.65,"a":18.54,"b":-3.37,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":432,
},
{
"gid":"xsf","cid":"f2",
"m1":-25,"m2":-568,"n1":32,"n2":-42,"n3":161,"a":8,"b":-3.37,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":432,
},
{
"gid":"xsf","cid":"f3",
"m1":7,"m2":2,"n1":13,"n2":10,"n3":11,"a":-14,"b":6,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":432,
},
{
"gid":"xsf","cid":"f4",
"m1":3.66,"m2":-5.43,"n1":1.87,"n2":1.24,"n3":17.79,"a":-16.69,"b":0.96,
"tx":340,"ty":165,
"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":432,
},
],
// face ** {"gid":"xsf","cid":"random","m1":551,"m2":2.89,"n1":16.46,"n2":-7.55,"n3":-0.96,"a":-17.55,"b":-11.13,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":466,"td":1000,"hs":550,"ho":1}
// flower {"gid":"xsf","cid":"0random","m1":10,"m2":-9.73,"n1":14.12,"n2":-6.99,"n3":2.16,"a":0.08,"b":-19.91,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,"co":0.31,"tt":254.81,"hs":400}
zs:[
{
"cid":"zs11a", // flower big
"m1":16,"m2":16,"n1":-7,"n2":9,"n3":[16.5,16.5],"a":-25,"b":11.1,
"tx":310,"ty":292,
"seg5":360,"w4":[0,0],"ra2":[0,99],"dots":0,"fuel":0,
"hc":0,
"cf":[-4000,-1],"cs":1,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs11b", // flower small
"m1":16,"m2":16,"n1":-7,"n2":9,"n3":[8,8],"a":-25,"b":11.1,
"tx":310,"ty":292,
"seg5":360,"w4":[0,0],"ra2":[0,86],"dots":0,"fuel":0,
"hc":0,
"cf":[-4000,-1],"cs":1,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{ // flower border
"cid":"zs11c",
"m1":16,"m2":16,"n1":-14.93,"n2":[2,5.4],"n3":6,"a":-25,"b":26,
"tx":310,"ty":292,
"seg5":360,"w4":[0,0],"ra2":[0,99],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs11d", // cross
"m1":4,"m2":4,"n1":[1,0.5],"n2":1,"n3":1,"a":1,"b":1,
"tx":310,"ty":292,
"seg5":360,"w4":0,"ra2":[0,12],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs12", // trebol
"m1":-8,"m2":-76,"n1":76,"n2":-76,"n3":144,"a":-144,"b":60,
"tx":310,"ty":80,
"seg5":360,"w4":0,"ra2":[0,21],"dots":0,"fuel":0,
"hc":0,
"cf":[-2000,-1],"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{ // cross trebol
"cid":"zs13",
"m1":-8,"m2":-42,"n1":18,"n2":-76,"n3":144,"a":-144,"b":60,
"tx":310,"ty":80,
"seg5":360,"w4":45,"ra2":[0,18],"dots":0,"fuel":0,
"hc":0,
"cf":[-2000,-1],"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{ // circle high
"cid":"zs14",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":310,"ty":80,
"seg5":360,"w4":45,"ra2":[0,28],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,"co":[0,1],
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs15", // circle high small
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":310,"ty":80,
"seg5":360,"w4":45,"ra2":[0,22],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs16", // romboid high
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":4,"b":1.5,
"tx":310,"ty":80,
"seg5":360,"w4":0,"ra2":[0,92],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs17", // romboid right
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":4,"b":3,
"tx":381,"ty":152,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs18", // romboid center
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":4,"b":3,
"tx":310,"ty":150,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{ // romboid left
"cid":"zs19",
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":4,"b":3,
"tx":238,"ty":149,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs21", // ellipse right
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":4,"b":3.3,
"tx":381,"ty":152,
"seg5":360,"w4":0,"ra2":[0,32],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs22", // ellipse center
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":4,"b":3.3,
"tx":310,"ty":150,
"seg5":360,"w4":0,"ra2":[0,32],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs23", // ellipse left
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":4,"b":3.3,
"tx":238,"ty":149,
"seg5":360,"w4":0,"ra2":[0,32],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs24", // circle center
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":310,"ty":292,
"seg5":360,"w4":0,"ra2":[0,20],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs25", // circle center
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":310,"ty":292,
"seg5":360,"w4":0,"ra2":[0,15],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs26", // square
"m":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"tx":310,"ty":292,
"seg5":360,"w4":0,"ra2":[145,145],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs27", // dot
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":310,"ty":292,
"seg5":360,"w4":0,"ra2":[0,2],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs28", // rect high
"m":4,"n1":100,"n2":100,"n3":100,"a":4,"b":1.2,
"tx":310,"ty":150,
"seg5":360,"w4":0,"ra2":108,"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs29", // rect center
"m":4,"n1":100,"n2":100,"n3":100,"a":4,"b":1.3,
"tx":310,"ty":79,
"seg5":360,"w4":0,"ra2":108,"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs30", // ellipse right 1
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":450,"ty":84,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs40", // romboid right 1
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":450,"ty":84,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs31", // ellipse right 2
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":450,"ty":150,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs41", // romboid right 2
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":450,"ty":150,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs32", // ellipse right 3
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":451,"ty":218,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs42", // romboid right 3
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":451,"ty":218,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs33", // ellipse right 4
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":451,"ty":293,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs43", // romboid right 4
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":451,"ty":293,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs34", // ellipse right 5
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":452,"ty":361,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs44", // ellipse right 5
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":452,"ty":361,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs50", // ellipse right 1
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":166,"ty":78,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs60", // romboid left 1
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":166,"ty":78,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs51", // ellipse left 2
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":167,"ty":150,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs61", // romboid left 2
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":167,"ty":150,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs52", // ellipse left 3
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":166,"ty":221,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs62", // romboid left 3
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":166,"ty":221,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs53", // ellipse left 4
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":163,"ty":291,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs63", // romboid right 4
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":163,"ty":291,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs54", // ellipse left 5
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":3.35,"b":4,
"tx":162,"ty":364,
"seg5":360,"w4":0,"ra2":[0,33],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":0,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs64", // romboid left 5
"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":3,"b":4,
"tx":162,"ty":364,
"seg5":360,"w4":0,"ra2":[0,23],"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":[1000,400],"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
{
"cid":"zs70", // square
"m":4,"n1":100,"n2":100,"n3":100,"a":0.98,"b":1,
"tx":308,"ty":210,
"seg5":348,"w4":0,"ra2":261,"dots":0,"fuel":0,
"hc":0,
"cf":-54,"cs":100,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
],
blackhole:[
{
"cid":"zs21",
"m1":-11.77,"m2":602,"n1":5.08,"n2":4.05,"n3":6.65,"a":9.58,"b":-4.73,
"tx":340,"ty":165,
"seg5":360,"w4":0,"ra2":160,"dots":0,"fuel":0,
"hc":0,
"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
// cone {"gid":"xsf","cid":"0zs21","m1":1,"m2":1,"n1":2,"n2":9,"n3":721,"a":-59,"b":0.18,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// cone 2 {"gid":"xsf","cid":"0zs21","m1":1,"m2":1,"n1":958,"n2":-144,"n3":721,"a":93,"b":0.18,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// semicircle {"gid":"xsf","cid":"0zs21","m1":1,"m2":1,"n1":0.8,"n2":1,"n3":-8,"a":1,"b":0,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// semicircle 2 {"gid":"xsf","cid":"0zs21","m1":1,"m2":1,"n1":1000,"n2":-25,"n3":-42,"a":-102,"b":0,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// packman on b {"gid":"xsf","cid":"0zs21","m1":1,"m2":1,"n1":1000,"n2":-25,"n3":-110,"a":-59,"b":-59,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// heart
],
// {"gid":"xsf","cid":"random","m1":-4.77,"m2":-13.59,"n1":-5.4,"n2":4.85,"n3":11.84,"a":-14.73,"b":-1.82,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// face {"gid":"xsf","cid":"random","m1":6.18,"m2":4.68,"n1":3.02,"n2":3.43,"n3":-5.98,"a":-15.62,"b":15.37,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// {"gid":"xsf","cid":"random","m1":0.55,"m2":-0.93,"n1":0.31,"n2":-6.75,"n3":-4.14,"a":-16.91,"b":8.54,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// flower {"gid":"xsf","cid":"random","m1":-15.29,"m2":-2.56,"n1":2.09,"n2":-1.25,"n3":17.93,"a":4.95,"b":0.6,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// {"gid":"xsf","cid":"random","m1":-6.9,"m2":-6.79,"n1":7.04,"n2":-8.75,"n3":-15.26,"a":9.16,"b":19.05,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// base {"gid":"xsf","cid":"random","m1":4,"m2":13.59,"n1":18.37,"n2":18.23,"n3":17.84,"a":4.04,"b":9.26,"tx":340,"ty":165,"seg5":360,"w4":90,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":473.18,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
// arrow {"gid":"xsf","cid":"random","m1":3,"m2":5,"n1":1,"n2":1,"n3":1,"a":1,"b":1,"tx":340,"ty":165,"seg5":360,"w4":0,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":54,"cs":1000,"cw":1,"pa6":0,"pb7":-1,"v0":0,"v1":1}
apple:[
{
"cid":"zs21",
"m1":-2.53,"m2":7.51,"n1":16.41,"n2":-18.84,"n3":6.9,"a":-15.22,"b":12.26,
"tx":340,"ty":165,
"seg5":360,"w4":-90,"ra2":160,"dots":0,"fuel":0,
"hc":0,
"cf":54,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1
},
],
wavesand:[
{
"cid":"spiral2",
"tt":{"td":9000,"t0":0,"t1":1000,"t2":60,"t3":1},
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[90, 90],"ra2":120,"seg5":360,
"tx":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":0,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-6,
"v0":0,"v1":-12,
},
]],
"ty":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-6,
"v0":0,"v1":-12,
}
]],
"ra2":15,
"hc":500,"hs":400,
"pa6":0,"pb7":-1,
"cf":550,"cs":850,
},
{
"cid":"spiral3",
"tt":{"td":9000,"t0":0,"t1":1000,"t2":60,"t3":1},
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[90, 90],"ra2":120,"seg5":360,
"tx":[[
{
"tx":400,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":0,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-1,
"v0":1,"v1":-3,
},
]],
"ty":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-1,
"v0":1,"v1":-3,
}
]],
"ra2":15,
"hc":500,"hs":400,
"pa6":0,"pb7":-1,
"cf":550,"cs":850,"cw":0.1,
},
],
wavesand:[
{
"cid":"spiral2",
"tt":{"td":9000,"t0":0,"t1":1000,"t2":60,"t3":1},
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[90, 90],"ra2":120,"seg5":360,
"tx":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":0,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-6,
"v0":0,"v1":1,
},
]],
"ty":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-6,
"v0":0,"v1":-12,
}
]],
"ra2":15,
"hc":500,"hs":400,
"pa6":0,"pb7":-1,
"cf":550,"cs":850,
},
// {
// "cid":"spiral3",
// "tt":{"td":9000,"t0":0,"t1":1000,"t2":60,"t3":1},
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "w4":[90, 90],"ra2":120,"seg5":360,
// "tx":[[
// {
// "tx":400,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "w4":0,
// "ra2":90,"seg5":360,
// "pa6":0,"pb7":-1,
// "v0":1,"v1":-3,
// },
// ]],
// "ty":[[
// {
// "tx":200,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "w4":90,
// "ra2":90,"seg5":360,
// "pa6":0,"pb7":-1,
// "v0":1,"v1":-3,
// }
// ]],
// "ra2":15,
// "hc":500,"hs":400,
// "pa6":0,"pb7":-1,
// "cf":550,"cs":850,"cw":0.1,
// },
],
spirograph:[{
"tt":{"td":9000,"t0":0,"t1":1000,"t2":100,"t3":1},
"cid":["f0","f1"],
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[12,9,12],"b":[6,6],
"tx":100,
"ty":[100,100],
"w4":[-360,360],
"ra2":[90,0],"seg5":360,
"cf":[-1],"cs":450,"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"tt":{"td":9000,"t0":0,"t1":1000,"t2":500,"t3":1},
"cid":["f2","f3"],
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[12,12],"b":[6,6],
"tx":300,
"ty":[100,100],
"w4":[0,180],
"ra2":[90,90],"seg5":360,
"cf":[111],"cs":[999,500],"co":[0.7,1],
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"fuel":0
},
{
"tt":{"td":9000,"t0":0,"t1":1000,"t2":1,"t3":100},
"cid":["f4","f5"],
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[12,12],"b":[6,6],
"tx":100,
"ty":[300,300],
"w4":[0,360],
"ra2":[90,0],"seg5":360,
"cf":-1,"cs":[999,0],"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"tt":{"td":9000,"t0":0,"t1":1000,"t2":250,"t3":1},
"cid":["f7","f8"],
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[12,12],"b":[6,6],
"tx":300,
"ty":[300,300],
"w4":[0,360],
"ra2":[90,90],"seg5":360,
"cf":-1,"cs":[0,999],"co":0,
"pa6":0,"pb7":-1,
"v0":1,"v1":-1,
},
{
"tt":{"td":9000,"t0":0,"t1":1000,"t2":250,"t3":1},
"cid":["f9","f10"],
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[12,12],"b":[6,6],
"tx":500,
"ty":100,
"w4":[0,360],
"ra2":[90,90],"seg5":360,
"cf":-1,"cs":[0,999],"co":0,
"pa6":0,"pb7":-1,
"v0":1,"v1":-4,
},
{
"tt":{"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":["f11","f12"],
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[12,12],"b":[6,6],
"tx":[500,
{"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"tx":0,"ty":0,
"ra2":60,
}],
"ty":300,
"w4":[0,360],
"ra2":[90,0],"seg5":360,
"cf":-1,"cs":[0,999],"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
ellipses:[
// 11
{
"cid":[11,12],
"tt":{"td":9000,"t0":0,"t1":1000,"t2":200,"t3":1},
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[12,12],"b":[6,6],
"tx":[[50,
{
"tx":150,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"w4":0,
"ra2":90,
}]],
"ty":[[0,
{
"tx":100,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"ra2":90,
"w4":90,
}]],
"w4":[0,0],
"ra2":[60,60],"seg5":360,
"cf":-1,"cs":[0,0],"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
// 12
{
"cid":[21,22],
"tt":{"td":9000,"t0":0,"t1":1000,"t2":100,"t3":1},
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[3,12,3],"b":[3,3],
"tx":[[0,
{
"tx":450,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"w4":0,
"ra2":90,
}]],
"ty":[[0,
{
"tx":100,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"ra2":90,
"w4":90,
}]],
"w4":[0,180],
"ra2":[60,60],"seg5":360,
"cf":-1,"cs":[0,999],"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
// 21
{
"cid":[31,32],
"tt":{"td":9000,"t0":0,"t1":1000,"t2":200,"t3":1},
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[4,1,4,1],"b":[9,9],
"tx":[[50,200],
{
"tx":5,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"w4":0,
"ra2":9,
// "pa6":45,"pb7":165,
}],
"ty":[[0,
{
"tx":300,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"ra2":9,
"w4":90,
// "pa6":45,"pb7":165,
}]],
"w4":[0,180],
"ra2":[50,50],"seg5":360,
"cf":-1,"cs":[0,999],"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
// 22
{
"cid":[41,42],
"tt":{"td":9000,"t0":0,"t1":-1000,"t2":200,"t3":1},
"m1":[4,4],"m2":[4,-4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[6,6],"b":[12,12],
"tx":[[50,
{
"tx":450,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"w4":0,
"ra2":90,
"pa6":0,"pb7":180,
}]],
"ty":[[0,
{
"tx":300,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"ra2":90,
"w4":90,
"pa6":45,"pb7":135,
}]],
"w4":[90,90],
"ra2":[50,50],"seg5":360,
"cf":999,"cs":0,"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
// 23
{
"cid":[61,61],
"tt":{"td":9000,"t0":0,"t1":1000,"t2":200,"t3":1},
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[9,9],"b":[4,1,4,1],
"tx":[[50,
{
"tx":300,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"w4":0,
"ra2":30,
"pa6":45,"pb7":90,
}]],
"ty":[[0,
{
"tx":350,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"ra2":9,
"w4":90,
"pa6":45,"pb7":90,
}]],
"w4":[-60,60],
"ra2":[50,50],"seg5":360,
"cf":-1,"cs":[0,0],"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
// 24
{
"cid":[71,71],
"tt":{"td":9000,"t0":0,"t1":1000,"t2":200,"t3":1},
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[9,9],"b":[0.1,0.1],
"tx":[[50,
{
"tx":300,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"w4":0,
"ra2":30,
"pa6":45,"pb7":90,
}]],
"ty":[[0,
{
"tx":350,
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 9, "b": 6,
"ra2":9,
"w4":90,
"pa6":45,"pb7":90,
}]],
"w4":[-150,150],
"ra2":[50,50],"seg5":360,
"cf":-1,"cs":[0,0],"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
spiro:[
// 11
{
"cid":[110,111],
"tt":{"td":1000,"t0":0,"t1":1000,"t2":200,"t3":1},
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[1,1],"b":[1,1],
"tx":[[175,175]],
"ty":[[200,200]],
"w4":[0,0],
"ra2":[120,120],"seg5":360,
"cf":-1,"cs":[0,0],"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
// 12
{
"cid":[121,122],
"tt":{"td":1000,"t0":0,"t1":1000,"t2":50,"t3":1},
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[1,1],"b":[1,1],
"tx":[[
{
"tx":175,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":0,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-1,
"v0":1,"v1":2,
},
]],
"ty":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-1,
"v0":1,"v1":2,
}
]],
"w4":[0,0],
"ra2":[10,10],"seg5":360,
"cf":-1,"cs":[0,0],"co":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
// 13
{
"cid":[131,131],
"tt":{"td":3000,"t0":0,"t1":1000,"t2":1,"t3":1},
"m1":[4,4],"m2":[4,4],"n1":[2,2],"n2":[2, 2],"n3":[2,2],"a":[1,1],"b":[1,1],
"tx":[
{
"tx":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":4,
"w4":90,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"tx":425,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":4,
"w4":0,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
"ty":[[
{
"tx":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":4,
"w4":90,
"ra2":90,"seg5":360,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
}
]],
"w4":[0,360],
"ra2":[10,10],"seg5":360,
"cf":-1,"cs":[0,0],"co":0,
"pa6":0,"pb7":-1,
"hc":500,
"v0":0,"v1":1,
},
],
waves:[
{"cid":"ship","m1":2.85,"m2":2.85,"n1":2.85,"n2":6,"n3":10.02,"a":3.73,"b":1,"w4":90
,"tx":[350,350],"ty":[245,270]
,"ra2":40,"seg5":360,"cf":[50,55], "pa6":0, "pb7":-1 },
{"cid":"see","m1":19.8,"m2":19.8,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6,"tx":[330,330],"ty":[770,800],"w4":[90,270],"ra2":[600,600],"seg5":360,"cf":[95,99]},
{"cid":"sun","m1":[6,40],"m2":[6,40],"n1":[100,120],"n2":[200,220],"n3":[200,230],"a":1,"b":1,"tx":[60,500],"ty":[175,90],"w4":[90,360],"ra2":[30,130],"seg5":360,"cf":[5,50]},
{"cid":"drop1", "m1": 1.1, "m2": 1.1, "n1": 0.5, "n2": .5, "n3": .5, "a": 1, "b": 1, "w4": 90, "cf":[25,45], "tx":[330,330],"ty":[70,600],"ra2":[20,60], "seg5":360},
{"cid":"drop2", "m1": 1.2,"m2": 1.2, "n1": 0.5, "n2": .5, "n3": .5, "a": 1, "b": 1, "w4": 90, "cf":[15,35], "tx":[300,310],"ty":[75,600],"ra2":[10,20], "seg5":360},
{"cid":"drop3", "m1": 1.1,"m2": 1.1, "n1": 0.5, "n2": .5, "n3": .5, "a": 1, "b": 1, "w4": 90, "cf":[15,35], "tx":[280,295],"ty":[65,600],"ra2":[10,30], "seg5":360},
],
face:[
{"t0":0, "t1":80, "cid":"pencil","m1":3.27,"m2":3.27,"n1":4.12,"n2":10.9,"n3":2.93,"a":5.34,"b":14.1
,"tx":
{"tx":345,"ty":170,"m1":20,"m2":20,"n1":25,"n2":2.85,"n3":2,"a":9,"b":6, "ra2":160, "seg5":256,"w4":0, "pa6":0, "pb7":-1 }
,"ty":
{"tx":170,"ty":170,"m1":8,"m2":8,"n1":0.9,"n2":0.1,"n3":100,"a":1,"b":1, "ra2":160, "seg5":256,"w4":90, "pa6":0, "pb7":-1}
,"w4":0,"ra2":40,"seg5":360,"cf":[50,55], "pa6":0, "pb7":-1, "hc": 5400
},
{"t0":80, "t1":100, "cid":"eye1","m1":[4,4],"m2":[4,4],"n1":[0.17,1.17],"n2":[0,0],"n3":[0.38,1],"a":[1,1],"b":1,"tx":[395,395],"ty":[120,120],"w4":[0,0],"ra2":[30,30],"seg5":360,"cf":[500,950], "hc": 0,
"v0":1,"v1":-1},
{"t0":80, "t1":100, "cid":"cristal1","m1":[4,4],"m2":[4,4],"n1":[0.1,2],"n2":[2,2],"n3":[1.38,2],"a":[5,1],"b":[1,1],"tx":[395,395],"ty":[120,120],"w4":[0,0],"ra2":[10,10],"seg5":360,"cf":[80,90], "hc": 0},
{"t0":80, "t1":100, "cid":"eye2","m1":[4,4],"m2":[4,4],"n1":[0.17,1.17],"n2":[0,0],"n3":[0.38,1],"a":[1,1],"b":1,"tx":[295,295],"ty":[120,120],"w4":[0,0],"ra2":[30,30],"seg5":360,"cf":[500,950], "hc": 0},
{"t0":80, "t1":100, "cid":"cristal2","m1":[4,4],"m2":[4,4],"n1":[0.1,2],"n2":[2,2],"n3":[1.38,2],"a":[5,1],"b":[1,1],"tx":[295,295],"ty":[120,120],"w4":[0,0],"ra2":[10,10],"seg5":360,"cf":[80,90], "hc": 0},
{"t0":80, "t1":100, "cid":"lips",
"m1":[-4,-4],"m2":[4,4],"n1":[0,3],"n2":[1,1],"n3":[2,2],"a":[6,6],"b":[6,6],
"tx":[342,342],"ty":[227,227],
"w4":[90,90],"ra2":[30,40],"seg5":360,"cf":[500,0], "hc": 0, "v0":0, "v1":1, "dots":0},
{"t0":80, "t1":100, "cid":"teeths",
"m1":[-4,-4],"m2":[1,1],"n1":[0.5,0.5],"n2":[0.5,0.5],"n3":[0.5,0.5],"a":[1,1],"b":1,
"tx":[342,342],"ty":[227,227],
"w4":[90,90],"ra2":[30,40],"seg5":360,"cf":[0,450], "hc": 0, "v0":0, "v1":-1, "dots":0},
],
spiral:[
{
"tt":{"td":16000,"t0":0,"t1":1000, "t2":1, "t3":1},
"cid":"circle",
"m1":42,"m2":1,"n1":0.5,"n2":0.5,"n3":0.5,"a":1,"b":1,
"tx": [
[0,450],
{"m1":4,"m2":4,"n1":30,"n2":3,"n3":2,"a":9,"b":6,
"tx":50,"ty":0,
"w4":0,"ra2":30,"seg5":360 ,
"pa6": 20, "pb7": 350,
"v0":1,"v1":-25}],
"ty": [
[100,0],
{"m1":4,"m2":4,"n1":30,"n2":3,"n3":2,"a":9,"b":6,
"tx":0,"ty":0,
"w4":90,"ra2":30,"seg5":360 ,
"pa6": 20, "pb7": 350,
"v0":0,"v1":1},
{"m1":4,"m2":4,"n1":30,"n2":3,"n3":2,"a":9,"b":6,
"tx":100,"ty":0,
"w4":90,"ra2":30,"seg5":360 ,
"pa6": 20, "pb7": 350,
"v0":1,"v1":-25}],
"w4":[-90,-30],"ra2":60,"seg5":360,"cf":[555,999],
"fuel":1,"hc":300},
{
"tt":{"td":16000,"t0":0,"t1":1000, "t2":1, "t3":1},
"cid":"star2",
"m1":-737,"m2":-195,"n1":144,"n2":59,"n3":381,"a":20.98,"b":20,
"pa6":0,"pb7":-1,
"cf":[522,900],
"tx":
{"tx":290,"ty":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"v0":1,"v1":-1,
"ra2":180,"seg5":360,"pa6":0,"pb7":-1,
"w4":0},
"ty":
{"tx":250,"ty":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"v0":1,"v1":-1,
"ra2":180,"seg5":360,"pa6":0,"pb7":-1,
"w4":90},
"w4":972,"seg5":360,"ra2":58.11,"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":1,
"fuel":1,"hc":300
},
],
sanddust:[
{
"tt":{"td":24000,"t0":0,"t1":1000, "t2":1, "t3":1},
"cid":"e0",
"m1":9.68,"m2":3.53,"n1":5.69,"n2":-13.06,"n3":-5.71,"a":0.47,"b":-0.92,
"tx": [
[0,300],
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":150,
"w4":0,
"ra2":45,"seg5":360 ,
"pa6": 0, "pb7": -6,
"v0":0,"v1":-1}
],
"ty": [
[150,150],
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":0,
"w4":90,
"ra2":45,"seg5":360 ,
"pa6": 0, "pb7": -6,
"v0":0,"v1":-1}
],
"w4":90,
"ra2":6,"seg5":360,
"cf":[900,900],"cs":[900,900],
"fuel":0,
"hc":100, "hs":900
},
{
"tt":{"td":24000,"t0":50,"t1":1000, "t2":1, "t3":1},
"cid":"e1",
"m1":-13.96,"m2":-10.82,"n1":-19.7,"n2":15.74,"n3":16.14,"a":10.46,"b":5.35,
"tx": [
[0,300],
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":10,"b":8,
"tx":150,
"w4":0,
"ra2":45,"seg5":360 ,
"pa6": 0, "pb7": -6,
"v0":0,"v1":-1}
],
"ty": [
[200,200],
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":10,"b":8,
"tx":0,
"w4":90,
"ra2":45,"seg5":360 ,
"pa6": 0, "pb7": -6,
"v0":0,"v1":-1}
],
"w4":90,
"ra2":6,"seg5":360,
"cf":700,"cs":700,
"fuel":0,
"hc":100, "hs":700
},
{
"tt":{"td":24000,"t0":100,"t1":1000, "t2":1, "t3":1},
"cid":"e2",
"m1":18.97,"m2":7.12,"n1":6.36,"n2":-15.31,"n3":-12.38,"a":-13.41,"b":-18.22,
"tx": [
[0,300],
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":10,"b":6,
"tx":150,
"w4":0,
"ra2":45,"seg5":360 ,
"pa6": 0, "pb7": -6,
"v0":0,"v1":-1}
],
"ty": [
[250,250],
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":10,"b":6,
"tx":0,
"w4":90,
"ra2":45,"seg5":360 ,
"pa6": 0, "pb7": -6,
"v0":0,"v1":-1}
],
"w4":90,
"ra2":6,"seg5":360,
"cf":500,"cs":500,
"fuel":0,
"hc":100, "hs":500
},
{
"tt":{"td":24000,"t0":150,"t1":1000, "t2":1, "t3":1},
"cid":"e3",
"m1":9.59,"m2":11.33,"n1":-8.49,"n2":17.87,"n3":10.25,"a":2.17,"b":2.11,
"tx": [
[0,300],
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":10,"b":4,
"tx":150,
"w4":0,
"ra2":45,"seg5":360 ,
"pa6": 0, "pb7": -6,
"v0":0,"v1":-1}
],
"ty": [
[300,300],
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":10,"b":4,
"tx":0,
"w4":90,
"ra2":45,"seg5":360 ,
"pa6": 0, "pb7": -6,
"v0":0,"v1":-1}
],
"w4":90,
"ra2":6,"seg5":360,
"cf":300,"cs":300,
"fuel":0,
"hc":100, "hs":300
},
],
tunnel:[
{
"tim":{"td":3000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric":{"typ":"form","gid":"form","cid":[[["f1","f2"]]],},
"formA":{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":[[[2,1.9]]],"b":[[[4,5]]],
"ra2":[[[60,20]]], "seg5":360,"w4":0,"pa6":0,"pb7":[[[180,180]]],"v0":0,"v1":1,
},
"stateA":[[[400,414]]],
"stateB":[[[155,153]]],
"pic":{"cf":[[[250,0]]],"cs":[[[100,700]]],"cw":[[[1,2.5]]],"co":[[[1,0.1]]],"cp":[[[1,0.3]]],},
// "hc":6666,"hs":199,"hid":"topo1"
},
{
"tim":{"td":3000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric":{"typ":"form","gid":"form","cid":"penci1a",},
"formA":{
"m1":3.27,"m2":3.27,"n1":4.12,"n2":10.9,"n3":2.93,"a":5.34,"b":14.1,
"w4":130,"ra2":4,"seg5":360,"pa6":0, "pb7":-1,
},
"stateA":
{
"loc": [[[0,600]]],
"mot": [[{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":2,"b":4,
"ra2":40,"seg5":360,"w4":0,"pa6":0,"pb7":180, // no return
"v0":0,"v1":1,
}]],
},
"stateB":
{
"loc": 250,
"mot": [[{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":2,"b":4,
"ra2":40,"seg5":360,"w4":90,"pa6":0,"pb7":-4,
"v0":0,"v1":1,
}]],
},
"pic":{"cf":[[[50,50]]],"cs":[[[0,700]]],"cw":1,"co":1,"cp":1,},
// "hc":6666,"hs":199,"hid":"topo1","hs":[100,100] ,
},
],
spacedoor:[
{
"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1,
"cid":["penci0", "p1"],
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":[1.9,1.8],"b":[4.5,3.8,3],
"ra2":[20,580], "seg5":360,"w4":0,"pa6":0,"pb7":[180,180],"v0":0,"v1":1,
"tx":
[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":0.1,"b":0.1,
"w4":0,"seg5":360,"pa6":-180,"pb7":179,"ra2":140,
"tx":350,"ty":0,
"num":20,
},
],
"ty":[155,450],
"cf":[250,0],"cs":[600,700],"cw":[0,5],"co":[0.1,1],"cp":[0.1,1],
"hc":6666,"hs":199,"hid":"topo1",
"fuel":{
"f":2,"sam":[48],
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":[0,1024],"ra2":[1,2,18],"seg5":[12,36],
"cf":[100,100],"cs":[990,500],"cw":[0.1,2],"co":[0.5,1],
},
},
],
topology:[
{
"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1,
"cid":["penci0", "p1"],
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":[1.9,1.8],"b":[4.5,3.8,3],
"ra2":[20,580], "seg5":360,"w4":0,"pa6":0,"pb7":[180,180],"v0":0,"v1":1,
"tx":
[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":0.1,"b":0.1,
"w4":0,"seg5":360,"pa6":-180,"pb7":179,"ra2":140,
"tx":350,"ty":0,
"num":20,
},
],
"ty":[155,450],
"cf":[250,0],"cs":[600,700],"cw":[0,5],"co":[0.1,1],"cp":[0.1,1],
"hc":6666,"hs":199,"hid":"topo1",
"fuel":{
"f":2,"sam":[48],
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":[0,1024],"ra2":[1,2,18],"seg5":[12,36],
"cf":[100,100],"cs":[990,500],"cw":[0.1,2],"co":[0.5,1],
},
},
// {
// "td":3000, "t0":0, "t1":1000, "t2":1, "t3":1,
// "cid":"penci1a",
// "m1":3.27,"m2":3.27,"n1":4.12,"n2":10.9,"n3":2.93,"a":5.34,"b":14.1,
// "w4":130,"ra2":4,"seg5":360,"pa6":0, "pb7":-1,
// "tx":
// [
// {"tx":[0,600],
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":2,"b":4,
// "ra2":40, "seg5":360,"w4":0,"pa6":0,"pb7":180, // no return
// "v0":0,"v1":1,
// },
// ],
// "ty":
// [
// {"tx":250,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 2, "b": 4,
// "ra2":40, "seg5":360,"w4":90,"pa6":0, "pb7":-4,
// "v0":0,"v1":1,
// },
// ],
// "cf":[50,50],"cs":[0,700],"cw":1,"co":1,"cp":1,
// "hc":6666,"hs":199,"hid":"topo1","hs":[100,100] ,
// },
// {
// "td":18000, "t0":100, "t1":-1000, "t2":1, "t3":1,
// "cid":"penci1b",
// "m1":3.27,"m2":3.27,"n1":4.12,"n2":10.9,"n3":2.93,"a":5.34,"b":14.1,
// "w4":130,"ra2":4,"seg5":360,
// "cf":[50,50],
// "pa6":0, "pb7":-1,
// "hc": 6666, "hs": [999,140], "hid":"topo1",
// "fuel":1,
// "tx":
// [
// [0,400],
// {"tx":100,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 2, "b": 4,
// "ra2":40, "seg5":360,"w4":0,
// "pa6":0, "pb7":180, // no return
// "v0":0,"v1":1,
// },
// ],
// "ty":
// {"tx":60,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 2, "b": 4,
// "ra2":40, "seg5":360,"w4":90,
// "pa6":0, "pb7":-4,
// "v0":0,"v1":1,
// },
// },
// {"td":18000, "t0":0, "t1":990, "t2":10,
// "cid":"penci2a",
// "m1": 4, "m2": 2, "n1": 2, "n2": 2, "n3": 2, "a": 2.5, "b": 9,
// "w4":130,"ra2":4,"seg5":360,
// "cf":[550,50], "cs":[550,50],
// "pa6":0, "pb7":-1,
// "hc": 9999, "hid":"topo2",
// "fuel":1,
// "tx":
// [
// {"tx":300,
// "m1": 4, "m2": 2, "n1": 2, "n2": 2, "n3": 2, "a": 2.5, "b": 9,
// "ra2":200, "seg5":720,
// "w4":90,
// "pa6":0, "pb7":-1, // no return
// },
// ],
// "ty":
// {"tx":150,
// "m1": 4, "m2": 2, "n1": 2, "n2": 2, "n3": 2, "a": 2.5, "b": 9,
// "ra2":200, "seg5":720,
// "w4":180,
// "pa6":0, "pb7":-1,
// },
// },
// {"td":18000, "t0":10, "t1":1000, "t2":10,
// "cid":"penci2b",
// "m1": 4, "m2": 2, "n1": 2, "n2": 2, "n3": 2, "a": 2.5, "b": 9,
// "w4":130,"ra2":4,"seg5":360,
// "cf":[550,50], "cs":[550,50],
// "pa6":0, "pb7":-1,
// "hc": 9999,"hs": [999,140], "hid":"topo2",
// "fuel":1,
// "tx":
// [
// {"tx":300,
// "m1": 4, "m2": 2, "n1": 2, "n2": 2, "n3": 2, "a": 2.5, "b": 9,
// "ra2":100, "seg5":720,
// "w4":90,
// "pa6":0, "pb7":-1, // no return
// },
// ],
// "ty":[20,
// {"tx":150,
// "m1": 4, "m2": 2, "n1": 2, "n2": 2, "n3": 2, "a": 2.5, "b": 9,
// "ra2":100, "seg5":720,
// "w4":180,
// "pa6":0, "pb7":-1,
// }],
// },
// {"td":18000, "t0":0, "t1":-990,
// "cid":"penci3a",
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "w4":130,"ra2":4,"seg5":720,
// "cf":[50,50],
// "pa6":0, "pb7":-2,
// "hc": 540, "hid":"topo3",
// "fuel":1,
// "tx":
// [[
// {"tx":350,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":40, "seg5":360,
// "w4":0,
// "pa6":0, "pb7":-2,
// "kx":5,
// },
// ]],
// "ty":
// {"tx":250,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":40, "seg5":360,
// "w4":90,
// "pa6":0, "pb7":-4,
// },
// },
// {"td":18000, "t0":10, "t1":-1000,
// "cid":"penci3b",
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "w4":130,"ra2":4,"seg5":720,
// "cf":[50,50],
// "pa6":0, "pb7":-2,
// "hc": 540, "hs": [999,140],"hid":"topo3",
// "fuel":1,
// "tx":
// [[
// {"tx":250,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":40, "seg5":360,
// "w4":0,
// "pa6":0, "pb7":-2,
// "kx":5,
// },
// ]],
// "ty":
// {"tx":255,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":40, "seg5":360,
// "w4":90,
// "pa6":0, "pb7":-4,
// },
// },
// {"td":18000, "t0":0, "t1":-990,
// "cid":"penci4a",
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "w4":130,"ra2":4,"seg5":720,
// "cf":[50,50],
// "pa6":0, "pb7":-1,
// "hc": 540,"hs": 140,"hid":"topo4",
// "fuel":1,
// "tx":
// [[
// {"tx":300,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":40,
// "seg5":360,
// "w4":0,
// "pa6":0, "pb7":-1,
// "kx":5,
// },
// ]],
// "ty":
// {"tx":350,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":40, "seg5":360,
// "w4":90,
// "pa6":0, "pb7":-3,
// },
// },
// {"td":18000, "t0":10, "t1":-1000,
// "cid":"penci4b",
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "w4":130,"ra2":4,"seg5":720,
// "cf":[50,50],
// "pa6":0, "pb7":-1,
// "hc": 540,"hs": [999,140],"hid":"topo4",
// "fuel":1,
// "tx":
// [[
// {"tx":300,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":40,
// "seg5":360,
// "w4":0,
// "pa6":0, "pb7":-1,
// "kx":5,
// },
// ]],
// "ty":
// {"tx":360,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
// "ra2":40, "seg5":360,
// "w4":90,
// "pa6":0, "pb7":-3,
// },
// },
],
timing:[
{
"tt":{"td":9000, "t0":0, "t1":-1000},
"cid":"fig1",
"m1":3.27,"m2":3.27,"n1":4.12,"n2":10.9,"n3":2.93,"a":5.34,"b":14.1,
"w4":130,"ra2":4,"seg5":360,
"cf":[150,150], "cs":[150,150],
"pa6":0, "pb7":-1,
"hc":500, "hs":999,
"fuel":1,
"tx":
[
{
"tx":125,
"m1":-4.35,"m2":-11.47,"n1":-11.09,"n2":19.1,"n3":15.52,"a":-8.17,"b":-13.39,
"ra2":90, "seg5":720,
"w4":-90,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
"ty":
{
"tx":200,
"m1":-4.35,"m2":-11.47,"n1":-11.09,"n2":19.1,"n3":15.52,"a":-8.17,"b":-13.39,
"ra2":90, "seg5":720,
"w4":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
},
{
"tt":{"td":9000, "t0":500, "t1":-1000, "t2":1, "t3":1},
"cid":"fig2",
"m1":3.27,"m2":3.27,"n1":4.12,"n2":10.9,"n3":2.93,"a":5.34,"b":14.1,
"w4":130,"ra2":4,"seg5":360,
"cf":[50,50],
"pa6":0, "pb7":-1,
"hc":500, "hs":600,
"tx":
[
{
"tx":300,
"m1":-4.35,"m2":-11.47,"n1":-11.09,"n2":19.1,"n3":15.52,"a":-8.17,"b":-13.39,
"ra2":90, "seg5":720,
"w4":-90,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
"ty":
{
"tx":200,
"m1":-4.35,"m2":-11.47,"n1":-11.09,"n2":19.1,"n3":15.52,"a":-8.17,"b":-13.39,
"ra2":90, "seg5":720,
"w4":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
},
{
"tt":{"td":9000, "t0":500, "t1":-1000, "tw":1},
"cid":"fig3",
"m1":3.27,"m2":3.27,"n1":4.12,"n2":10.9,"n3":2.93,"a":5.34,"b":14.1,
"w4":130,"ra2":4,"seg5":360,
"cf":[50,50],
"pa6":0, "pb7":-1,
"hc":500, "hs":200,
"tx":
[
{
"tx":475,
"m1":-4.35,"m2":-11.47,"n1":-11.09,"n2":19.1,"n3":15.52,"a":-8.17,"b":-13.39,
"ra2":90, "seg5":720,
"w4":-90,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
"ty":
{
"tx":200,
"m1":-4.35,"m2":-11.47,"n1":-11.09,"n2":19.1,"n3":15.52,"a":-8.17,"b":-13.39,
"ra2":90, "seg5":720,
"w4":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
},
],
traces:[
{
"tt":{"td":9000, "t0":0, "t1":-1000},
"cid":"fig1",
"m1":3.27,"m2":3.27,"n1":4.12,"n2":10.9,"n3":2.93,"a":5.34,"b":14.1,
"w4":130,"ra2":12,"seg5":360,
"cf":[150,150], "cs":[150,150],
"pa6":0, "pb7":-1,
"hc":[36,1], "hs":0,
"fuel":1,
"tx":
[
{
"tx":350,
"m1":-4.35,"m2":-11.47,"n1":-11.09,"n2":19.1,"n3":15.52,"a":-8.17,"b":-13.39,
"ra2":190, "seg5":720,"w4":-90,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
"ty":
{
"tx":200,
"m1":-4.35,"m2":-11.47,"n1":-11.09,"n2":19.1,"n3":15.52,"a":-8.17,"b":-13.39,
"ra2":190, "seg5":720,"w4":0,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
},
],
// boomerang {"m1":-14.21,"m2":-0.82,"n1":5.51,"n2":7.68,"n3":15.56,"a":-18.49,"b":0.6,"cf":546.11,"hs":0,"tx":350,"ty":222,"w4":90,"seg5":360,"pa6":0,"pb7":-1,"ra2":160,"fuel":0,"dots":0,"trc":0,"v0":0,"v1":1,"gid":"animas","cid":"random","tt":419.9,"cs":150,"kx":1,"ky":1,"hc":1.12}
faceeyes:[
{
"tt":{"td":9000, "t0":90, "t1":1000},
"m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 1, "b": 1,
"tx": 470,
"ty": [70,70],
"w4":[0,0],
"ra2":60,
"seg5":360,
"pa6": 0, "pb7": -1,
"v0":0,"v1":1,
"cf":1000,"cs":950,
"kx":1, "ky":1,
"dots":1,
},
{
"tt":{"td":9000, "t0":90, "t1":600},
"cid":"fig1",
"m1":9.76,"m2":-5.1,"n1":[2,1],"n2":5.44,"n3":-16.01,"a":9.92,"b":18.04,
"tx":350,
"ty":222,
"w4":90,"ra2":120,"seg5":360,
"cf":[-150,10], "cs":[150,150],
"pa6":0, "pb7":-1,
"hc":[36,1], "hs":0,
"fuel":0,
"dots":0,
},
{
"tt":{"td":9000, "t0":601, "t1":1000},
"cid":"fig1",
"m1":9.76,"m2":-5.1,"n1":[1.2,0.15],"n2":5.44,"n3":-16.01,"a":9.92,"b":18.04,
"tx":350,
"ty":222,
"w4":90,"ra2":120,"seg5":360,
"cf":[900,1000], "cs":[150,150],
"pa6":0, "pb7":-1,
"hc":[36,1], "hs":0,
"fuel":0,
"dots":0,
},
],
squares:[
{
"tt":{"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"form1",
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":950,"cs":450,"cw":1,"c0":1,
"tx":100,
"ty":50,
"w4":60,"seg5":360,"ra2":40,
"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":[1,2],
},
{
"tt":{"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"ref1",
"m1":4,"m2":[4,2],"n1":[100,66],"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":950,"cs":450,"cw":1,"c0":1,
"tx":175,
"ty":200,
"w4":60,"seg5":360,"ra2":120,
"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":1,
},
{
"tt":{"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1},
"cid":"move1",
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"tx":{
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"tx":100,
"w4":0,"seg5":360,"ra2":36,
"fuel":0,"dots":0,"hc":0,
"v0":1,"v1":4
},
"ty":{
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"tx":350,
"w4":90,"seg5":360,"ra2":36,
"fuel":0,"dots":0,"hc":0,
"v0":1,"v1":4
},
"pa6":0,"pb7":-1,
"cf":950,"cs":450,"cw":1,"c0":1,
"w4":60,"seg5":360,"ra2":6,
"fuel":0,"dots":0,
"hc":500,"hs":950, "ho":1,
"v0":0,"v1":1,
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":200, "t3":1},
"cid":["form2", "form3"],
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":950,"cs":100,
"tx":500,"ty":50,
"w4":[0,360],
"seg5":360,
"ra2":[40,1],
"fuel":0,
"dots":0,
"sats":0,
"nums":0,
"hc":500,
"v0":0,"v1":1,
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":100, "t3":1},
"cid":"ref2",
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,"cf":275,
"tx":425,"ty":200,
"w4":60,"seg5":360,"ra2":120,"fuel":0,"dots":0,"hc":0,
"cf":950,"cs":100,
"v0":[0,1],"v1":[0,4],
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":1000, "t3":1},
"cid":["form4", "form5"],
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":950,"cs":100,
"tx":500,"ty":350,
"w4":[0,360],
"seg5":360,
"ra2":[40,1],
"fuel":0,
"dots":0,
"sats":0,
"nums":0,
"hc":50,
"v0":0,"v1":1,
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":100, "t3":1},
"cid":"it7",
"tx":{
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"tx":300,
"w4":0,"seg5":360,"ra2":36,
"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":1
},
"ty":{
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"tx":50,
"w4":90,"seg5":360,"ra2":36,
"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":1
},
"pa6":0,"pb7":-1,
"cf":950,"cs":450,"cw":1,"c0":1,
"w4":0,"seg5":360,"ra2":[12,9],
"fuel":0,"dots":0,
"hc":500,"hs":600, "ho":1,
"v0":0,"v1":1,
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":100, "t3":1},
"cid":"move0",
"tx":{
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"tx":300,
"w4":0,"seg5":360,"ra2":36,
"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":1
},
"ty":{
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"tx":350,
"w4":90,"seg5":360,"ra2":36,
"fuel":0,"dots":0,"hc":0,
"v0":0,"v1":1
},
"pa6":0,"pb7":-3,
"cf":[950,250],"cs":450,"cw":1,"c0":1,
"w4":0,"seg5":360,"ra2":12,
"fuel":0,"dots":0,
"hc":25,"hs":600, "ho":1,
"v0":0,"v1":1,
},
],
squares2:
[
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":100, "t3":1},
"cid":["f4", "f5"],
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":[950,250],"cs":100,
"tx":150,"ty":125,
"w4":[0,720],
"seg5":360,
"ra2":[90,0],
"fuel":0,
"dots":0,
"sats":0,
"nums":300,
"hc":50,
"v0":[0,0.4],"v1":[1,1.4],
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":100, "t3":1},
"cid":["form6", "form7"],
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":[950,250],"cs":100,
"tx":300,"ty":125,
"w4":[0,720],
"seg5":360,
"ra2":[90,0],
"fuel":0,
"dots":0,
"sats":0,
"nums":300,
"hc":50,
"v0":[0,-0.4],"v1":[1,1.4],
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":100, "t3":1},
"cid":["f8", "f9"],
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":950,"cs":100,
"tx":450,"ty":125,
"w4":[0,720],
"seg5":360,
"ra2":[90,0],
"fuel":0,
"dots":0,
"sats":0,
"nums":300,
"hc":50,
"v0":[0,-4],"v1":[1,-4],
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":100, "t3":1},
"cid":["g1", "g2"],
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":[950,250],"cs":100,
"tx":150,
"ty":300,
"w4":[0,720],
"seg5":360,
"ra2":[90,0],
"fuel":0,
"dots":0,
"sats":0,
"nums":300,
"hc":50,
"v0":0,"v1":1,
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":1000, "t3":1},
"cid":["g1", "g2"],
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"cf":[950,250],"cs":100,
"tx":300,
"ty":300,
"w4":[0,720],
"seg5":360,
"ra2":[90,0],
"fuel":0,
"dots":0,
"sats":0,
"nums":300,
"hc":50,
"v0":0,"v1":1,
},
{
"tt":{"td":9000, "t0":0, "t1":-1000, "t2":1, "t3":1},
"cid":["h1", "h2"],
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-2,
"cf":[950,250],"cs":100,
"tx":{
"cid":"ref2",
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"tx":450,"ty":200,
"w4":60,"seg5":720,"ra2":80,"fuel":0,"dots":0,
"cf":950,"cs":100,
"v0":0.05,"v1":4,
},
"ty":{
"cid":"ref2",
"m1":4,"m2":4,"n1":100,"n2":100,"n3":100,"a":1,"b":1,
"pa6":0,"pb7":-1,
"tx":300,"ty":200,
"w4":150,"seg5":720,"ra2":80,"fuel":0,"dots":0,
"cf":950,"cs":100,
"v0":0.05,"v1":4,
},
"w4":[0,720],
"seg5":360,
"ra2":[0,12],
"fuel":0,
"dots":0,
"sats":0,
"nums":300,
"hc":500,"hs":100,"hw":1,"ho":1,
"v0":0,"v1":1,
},
],
ellips:
[
{
"tt":{"td":1000, "t0":0, "t1":1000, "t2":1, "t3":1},
"cid":["f10", "f11"],
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"pa6":0,"pb7":-1,
"cf":[950,250],"cs":100,
"tx":150,"ty":125,
"w4":[0,360],
"seg5":360,
"ra2":[90,0],
"fuel":0,
"dots":0,
"sats":0,
"nums":100,
"hc":50,
"v0":0,"v1":1,
},
{
"tt":{"td":1000, "t0":0, "t1":1000, "t2":1, "t3":1},
"cid":["f20", "f21"],
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"pa6":0,"pb7":-1,
"cf":[950,250],"cs":100,
"tx":300,"ty":125,
"w4":[0,360],
"seg5":360,
"ra2":[90,0],
"fuel":0,
"dots":0,
"sats":0,
"nums":100,
"hc":50,
"v0":1,"v1":2,
},
{
"tt":{"td":9000, "t0":0, "t1":1000, "t2":1, "t3":1},
"cid":["f30", "f31"],
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"pa6":0,"pb7":-1,
"cf":[950,250],"cs":100,
"tx":450,"ty":125,
"w4":[0,360],
"seg5":360,
"ra2":[60,60],
"fuel":0,
"dots":0,
"sats":0,
"nums":120,
"hc":50,
"v0":0,"v1":0.08,
},
],
fruits:[
{
"gid":"xsf","cid":"f11",
"m1":-2.52,"m2":-15.96,"n1":3.3,"n2":-7.35,"n3":2.16,"a":1.6,"b":19.31,
"tx":125,"ty":100,
"seg5":360,"w4":-90,
"ra2":90,
"dots":0,"fuel":0,
"hc":0,
"cf":999,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"f12",
"m1":2.11,"m2":-0.56,"n1":[-4,-16],"n2":19.38,"n3":11.18,"a":13.5,"b":-16.21,
"tx":275,"ty":100,
"seg5":360,"w4":90,
"ra2":90,"dots":0,"fuel":0,
"hc":0,
"cf":854,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"f13",
"m1":15.49,"m2":-1.5,"n1":-10.65,"n2":17.99,"n3":14.46,"a":12.49,"b":-5.97,
"tx":425,"ty":100,
"seg5":360,"w4":90,
"ra2":90,"dots":0,"fuel":0,
"hc":0,
"cf":354,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"f14",
"m1":17.12,"m2":1.62,"n1":-6.88,"n2":10.32,"n3":16.69,"a":17.33,"b":2.22,
"tx":550,"ty":100,
"seg5":360,"w4":90,
"ra2":90,"dots":0,"fuel":0,
"hc":0,
"cf":354,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"f21",
"m1":9.32,"m2":-2.79,"n1":-19.64,"n2":16.67,"n3":10.24,"a":13.5,"b":18.95,
"tx":125,"ty":250,
"seg5":360,"w4":90,
"ra2":[60,90],"dots":0,"fuel":0,
"hc":0,
"cf":910,"cs":473.18,"cw":1,
"cf":890,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"f22",
"m1":4.9,"m2":1.94,"n1":1,"n2":-3.41,"n3":-3,"a":-3,"b":-13,
"tx":275,"ty":250,
"seg5":360,"w4":90,
"ra2":90,"dots":0,"fuel":0,
"hc":0,
"cf":545,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"f23",
"m1":4.9,"m2":1.94,"n1":[4, 2],"n2":-3,"n3":-2.55,"a":4,"b":-13,
"tx":425,"ty":250,
"seg5":450,"w4":90,
"ra2":90,"dots":0,"fuel":0,
"hc":0,
"cf":854,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"gid":"xsf","cid":"f24",
"m1":-7.73,"m2":1.7,"n1":-2.72,"n2":4.21,"n3":9.07,"a":[180, 13.9],"b":1.78,
"tx":550,"ty":250,
"seg5":450,"w4":90,
"ra2":90,"dots":0,"fuel":0,
"hc":0,
"cf":854,"cs":473.18,"cw":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
// {"m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":1,"b":1,"cf":150.21,"cs":100,"cw":1,"co":1,"hs":0,"hw":1,"ho":1,"tx":350,"ty":125,"w4":30,"seg5":360,"pa6":0,"pb7":-1,"ra2":119.97,"fuel":0,"dots":0,"trc":0,"nums":120,"v0":0,"v1":1,"gid":"animas","cid":30.99,"td":1000,"t0":0,"t1":1000,"t2":1,"t3":1,"tt":449.44,"sats":0,"hc":50}
// bar diamond on m2 {"m1":4,"m2":43,"n1":1,"n2":1,"n3":1,"a":1,"b":1,"cf":161.54,"cs":100,"cw":1,"co":1,"hs":0,"hw":1,"ho":1,"tx":611.22,"ty":275.81,"w4":30,"seg5":24,"pa6":0,"pb7":-1,"ra2":10,"fuel":0,"dots":0,"trc":0,"nums":120,"v0":0,"v1":1,"gid":"dots","cid":"dot1","td":1000,"t0":0,"t1":1000,"t2":1,"t3":1,"tt":418.37,"sats":0,"hc":50}
// bird {"m1":4,"m2":10,"n1":1,"n2":1,"n3":1,"a":1,"b":1,"cf":500,"cs":500,"cw":1,"co":1,"hs":0,"hw":1,"ho":1,"tx":274.36,"ty":49.21,"w4":0,"seg5":360,"pa6":0,"pb7":-1,"ra2":20,"fuel":0,"dots":1,"trc":0,"nums":120,"v0":0,"v1":1,"gid":"diamonds","cid":"form","td":1000,"t0":0,"t1":1000,"t2":1000,"t3":1,"hc":50,"tt":306.22,"sats":0}
diamonds:
[
// {
// "td":9000, "t0":0, "t1":1000, "t2":1, "t3":1,
// "gid":"diamonds","cid":"back",
// "m1":4,"m2":4,"n1":1,"n2":1,"n3":1,"a":1,"b":1,
// "w4":30,"seg5":12,"ra2":60,"v0":0,"v1":1,
// "tx":350,"ty":200,
// "cf":1000,"cs":1,
// },
// {
// "td":9000, "t0":0, "t1":1000, "t2":1, "t3":1,
// "gid":"diamonds","cid":"front",
// "m1":4,"m2":18,"n1":1,"n2":1,"n3":1,"a":1,"b":1,
// "w4":[30,45],"seg5":12,"ra2":36,"v0":0,"v1":1,
// "tx":350,"ty":200,
// "cf":1,"cs":1,
// },
{
"td":9000, "t0":100, "t1":1000, "t2":1, "t3":1,
"gid":"diamonds","cid":"form2",
"m1":4,"m2":[6.4,7.1],"n1":1,"n2":1,"n3":1,"a":1,"b":1,
"w4":[45,410],"ra2":12,"seg5":360,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"cf":1,"cs":1,
"fuel":{
"f":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":[0.38,1.02],"a":[9,19],"b":6,
"w4":0,"ra2":1,"seg5":0,
"cf":900,"cs":900,"cw":0.1,"co":1,
},
"hc":60,"hf":900,"hs":500,"hw":0.4,"ho":0,
"df":{
"tx":350,"ty":200,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":1,"a":1,"b":1,
// "w4":[30,370],"seg5":120,"ra2":[20,200],"v0":0,"v1":1,"pa6":10,"pb7":11,
"w4":300,"seg5":120,"ra2":50,"pa6":0,"pb7":-1,"v0":1,"v1":-1,
},
},
// {
// "td":9000, "t0":100, "t1":1000, "t2":1, "t3":1,
// "gid":"diamonds","cid":"form1",
// "m1":4,"m2":[6,6.5],"n1":1,"n2":1,"n3":1,"a":1,"b":1,
// "seg5":350,"pa6":0,"pb7":-1,"w4":[30,410],"ra2": 12,"v0":0,"v1":1,
// "cf":1,"cs":1,
// "fuel":{
// "f":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":[0.38,1.02],"a":[9,19],"b":6,"w4":0,"ra2":1,"seg5":0,
// "cf":900,"cs":900,"cw":0.1,"co":1,
// },
// "hc":160,"hf":900,"hs":900,"hw":0.4,"ho":0,
// "df":{
// "tx":350,"ty":200,
// "gid":"move","cid":"nf1",
// "m1":4,"m2":6,"n1":1,"n2":1,"n3":1,"a":1,"b":1,
// "w4":30,"seg5":120,"ra2":[20,490],"pa6":10,"pb7":11,"v0":0,"v1":1,
// "fuel":0,
// },
// },
],
// star on m2 {"m1":100,"m2":-30,"n1":17.84,"n2":-25,"n3":-13.74,"a":-2.16,"b":6.82,"cf":900,"cs":398.36,"cw":1,"co":1,"hs":0,"hw":1,"ho":1,"dx":0,"dy":0,"tx":300,"ty":300,"w4":90,"seg5":360,"pa6":0,"pb7":-1,"ra2":90,"fuel":0,"dots":0,"nums":0,"v0":0,"v1":1,"gid":"xsf","cid":"a22","hc":0}
// vortex {"gid":"xsf","cid":"0ship3","m1":6,"m2":6,"n1":1000,"n2":400,"n3":400,"a":1,"b":1,"tx":307.8,"ty":169.01,"seg5":120,"w4":0,"ra2":160,"dots":0,"fuel":0,"hc":0,"cf":0,"cs":450,"cw":1,"pa6":0,"pb7":-1,"v0":1,"v1":6,"tt":273.01,"hs":450,"kx":1.1,"ky":0.7}
bodies:[
{
"td":9000,"t0":0,"t1":1000,
"gid":"xsf","cid":"body11",
"m1":[5.48,4.8],"m2":[14.44,13.2],"n1":[-6.88,-10.51],"n2":[6.61,15.04],"n3":[5.3,11.77],"a":[12.28,9.94],"b":[18,14.62],
"seg5":360,"w4":90,"ra2":90,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"tx":125,"ty":100,
"fuel":0,
"hc":0,
"cf":54,"cs":473.18,"cw":[1,29.1],"co":1,"cp":[1,0.01],
},
{
"td":9000,"t0":0,"t1":1000,
"gid":"xsf","cid":"body12",
"m1":[4.25,4.35],"m2":[10,11.47],"n1":[-6.639,-11.09],"n2":[10.36,19.1],"n3":[8.16,15.52],"a":[0.98,-8.17],"b":[-1.26,-13.39],
"tx":300,"ty":100,
"seg5":360,"w4":90,"ra2":90,
"fuel":0,
"hc":0,
"cf":54,"cs":473.18,"cw":1,"co":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"nums":18
},
{
"td":9000,"t0":0,"t1":1000,
"gid":"xsf","cid":"body13",
"m1":[5.13,4.35],"m2":[11.6,14.5],"n1":[15.95,8.7],"n2":[-5.64,-18.28],"n3":[-4.59,-18.89],"a":[8.01,17.95],"b":[5.29,8.19],
"tx":475,"ty":100,
"seg5":360,"w4":90,"ra2":90,"dots":0,"fuel":0,
"hc":0,
"cf":54,"cs":473.18,"cw":1,"co":[1,0.2],
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"td":9000,"t0":0,"t1":1000,
"gid":"xsf","cid":"body21",
"m1":-14.33,"m2":10.36,"n1":-12.29,"n2":17,"n3":13.28,"a":-10.98,"b":15.63,
"tx":125,"ty":300,
"seg5":360,"w4":90,"ra2":90,"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,"co":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"marks":{"gid": 'marks', "cid": 'mark1',
"w4":90,
"p":[0,360],
"cf":400,"cs":400,
"h":999,"hc":500,"hs":500,
"w4":0,"ra2":18,"seg5":72},
},
{
"td":9000,"t0":0,"t1":1000,
"gid":"xsf","cid":"body22",
"m1":[6.51,4.71],"m2":[-11.65,-10.94],"n1":[-4.58,-5.51],"n2":[7.83,11.56],"n3":[8.67,15.48],"a":[12.39,15.26],"b":[5.86,6.16],
"seg5":360,"w4":90,"ra2":90,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"tx":300,"ty":300,
"fuel":{
"f":1,"c":6,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":[0.38,1.02],"a":[9,19],"b":6,"w4":0,"ra2":1,"seg5":0,
"cf":900,"cs":900,"cw":0.1,"co":1,
},
"hc":0,
"cf":54,"cs":473.18,"cw":1,"co":1,
},
{
"td":9000,"t0":0,"t1":1000,
"gid":"xsf","cid":"body23",
"m1":-3.48,"m2":13.31,"n1":14.26,"n2":-17.76,"n3":[-10,-10.64],"a":12.1,"b":[14,15.85],
"df":{"tx":475,"ty":300,"m1":8,"m2":8,"n1":0.9,"n2":0.1,"n3":100,"a":1,"b":1, "ra2":6, "seg5":256,"w4":0, "pa6":0, "pb7":-1},
"seg5":360,"w4":90,
"ra2":90, // d => d * 2, // 90,
"dots":0,"fuel":0,
"hc":0,"cf":54,"cs":473.18,"cw":1,"co":1,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
spaceflight:[
{
"gid":"xsf","cid":"n1",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,"tw":0,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"tx":240,"ty":25,
"seg5":360,"w4":-0,"ra2":[40,260],"pa6":0,"pb7":-1,"v0":0,"v1":1,"kx":1.5,
"cf":[294,1],"co":0.5,"cs":1,"cw":0.01,
"fuel":{
"f":2,"sam":[3,9],
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,"w4":0,"ra2":[1,1],"seg5":0,
"kx":1,"ky":1,
"cf":777,"cs":999,"cw":0.01,"co":1,
},
},
{
"gid":"xsf","cid":"rocket1",
"td":18000,"t0":0,"t1":100,"t2":1,"t3":1,"tw":0,
"m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":14,"a":8.98,"b":0.19,
"seg5":360,"w4":-90,"ra2":60,"pa6":0,"pb7":-1,"v0":0,"v1":1,"kx":1,"ky":1,
"hc":90,"hs":450,
"cf":[294,555],"co":0.5,"cs":555,"cw":0.01,
"fuel":{
"f":2,"sam":5,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":[0.38,1.02],"a":[9,19],"b":6,"w4":0,"ra2":1,"seg5":0,
"cf":900,"cs":900,"cw":0.01,"co":1,
},
"tx":79,"ty":296,
"nums":0,
},
{
"gid":"xsf","cid":"rocket1",
"td":18000,"t0":100,"t1":-1000,"t2":1,"t3":1,"tw":0,
"m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":14,"a":8.98,"b":0.19,
"seg5":360,"w4":[45,-60,-90],"ra2":[10,60],"pa6":0,"pb7":-1,"v0":0,"v1":1,"kx":1,"ky":1,
"hc":990,"hs":[999,555],"hw":[0.9,0.5],
"cf":[999,555],"co":0.5,"cs":450,"cw":0.01,
"nums":0,
"fuel":{
"f":2,"sam":[8,2,2],
"m1":4,"m2":4,"n1":2,"n2":2,"n3":[0.38,1.02],"a":[9,19],"b":6,"w4":0,"ra2":1,"seg5":0,
"cf":900,"cs":900,"cw":0.01,"co":1,
},
"tx":[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":35,"ra2":280,"seg5":360,"pa6":80,"pb7":220,"v0":0,"v1":1,
"tx":270,"ty":0,
}
],
"ty":[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":-55,"ra2":280,"seg5":360,"pa6":80,"pb7":220,"v0":0,"v1":1,
"tx":290,"ty":0,
}
],
},
// {
// "gid":"xsf","cid":"rocket2",
// "td":9000, "t0":0, "t1":1000, "t2":1, "t3":1, "tw":0,
// "m1":-7.66,"m2":-3.73,"n1":16.24,"n2":5.98,"n3":17,"a":8.98,"b":0.19,
// "dy":300,
// "df":{
// "dx":0,
// "dy":0,
// "tx":0,
// "ty":0,
// "num":1,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 7,
// "ra2":200,
// "seg5":360,
// "w4":0,
// "pa6":-90, "pb7":160 ,
// "v0":0, "v1":1
// },
// "seg5":360,
// "w4":[-90,-20],
// "ra2":160,
// "dots":0,
// "hc":90,"hs":450,
// "cf":654,"co":0.5,"cs":450,"cw":0.01,
// "pa6":0,"pb7":-1,
// "v0":0,"v1":1,
// "fuel":2,
// },
// {
// "gid":"xsf","cid":"rocket3",
// "td":9000, "t0":0, "t1":1000, "t2":1, "t3":1, "tw":0,
// "m1":-7.66,"m2":-3.1,"n1":16.24,"n2":5.98,"n3":17,"a":8.98,"b":0.19,
// "dx":490,
// "dy":300,
// "df":{
// "dx":0,
// "dy":0,
// "tx":0,
// "ty":0,
// "num":1,
// "m1": 4, "m2": 4, "n1": 2, "n2": 2, "n3": 2, "a": 6, "b": 6,
// "ra2":200,
// "seg5":360,
// "w4":0,
// "pa6":-90, "pb7":160 ,
// "v0":0, "v1":1
// },
// "seg5":360,
// "w4":[-90,-20],
// "ra2":160,
// "dots":0,
// "hc":90,"hs":450,
// "cf":794,"co":0.5,"cs":450,"cw":0.01,
// "pa6":0,"pb7":-1,
// "v0":0,"v1":1,
// "fuel":1,
// },
],
cardioid:
[
{
"gid":"xsf","cid":"c11",
"td":18000, "t0":0, "t1":1000, "t2":1, "t3":1,
"m1":1,"m2":1,"n1":1,"n2":-6,"n3":1,"a":1,"b":6,
"w4":-90,"seg5":360,"ra2":60,"v0":0,"v1":1,
"tx":175,"ty":75,
"cf":1000,"cs":1,
"nums":10,
"marks":{"gid": 'marks', "cid": 'mark11',
"m1":1,"m2":1,"n1":1,"n2":-6,"n3":1,"a":1,"b":6,
"p":[0,360],
"cf":[0,999],"cs":[0,999],
"hid":"h11","h":111,"hc":500,"hs":500,
"w4":-90,"ra2":6,"seg5":36},
},
{
"gid":"xsf","cid":"c12",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":1,"m2":1,"n1":1,"n2":-6,"n3":[0.1,1],"a":1,"b":6,
"w4":-90,"seg5":360,"ra2":[60,90],"v0":0,"v1":1,
"tx":300,"ty":100,
"cf":1000,"cs":1,
"marks":{"gid":'marks',"cid":'mark12',
"m1":1,"m2":1,"n1":1,"n2":-6,"n3":1,"a":1,"b":6,
"p":[1,1080],
"cf":[0,999],"cs":[0,999],"co":1,
"hid":"h12","h":111,"hc":500,"hs":500,
"w4":-90,"ra2":18,"seg5":36},
},
{
"td":18000, "t0":0, "t1":1000, "t2":1, "t3":1,
"gid":"xsf","cid":"c21",
"m1":[4,2],"m2":[4,2],"n1":2,"n2":[2,-6],"n3":2,"a":1,"b":[1,6],
"tx":175,"ty":180,
"w4":-90,"seg5":360,"ra2":120,
"v0":0,"v1":1,
"cf":1000,"cs":1,
"marks":{"gid": 'marks', "cid": 'mark21',
"p":[1,360],
"cf":500,"cs":500,
"hid":"h21","h":111,"hc":500,"hs":500,
"w4":-90,"ra2":18,"seg5":36},
},
{
"gid":"xsf","cid":"c22",
"td":18000, "t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,"seg5":360,"pa6":0,"pb7":-1,"ra2":40,"v0":0,"v1":1,
"tx":[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":-90,"seg5":360,"pa6":-0,"pb7":-2,"ra2":40,
"tx":400,
},
],
"ty":[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":0,"seg5":360,"pa6":-0, "pb7":-2,"ra2":40,
"tx":225,
},
],
"cf":1000,"cs":1,
"hc":100,"hs":100,
"marks":{"gid": 'marks', "cid": 'mark1',
"m1":1,"m2":1,"n1":1,"n2":-8,"n3":1,"a":1,"b":6,
"p":[1,360],
"cf":500,"cs":500,
"h":111,"hc":500,"hs":500,
"w4":-90,"ra2":18,"seg5":36},
},
{
"gid":"cardioid","cid":"c23",
"td":18000, "t0":0, "t1":1000, "t2":1, "t3":1,
"m1":1,"m2":1,"n1":1,"n2":-8,"n3":1,"a":1,"b":6,
"w4":-90,"seg5":360,"pa6":0,"pb7":-1,"ra2":12,"v0":1,"v1":-1,
"tx":[{
"tx":425,"ty":75,
"m1":1,"m2":1,"n1":1,"n2":-8,"n3":1,"a":1,"b":6,
"w4":90,"seg5":360,"pa6":0,"pb7":-2,"ra2":90
}],
"ty":[{
"tx":75,"ty":75,
"m1":1,"m2":1,"n1":1,"n2":-8,"n3":1,"a":1,"b":6,
"w4":180,"seg5":360,"pa6":0,"pb7":-2,"ra2":90
}],
"cf":[0,900],"cs":[0,900],
"hc":[0,900],"hs":[0,900],
"fuel":{
"f":3,
"m1":1,"m2":1,"n1":1,"n2":-8,"n3":1,"a":1,"b":6,
"w4":-90,"ra2":3,"seg5":24,
"cf":900,"cs":900,"cs":0.1,"co":1,
},
},
],
ship:[
{
"cid":"ship",
"td":54000,"t0":0,"t1":1000,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":[0.38,1.02],"a":[9,19],"b":6,
"w4":0,"ra2":[30,320],"seg5":360,"v0":0.01,"v1":1,"kx":1,"ky":1,
"tx":
[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":0,"seg5":360,"pa6":-150,"pb7":75,"ra2":140,
"tx":440,"ty":0,
"num":20,
},
],
"ty":
[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,"seg5":360,"pa6":-150,"pb7":75,"ra2":140, // - [360,60]
"tx":200,"ty":0,
"num":20,
},
],
"cf":[300,350],"cs":[50,100],"cw":0.1,"co":[0.9,1],"cp":1,
},
{
"cid":"orbit",
"td":54000,"t0":0,"t1":1000,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[0,3600],"ra2":[50,320],"seg5":60,"kx":1,"ky":[0.01,0.05],
"tx":
[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":0,"seg5":360,"pa6":-150,"pb7":75,"ra2":140,
"tx":440,"ty":0,
"num":20,
},
],
"ty":
[
{
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":90,"seg5":360,"pa6":-150,"pb7":75,"ra2":140, // - [360,60]
"tx":200,"ty":0,
"num":20,
},
],
"cf":[600,800],"cs":[600,800],"cw":0.99,"co":0.01,"cp":[0.3,0.7],
"marks":{"gid":'marks',"cid":'mark1',
"m1":[40,900,40],"m2":[40,900,40],"n1":2,"n2":2,"n3":1,"a":1,"b":[6,1,6],
"p":[0,3600],
"cf":[600,900],"cs":[600,900],"cw":0.1,"co":1,"cp":1,
// "h":22,"hc":[200,100],"hs":[100,200],"hw":0.4,
"w4":90,"ra2":[3,9],"seg5":72,"kx":1,"ky":1,
},
"nums": 3,
"fuel":{
"f":1,"sam":3,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":[0.38,1.02],"a":[9,19],"b":6,
"w4":0,"ra2":0.1,"seg5":0,
"cf":[800,990],"cs":[800,990],"cw":1,"co":0.5,
},
},
],
tree:[
{"cid":"tree",
"td":18000,"t0":0,"t1":1000,"t2":1,
"m1":3,"m2":3,"n1":100,"n2":200,"n3":200,"a":1,"b":1,
"rx":0,"ry":0,
"tx":325,
"ty":300,
"w4":-90,"seg5":360,"ra2":90,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"cf":[100,300],"cs":333,
"hc":0,
},
{"cid":"star",
"td":18000,"t0":0,"t1":300,"t2":1,
"m1":6,"m2":6,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"tx":[
{
"typ":"xsf",
"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[0,360],"ra2":60,"seg5":360,"pa6":80,"pb7":220,"v0":0,"v1":1,
"tx":365,"ty":0,
}
],
"ty":[
{
"typ":"xsf",
"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[90,450],"ra2":60,"seg5":360,"pa6":80,"pb7":220,"v0":0,"v1":1,
"tx":210,"ty":0,
},
],
"fuel":{
"gid":"f0",
"f":3,"sam":3,
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":0,"ra2":0.7,"seg5":0,
"cf":[900,600],"cs":100,"cw":0.11,"co":1,
},
"w4":[-90,-45],"seg5":[180,360],"ra2":[12,24],"pa6":0,"pb7":-1,"v0":0,"v1":1,
"cf":[350,900],"cs":[350,900],
"hc":0,
"marks":{"gid":'marks',"cid":'mark1',
"m1":[-900,900,-900],"m2":[-900,900,-900],"n1":2,"n2":2,"n3":1,"a":1,"b":[6,1,6],
"p":[0,36000],
"cf":[800,990],"cs":[600,900],"cw":0.1,"co":1,"cp":1,
"w4":90,"ra2":[3,3],"seg5":72,"kx":1,"ky":1,
},
},
{"cid":"light",
"td":18000,"t0":300,"t1":500,"t2":1,
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"tx":[
{
"typ":"xsf",
"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"w4":[0,2160],"ra2":[3,90],"seg5":360,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"tx":320,"ty":0,
}
],
"ty":[
{
"typ":"xsf",
"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":9,"b":6,
"w4":[90,450],"ra2":[3,90],"seg5":360,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"tx":[220,345],"ty":0,
},
],
"fuel":{
"gid":"light","cid":"light",
"f":3,"sam":3,
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":0,"ra2":0.7,"seg5":0,
"cf":[600,990],"cs":100,"cw":0.11,"co":1,
},
"w4":[-90,-45],"seg5":[180,360],"ra2":[3,3],"pa6":0,"pb7":-1,"v0":0,"v1":1,
"cf":[350,900],
"hc":0,"hs":990,
},
{"cid":"treestars",
"td":18000,"t0":500,"t1":1000,"t2":600,
"m1":3,"m2":3,"n1":100,"n2":200,"n3":200,"a":1,"b":1,
"rx":0,"ry":0,
"tx":325,
"ty":300,
"w4":-90,"seg5":360,"ra2":90,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"cf":[300,300],
"hc":0,
"fuel":{
"gid":"f1","cid":"f1",
"f":2,"sam":12,
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":0,"ra2":6,"seg5":68,
"cf":[600,990, 600,990, 600,990],"cs":100,"cw":0.11,"co":1,
},
},
{"cid":"treerings",
"td":18000,"t0":500,"t1":1000,"t2":300,
"m1":3,"m2":3,"n1":100,"n2":200,"n3":200,"a":1,"b":1,
"tx":325,
"ty":300,
"w4":-90,"seg5":360,"ra2":90,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"cf":[300,300],
"hc":0,
"fuel":{
"gid":"light","cid":"rings",
"f":2,"sam":12,
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":0,"ra2":3,"seg5":0,
"cf":[990, 600,990, 600,990,600],"cs":100,"cw":0.11,"co":1,
},
},
],
knots:[
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_12",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":[[[10,10]]],"b":6,
"w4":[[[0, 3 * 360]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"tx":[[[300,300]]],"ty":110,
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":[[[10,10]]],"b":6,
"w4":[[[-90, -3 * 360 - 90]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"tx":[[[100,100]]],"ty":110,
},
]]],
"w4":90,
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":222,"cw":0.9,"co":1, "cp":1,
// "nums":4,
// "hc":990,"hs":[[[999,666]]],
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"seg5":1,"ra2":6,"w4":0,"mod":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":900,"cs":900,"cw":1,"co":0.01,"cp":1,
},
},
],
ellipses:[
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_11",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[0,360]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-4,"v0":0,"v1":1,
"tx":[[[100,100]]],"ty":110,
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[-90,270]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-4,"v0":0,"v1":1,
"tx":[[[100,100]]],"ty":110,
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":222,"cw":0.9,"co":1, "cp":1,
// "nums":4,
// "hc":990,"hs":[[[999,666]]],
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"seg5":1,"ra2":6,"w4":0,"mod":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":900,"cs":900,"cw":1,"co":0.01,"cp":1,
},
},
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_12",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[0,360]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-5,"v0":0,"v1":1,
"tx":[[[300,300]]],"ty":110,
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[-90,270]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-5,"v0":0,"v1":1,
"tx":[[[100,100]]],"ty":110,
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":222,"cw":0.9,"co":1, "cp":1,
// "nums":4,
// "hc":990,"hs":[[[999,666]]],
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"seg5":1,"ra2":6,"w4":0,"mod":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":900,"cs":900,"cw":1,"co":0.01,"cp":1,
},
},
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_13",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[0,360]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-6,"v0":0,"v1":1,
"tx":[[[500,500]]],"ty":110,
}
]]],
"ty":[[[
// 210,
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
// "w4":[[[90,450]]],"ra2":60,"seg5":360,"pa6":0,"pb7":-5,"v0":0,"v1":1,
"w4":[[[-90,270]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-6,"v0":0,"v1":1,
"tx":[[[100,100]]],"ty":110,
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[[[[[[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":222,"cw":0.9,"co":1, "cp":1,
// "nums":4,
// "hc":990,"hs":[[[999,666]]],
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"seg5":1,"ra2":6,"w4":0,"mod":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":900,"cs":900,"cw":1,"co":0.01,"cp":1,
},
},
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_21",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[0,360]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-2,"v0":0,"v1":1,
"tx":[[[100,100]]],"ty":110,
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[-90,270]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-2,"v0":0,"v1":1,
"tx":[[[300,300]]],"ty":110,
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[[[[[[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":222,"cw":0.9,"co":1, "cp":1,
// "hc":990,"hs":[[[999,666]]],
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"seg5":1,"ra2":6,"w4":0,"mod":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":900,"cs":900,"cw":1,"co":0.01,"cp":1,
},
},
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_22",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[0,360]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-3,"v0":0,"v1":1,
"tx":[[[300,300]]],"ty":110,
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[-90,270]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-3,"v0":0,"v1":1,
"tx":[[[300,300]]],"ty":110,
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":222,"cw":0.9,"co":1, "cp":1,
// "hc":990,"hs":[[[999,666]]],
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"seg5":1,"ra2":6,"w4":0,"mod":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":900,"cs":900,"cw":1,"co":0.01,"cp":1,
},
},
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_23",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[0,360]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-8,"v0":0.0001,"v1":0.009,
"tx":[[[500,500]]],"ty":110,
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":6,"b":10,
"w4":[[[-90,270]]],
"ra2":90,"seg5":360,"pa6":0,"pb7":-8,"v0":0.0001,"v1":0.009,
"tx":[[[300,300]]],"ty":110,
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":222,"cw":0.9,"co":1, "cp":1,
// "nums":4,
// "hc":990,"hs":[[[999,666]]],
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"seg5":1,"ra2":6,"w4":0,"mod":1,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":900,"cs":900,"cw":1,"co":0.01,"cp":1,
},
}
],
rotor:[
/* ============ elliopse 0 */
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"e0",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0,360]]],
"ra2":66, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in for taken by rotation in pb7
"w4":[[[-90,270]]],
"ra2":54, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"seg5":60,"ra2":[[[18,6,18]]],"w4":[[[0,90]]],"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[800,990]]],"cs":[[[400,900]]],"cw":0.1,"co":[[[1,0.7]]],"cp":1,
},
},
// /* ============ elliopse 1 */
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"e1",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0,360]]],
"ra2":[[[78,76]]], // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in for taken by rotation in pb7
"w4":[[[-90,270]]],
"ra2":66, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"seg5":60,"ra2":[[[18,6,18]]],"w4":[[[0,90]]],"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[800,990]]],"cs":[[[400,900]]],"cw":0.1,"co":[[[1,0.7]]],"cp":1,
},
},
/* ============ elliopse 2 */
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"e2",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0,360]]],
"ra2":90, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in for taken by rotation in pb7
"w4":[[[-90,270]]],
"ra2":78, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"seg5":60,"ra2":[[[18,6,18]]],"w4":[[[0,90]]],"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[800,990]]],"cs":[[[400,900]]],"cw":0.1,"co":[[[1,0.7]]],"cp":1,
},
},
/* ============ elliopse 3 */
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"e3",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0,360]]],
"ra2":102, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in for taken by rotation in pb7
"w4":[[[-90,270]]],
"ra2":90, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"seg5":60,"ra2":[[[18,6,18]]],"w4":[[[0,90]]],"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[800,990]]],"cs":[[[400,900]]],"cw":0.1,"co":[[[1,0.7]]],"cp":1,
},
},
/* ============ elliopse 4 */
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"e4",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0,360]]],
"ra2":114, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in for taken by rotation in pb7
"w4":[[[-90,270]]],
"ra2":102, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"seg5":60,"ra2":[[[18,6,18]]],"w4":[[[0,90]]],"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[800,990]]],"cs":[[[400,900]]],"cw":0.1,"co":[[[1,0.7]]],"cp":1,
},
},
/* ============ sin wave 1 */
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"w1",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":7,"b":6,
"w4":[[[0,360]]],
"ra2":[[[78,66,78,66,78]]],
"seg5":360,"pa6":0,
"pb7":-6,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":7,"b":6, //
"w4":[[[-90,270]]],
"ra2":[[[78,66,78,66,78]]],
"seg5":360,"pa6":0,
"pb7":-6,
"v0":0.000001,"v1":0.00009,
"tx":[[[270,270]]],
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":999,"cw":1.9,"co":1, "cp":1,
"hc":1024, // _e_
// "hs":[[[888,999]]],"hw":[[[0.9,1.3,0.9]]],"ho":[[[1,0.4,1]]],"hp":[[[1,0.4,1]]],
"trace":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"seg5":60,"ra2":[[[18,6,18]]],"w4":[[[0,90]]],"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[800,990]]],"cs":[[[400,900]]],"cw":0.1,"co":[[[1,0.7]]],"cp":1,
},
},
],
slalom:[
// /* ============ elliopse 0 */
// {
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "gid":"solars",
// "cid":"e0",
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "tx":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1,
// "w4":[[[0,360]]],
// "ra2":66, // 90(path ra2) - 2 * 6 (ring ra2)
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[300,300]]],
// }
// ]]],
// "ty":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1, // change in for taken by rotation in pb7
// "w4":[[[-90,270]]],
// "ra2":54, // diff in ra2 would get ellipse
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[200,200]]],
// },
// ]]],
// "w4":[[[90,90]]],
// "ra2":6, // [[[160,1, 160]]],
// "seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
// "kx": 1, // ( i !== 0) ? 1 : 0.5,
// "ky":1,
// "cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
// },
/* ============ elliopse 1 */
// {
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "gid":"solars",
// "cid":"e1",
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "tx":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1,
// "w4":[[[0,360]]],
// "ra2":[[[78,76]]], // 90(path ra2) - 2 * 6 (ring ra2)
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[300,300]]],
// }
// ]]],
// "ty":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1, // change in for taken by rotation in pb7
// "w4":[[[-90,270]]],
// "ra2":66, // diff in ra2 would get ellipse
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[200,200]]],
// },
// ]]],
// "w4":[[[90,90]]],
// "ra2":6, // [[[160,1, 160]]],
// "seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
// "kx": 1, // ( i !== 0) ? 1 : 0.5,
// "ky":1,
// "cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
// },
// /* ============ elliopse 2 */
// {
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "gid":"solars",
// "cid":"e2",
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "tx":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1,
// "w4":[[[0,360]]],
// "ra2":90, // 90(path ra2) - 2 * 6 (ring ra2)
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[300,300]]],
// }
// ]]],
// "ty":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1, // change in for taken by rotation in pb7
// "w4":[[[-90,270]]],
// "ra2":78, // diff in ra2 would get ellipse
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[200,200]]],
// },
// ]]],
// "w4":[[[90,90]]],
// "ra2":6, // [[[160,1, 160]]],
// "seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
// "kx": 1, // ( i !== 0) ? 1 : 0.5,
// "ky":1,
// "cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
// },
// /* ============ elliopse 3 */
// {
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "gid":"solars",
// "cid":"e3",
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "tx":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1,
// "w4":[[[0,360]]],
// "ra2":102, // 90(path ra2) - 2 * 6 (ring ra2)
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[300,300]]],
// }
// ]]],
// "ty":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1, // change in for taken by rotation in pb7
// "w4":[[[-90,270]]],
// "ra2":90, // diff in ra2 would get ellipse
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[200,200]]],
// },
// ]]],
// "w4":[[[90,90]]],
// "ra2":6, // [[[160,1, 160]]],
// "seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
// "kx": 1, // ( i !== 0) ? 1 : 0.5,
// "ky":1,
// "cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
// },
// /* ============ elliopse 4 */
// {
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "gid":"solars",
// "cid":"e4",
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "tx":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1,
// "w4":[[[0,360]]],
// "ra2":114, // 90(path ra2) - 2 * 6 (ring ra2)
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[300,300]]],
// }
// ]]],
// "ty":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1, // change in for taken by rotation in pb7
// "w4":[[[-90,270]]],
// "ra2":102, // diff in ra2 would get ellipse
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[200,200]]],
// },
// ]]],
// "w4":[[[90,90]]],
// "ra2":6, // [[[160,1, 160]]],
// "seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
// "kx": 1, // ( i !== 0) ? 1 : 0.5,
// "ky":1,
// "cf":1,"cs":[[[777,555]]],"cw":1.0,"co":1,"cp":0.9,
// "hc":1024,"hs":[[[777,555]]],"hw":0.9,"ho":1,"hp":1,
// },
// /* ============ sin wave 1 */
// {
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "gid":"solars",
// "cid":"w1",
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "tx":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":7,"b":6,
// "w4":[[[0,360]]],
// "ra2":[[[78,66,78,66,78]]],
// "seg5":360,"pa6":0,
// "pb7":-6,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[300,300]]],
// }
// ]]],
// "ty":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":7,"b":6, //
// "w4":[[[-90,270]]],
// "ra2":[[[78,66,78,66,78]]],
// "seg5":360,"pa6":0,
// "pb7":-6,
// "v0":0.000001,"v1":0.00009,
// "tx":[[[270,270]]],
// },
// ]]],
// "w4":[[[90,90]]],
// "ra2":6, // [[[160,1, 160]]],
// "seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
// "kx": 1, // ( i !== 0) ? 1 : 0.5,
// "ky":1,
// "cf":1,"cs":999,"cw":1.9,"co":1, "cp":1,
// "hc":1024, // _e_
// "hs":[[[888,999]]],"hw":[[[0.9,1.3,0.9]]],"ho":[[[1,0.4,1]]],"hp":[[[1,0.4,1]]],
// },
// /* ============ sin wave 2 internal */
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"w2",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":7,"b":6,
"w4":[[[0,360]]],
"ra2":[[[90,78,90,78,90]]],
"seg5":360,"pa6":0,
"pb7":-6,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":7,"b":6, //
"w4":[[[-90,270]]],
"ra2":[[[90,78,90,78,90]]],
"seg5":360,"pa6":0,
"pb7":-6,
"v0":0.000001,"v1":0.00009,
"tx":[[[ 270,270]]],
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":999,"cw":1.9,"co":1, "cp":1,
"trace":{
"gid":'traces',"cid":'trc2',
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"seg5":1,"ra2":[[[18,6,18]]],"w4":[[[-90,-90]]],"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[100,777]]],"cs":[[[888,999]]],"cw":[[[0.9,1.3,0.9]]],"co":[[[0.5,0.3,0.5]]],"cp":1,
},
},
// /* ============ sin wave 4 external */
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"w4",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":7,"b":6,
"w4":[[[0,360]]],
"ra2":[[[114,102,114,102,114]]],
"seg5":360,"pa6":0,
"pb7":-6,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":7,"b":6,
"w4":[[[-90,270]]],"ra2":[[[114,102,114,102,114]]],
"seg5":360,"pa6":0,"pb7":-6,"v0":0.000001,"v1":0.00009,
"tx":[[[270,270]]],
},
]]],
"w4":[[[90,90]]],"ra2":6,"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,"kx": 1,"ky":1,
"cf":1,"cs":999,"cw":1.9,"co":1, "cp":1,
"trace":{
"gid":'traces',"cid":'trace01',
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"seg5":1,"ra2":[[[18,6,18]]],"w4":[[[-90,-90]]],"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[100,990]]],"cs":[[[400,900]]],"cw":0.1,"co":[[[0.5,0.3,0.5]]],"cp":1,
},
},
// /* ============ sin wave 3 irregular intermediate*/
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"w3",
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":7,"b":6,
"w4":[[[0,360]]],
"ra2":[[[102,90,102,90,102]]],
"seg5":360,"pa6":0,
"pb7":[[[-6,-9,-6]]],
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":7,"b":6, //
"w4":[[[-90,270]]],
"ra2":[[[102,90,102,90,102]]],
"seg5":360,"pa6":0,
"pb7":[[[-6,-9,-6]]],
"v0":0.000001,"v1":0.00009,
"tx":[[[270,270]]],
},
]]],
"w4":[[[90,90]]],
"ra2":6, // [[[160,1, 160]]],
"seg5":12,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1, // ( i !== 0) ? 1 : 0.5,
"ky":1,
"cf":1,"cs":[[[666,333]]],"cw":0.9,"co":1, "cp":1,
// "hc":1024, // _e_
// "hs":[[[777,111,777,111]]],"hw":[[[0.9,1.8,0.9]]],"ho":[[[1,0.7,1]]],"hp":[[[1,0.7,1]]],
"trace":{
"gid":'traces',"cid":'trc3',
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"seg5":1,"ra2":[[[18,6,18]]],"w4":[[[0,90]]],"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[100,666]]],"cs":[[[100,666]]],"cw":[[[0.9,1.8,0.9]]],"co":[[[0.5,0.3,0.5]]],"cp":[[[1,0.7,0.5]]],
},
},
],
newyear:[
{
"tim":{"td":9200,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric":{"typ":"form","gid":"newyear","cid":"c0",},
"formA":{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[[[-90,270]]],"ra2":[[[48,18,48]]],"seg5":361,"pa6":0,"pb7":-1,"v0":0,"v1":1,"k":1,
},
"stateA":[[[
300,
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[[[0,360]]],"ra2":154,"seg5":360,"pa6":0,"pb7":-8,"v0":0.000001,"v1":0.00009,
}
]]],
"stateB":[[[
200,
{"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1, // change in for taken by rotation in pb7
"w4":[[[-90,270]]],"ra2":16, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,"pb7":-8,"v0":0.000001,"v1":0.00009,
}
]]],
"pic":{
"csx":0,"cf":[[[999,777,999]]],"cs":[[[777,555]]],"cw":0.1,"co":[[[0.1,0.9]]],"cp":0.9,
"txt":"Happy 2017",
"txtcf":-111,"txtcs":[[[333,333]]],"txtcw":[[[0.2,0.8]]],"txtco":0.01,"txtcp":[[[0.2,1]]],
"nums":1,"numstep":30,"numsize":[[[12,3,12]]],"numdiv":30,"nummod":13,"numz":0,"numdist":[[[12,6,12]]],
"numscf":555,"numscs":[[[555,555]]],"numscw":[[[0.2,0.9]]],"numsco":0.001,"numscp":[[[0.5,1]]],
},
"animas":[
{
"ric":{
"typ":"trace","gid":"mark1","cid":"mark1",},
"formA":{
"m1":[[[-900,900,-900]]],"m2":[[[-900,900,-900]]],"n1":2,"n2":2,"n3":1,"a":1,"b":[[[6,1,6]]],
"w4":90,"ra2":[[[3.3,3.3]]],"seg5":72,"k":1,
},
"stateA":{
"pos": [[[ [0,3600] ]] , [[ [10,3610] ]]] // [[[0,3600]]], //
},
"stateB":{
"pos":[[[0,3600]]],
},
"pic":{
"cf":[[[800,990]]],"cs":[[[600,900]]],"cw":0.1,"co":1,"cp":1,
},
},
{
"ric":{"typ":"fuel","gid":"light","cid":"rings",},
"formA":{"m1":6,"m2":6,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":0,"ra2":[[[6,3,6]]],"seg5":64,"pa6":0,"pb7":-1,"v0":0,"v1":1,
},
"pic":{"f":1,"sam":[[[24,24,-2]]],
"cf":[[[990, 600,990, 600,990,600]]],"cs":100,"cw":0.11,"co":1,
},
},
{
"ric":{
"typ":"trace","gid":"trace1","cid":"trace1",},
"formA":{
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"ra2":[[[18,6,18]]],"w4":[[[0,90]]],"seg5":60,"pa6":0,"pb7":-1,"v0":0,"v1":1,
},
"stateA":{
},
"stateB":{
},
"pic":{
"hn":1024,"hm":8,
"cf":[[[800,990]]],"cs":[[[400,900]]],"cw":0.1,"co":[[[1,0.7]]],"cp":1,
},
},
] // end animas
},
],
carrie:[
{
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars","cid":"e0",
// "m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"m1":[[[5,5,5,5,300]]],
"m2":[[[5,5,5,5,246]]],
"n1":[[[30,30,30,30,30,30,-43,-43]]],
"n2":[[[100,100,100,100,100]]],
"n3":[[[142,142,142,142,142]]],
"a":[[[1,1,1,1,41]]],
"b":[[[1,1,1,1,142]]],
"w4":[[[55,55,415]]],"ra2":[[[90,70,52,48,48,48,48,48,48,120,160]]],"seg5":[[[360,720,1024]]],"pa6":0,"pb7":-1,"v0":0,"v1":1,"kx":1,"ky":1,
"csx":6,"cf":[[[999,666]]],"cs":[[[999,666]]],"cw":0.3,"co":[[[0.01,0.01,0.01,0.01,0.01,0.5,0.9]]],"cp":0.9,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":6,
"a":1,"b":1,
"w4":0,
"ra2":196, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":200,"pb7":300,
"v0":0,"v1":1,
"tx":[[[300,380]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":6,
"a":1,"b":1, // change in for taken by rotation in pb7
"w4":90,
"ra2":154, // diff in ra2 would get ellipse
"seg5":360,"pa6":200,"pb7":300,
"v0":0,"v1":1,
"tx":[[[300,250]]],
},
]]],
"fuel":{
"gid":"light","cid":"rings",
"f":2,"sam":[[[160,150,140,120]]],
"m1":6,"m2":6,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":0,"ra2":[[[1.5,1.2,0.9]]],"seg5":0,"pa6":0,"pb7":-1,
"csx":6,"cf":[[[999,666]]],"cs":100,"cw":0.1,"co":[[[0.99,0.99,0.99,0.99,0.3]]],
},
},
],
pentagram:[
{
"cid":"pentagon12",
"td":9000,"t0":0,"t1":300,"t2":1,"t3":1,
"m1":5,"m2":5,"n1":[[[30,61]]],"n2":100,"n3":100,"a":1,"b":1,
"tx":[[[300,300]]],"ty":[[[200,200]]],
"w4": [[[342.5 - 180,342.5- 180]]],
"seg5":360,
"ra2":[[[40,160]]],
"csx":0,"cf":[[[555,666]]],"cs":[[[111,111]]],"cw":0.5,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"cid":"pentagon11",
"td":9000,"t0":0,"t1":300,"t2":1,"t3":1,
"m1":5,"m2":5,"n1":[[[30,61]]],"n2":100,"n3":100,"a":1,"b":1,
"tx":[[[300,300]]],"ty":[[[200,200]]],
"w4": [[[342.5 ,342.5]]],
"seg5":360,
"ra2":[[[40,160]]],
"csx":0,"cf":[[[666,777]]],"cs":[[[111,111]]],"cw":0.5,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"td":9000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon23", // vort
"m1":5,"m2":5,"n1":1000,"n2":8,"n3":600,"a":1,"b":1,
"tx":[[[300,300]]],"ty":[[[200,200]]],
"w4": [[[342.5 ,342.5]]],
"seg5":360,
"ra2":[[[40,160]]],
"cf":[[[888,999]]],"cs":[[[888,888]]],"cw":3.5,
"pa6":0,"pb7":-1,
"v0":0,"v1":144,
},
{
"td":9000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon25", // central pentagon
"m1":5,"m2":5,"n1":1000,"n2":600,"n3":600,"a":1,"b":1,
"tx":[[[300,300]]],"ty":[[[200,200]]],
"w4": [[[342.5 - 180,342.5 - 180]]],
"seg5":360,
"ra2":[[[10,60]]],
"dots":0,"fuel":0,
"csx":0,"cf":[[[111,999]]],"cs":[[[888,888]]],"cw":2.5,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
{
"td":9000,"t0":0,"t1":300, "t2":1, "t3":1,
"cid":"pentagon24", // thin star
"m1":5,"m2":5,"n1":1,"n2":600,"n3":600,"a":1,"b":1,
"tx":[[[300,300]]],"ty":[[[200,200]]],
"w4": [[[342.5 - 180,342.5 - 180]]],
"seg5":360,
"ra2":[[[40,160]]],
"dots":0,"fuel":0,
"csx":0,"cf":[[[666,777]]],"cs":[[[111,111]]],"cw":0.9,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
},
],
parabol:[
{ // ------- bol0
"cid":"bol0",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":5.89,"m2":-0.7,"n1":-20,"n2":16,"n3":16.11,"a":-14,"b":6,
"w4":[[[ 180 + 0.05 * 360,
180 - 0.5 * 360,
180 + 1 * 360,
180 - 0.6 * 360,
180 + 0.6 * 360]]],
"seg5":360,
"ra2":[[[16,16]]],
"csx":0,"cf":[[[555,666]]],"cs":[[[111,111]]],"cw":0.5,"co":0.9,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"tx":[[[ // "tx":[[[100,500]]],"ty":[[[100,100]]],
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0 + 0,0 + 2 * 360]]],
"ra2":160, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in a/b for rotation in pb7
"w4":[[[0,360]]], // "w4":[[[-90,270]]],
"ra2":160, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
},
]]],
"trace":{
"gid":"traces0","cid":"trace0",
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"mod":4,
"seg5":0,"ra2":[[[4,3,4]]],"w4":[[[-90,-90]]],"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":999,
"cf":[[[222,800]]],"cs":[[[400,900]]],"cw":1,"co":[[[0.5,0.3,0.5]]],"cp":1,
},
},
{ // ------- bol1
"cid":"bol1",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":5.89,"m2":-0.57,"n1":-17.02,"n2":15.75,"n3":16.11,"a":-13.45,"b":5.98,
"tx":[[[ // "tx":[[[100,500]]],"ty":[[[100,100]]],
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0 + 0,0 + 2 * 360]]],
"ra2":160, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in a/b for rotation in pb7
"w4":[[[0,360]]], // "w4":[[[-90,270]]],
"ra2":160, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
},
]]],
"w4":[[[ 180 + 0.05 * 360,
180 - 0.5 * 360,
180 + 1 * 360,
180 - 0.6 * 360,
180 + 0.6 * 360]]],
"seg5":360,
"ra2":[[[16,16]]],
"csx":0,"cf":[[[555,444]]],"cs":[[[111,111]]],"cw":0.5,"co":0.9,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"trace":{
"gid":"traces","cid":'trace01',
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"mod":4,
"seg5":1,"ra2":[[[4,3,4]]],"w4":[[[-90,-90]]],"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[222,900]]],"cs":[[[400,666]]],"cw":1,"co":[[[0.5,0.3,0.1]]],"cp":1,
},
},
{ // ------- bol3 forms
"cid":"bol3",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":5.89,"m2":-0.5,"n1":-17,"n2":15,"n3":17,"a":-13,"b":5,
"tx":[[[ // "tx":[[[100,500]]],"ty":[[[100,100]]],
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0 + 0,0 + 2 * 360]]],
"ra2":160, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[400,400]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in a/b for rotation in pb7
"w4":[[[0,360]]], // "w4":[[[-90,270]]],
"ra2":160, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
},
]]],
"w4":[[[ 180 + 0.05 * 360,
180 + 0.5 * 360,
180 + 1 * 360,
180 + 0.6 * 360,
180 + 0.6 * 360]]],
"seg5":360,
"ra2":[[[16,16]]],
"csx":0,"cf":[[[555,999]]],"cs":[[[111,111]]],"cw":0.5,"co":0.9,
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"trace":{
"gid":"traces3","cid":"trace03",
"m1":5,"m2":5,"n1":30,"n2":100,"n3":[[[100,200]]],"a":1,"b":1,
"mod":4,
"seg5":30,"ra2":[[[4,3,4]]],"w4":[[[-90,-90]]],"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":[[[222,999]]],"cs":[[[400,900]]],"cw":1,"co":[[[0.5,0.3,0.5]]],"cp":1,
},
},
],
traces:[
{
"td":2000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_1" ,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":4,"b":2,
"w4": [[[0, 0*360]]],
"ra2": 12,
/* implossion , explosion */
/* "ra2": (i === 0) ? [[[60,60,60,60*1.2,60*0.1,60*4]]] : [[[60,60*1.1,60*0.1,60*1.2*1.1,60*0.1*1.2,60*4*1.6]]], */
"seg5": 180,
"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1,"ky":1,
// "csx":0, // color scale index
"cf":[[[999,999,999]]],
"cs":999,
"cw":0.01,
"co":1,
"cp":0.5,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0,360]]],
"ra2":0, // 196, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,500]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in for taken by rotation in pb7
"w4":[[[-90,270]]],
"ra2":0, // 154, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[200,200]]],
},
]]],
"trace":{
"gid":"traces01","cid":'trace00',
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"mod":4,
"seg5":1,"ra2":2,"w4":0,"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":500,"cs":400,"cw":1,"co":1,"cp":1,
},
},
{
"td":2000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_2" ,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":4,"b":2,
"w4": [[[0,0 * 360]]],
"ra2": 12,
/* implossion , explosion */
/* "ra2": (i === 0) ? [[[60,60,60,60*1.2,60*0.1,60*4]]] : [[[60,60*1.1,60*0.1,60*1.2*1.1,60*0.1*1.2,60*4*1.6]]], */
"seg5": 180,
"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1,"ky":1,
"csx":0,
"cf":[[[999,999,999]]],
"cs":999,
"cw":0.01,
"co":1,
"cp":0.5,
"tx":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1,
"w4":[[[0,360]]],
"ra2":0, // 196, // 90(path ra2) - 2 * 6 (ring ra2)
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,500]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in for taken by rotation in pb7
"w4":[[[-90,270]]],
"ra2":0, // 154, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0.000001,"v1":0.00009,
"tx":[[[300,300]]],
},
]]],
"trace":{
"gid":'traces02',"cid":'trace01',
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"mod":4,
"seg5":1,"ra2":2,"w4":0,"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":500,"cs":400,"cw":1,"co":1,"cp":1,
},
},
],
fireworks:[
{ // . ................ fire 1
"td":3000,"t0":0,"t1":1000,"t2":1,"t3":1,
"gid":"solars",
"cid":"solar_1" ,
"m1":[[[-17,300]]],"m2":[[[-17,300]]],"n1":-12.4,"n2":4.11,"n3":5.64,"a":14.1,"b":8.61,
"w4": [[[0, 0*360]]],
"ra2": [[[6,6,24,24,60,60,24,0]]], // ,60,60,60,60]]],
/* implossion , explosion */
/* "ra2": (i === 0) ? [[[60,60,60,60*1.2,60*0.1,60*4]]] : [[[60,60*1.1,60*0.1,60*1.2*1.1,60*0.1*1.2,60*4*1.6]]], */
"seg5": 180,
"pa6":0,"pb7":-1,"v0":0,"v1":1,
"kx": 1,"ky":1,
"csx":[[[0,0]]], // color scale index
"cf":[[[999,9900,999]]],
"cs":999,
"cw":0.9,
"co":[[[0.03,0.03,0.03,0.7,0.1,0.03]]],
"cp":0.5,
"tx":[[[
{
"typ":"afp",
"td":3000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"w4":[[[0,360]]],
"ra2":10, // 196, // 90(path ra2) - 2 * 6 (ring ra2) // less is softer
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0,"v1":1,
"tx":[[[300,300]]],
}
]]],
"ty":[[[
{
"typ":"afp",
"td":3000,"t0":0,"t1":1000,"t2":1,"t3":1,
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
"a":1,"b":1, // change in for taken by rotation in pb7
"w4":[[[-90,270]]],
"ra2":10, // 154, // diff in ra2 would get ellipse
"seg5":360,"pa6":0,
"pb7":-8,
"v0":0,"v1":1,
"tx":[[[350,100,100,100,150]]],
},
]]],
"fuel":{
"gid":"fuel","cid":"ring",
"f":1,"sam":[[[48,48]]],
"m1":6,"m2":6,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"w4":0,"ra2":[[[0.5,0.5,0.5,0.5]]],
"seg5":[[[0,0,0,0,0,0,0]]],
"pa6":0,"pb7":-1,
"v0":0,"v1":1,
"cf":[[[9900, 6000,9900, 6000,6000,6000]]],
"cs":6660,
"cw":0.6,"co":1,
},
"trace":{
"gid":"traces01","cid":'trace00',
"m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
"mod":1,
"seg5":24,"ra2":[[[1,2,0.5]]],"w4":0,"pa6":0,"pb7":-1,"v0":0,"v1":1,
"hc":1024,
"cf":6560,"cs":6560,"cw":1,"co":[[[1,0.5,0.5,0.5,0.1]]],"cp":[[[1,0.5,0.5,0.5,0.1]]],
},
},
// { // . ................ fire 2
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "gid":"solars",
// "cid":"solar_2" ,
// "m1":[[[1,400]]],"m2":[[[17,400]]],"n1":5.31,"n2":-1.42,"n3":4.78,"a":-15.46,"b":-8.63,
// "w4": [[[0, 0*360]]],
// "ra2": [[[6,6,6,6,60,60,0,0]]], // ,60,60,60,60]]],
// /* implossion , explosion */
// /* "ra2": (i === 0) ? [[[60,60,60,60*1.2,60*0.1,60*4]]] : [[[60,60*1.1,60*0.1,60*1.2*1.1,60*0.1*1.2,60*4*1.6]]], */
// "seg5": 180,
// "pa6":0,"pb7":-1,"v0":0,"v1":1,
// "kx": 1,"ky":1,
// "csx":0,
// "cf":[[[888,999,888]]],
// "cs":111,
// "cw":0.1,
// "co":[[[0.03,0.03,0.03,0.7,0.1,0.03]]],
// "cp":0.5,
// "tx":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "w4":[[[0,360]]],
// "ra2":30, // 196, // 90(path ra2) - 2 * 6 (ring ra2) // less is softer
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0,"v1":1,
// "tx":[[[300,250]]],
// }
// ]]],
// "ty":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1, // change in for taken by rotation in pb7
// "w4":[[[-90,270]]],
// "ra2":10, // 154, // diff in ra2 would get ellipse
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0,"v1":1,
// "tx":[[[350,100,100,100,150]]],
// },
// ]]],
// "fuel":{
// "gid":"fuel","cid":"fuel2",
// "f":1,"sam":[[[48,48]]],
// "m1":6,"m2":6,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
// "w4":0,"ra2":[[[0.5,0.5,0.5,0.5]]],
// "seg5":[[[0,0,0,0,0,0,0]]],
// "pa6":0,"pb7":-1,
// "v0":0,"v1":1,
// "csx":0,
// "cf":[[[9900, 6000,9900, 6000,6000,6000]]],
// "cs":666,"cw":0.6,"co":1,
// },
// "trace":{
// "gid":"traces2","cid":'trace2',
// "m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
// "mod":4,
// "seg5":24,"ra2":2,"w4":0,"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
// "hc":1024,
// "csx":0,
// "cf":5000,
// "cs":4500,"cw":1,"co":[[[1,0.5,0.5,0.5,0.1]]],"cp":[[[1,0.5,0.5,0.5,0.1]]],
// },
// },
// { // . ................ fire 3
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "gid":"solars",
// "cid":"solar_3" ,
// "m1":[[[13,500]]],"m2":[[[-5,500]]],"n1":-9.42,"n2":1.03,"n3":2.24,"a":-2.83,"b":16.93,
// "w4": [[[0, 0*360]]],
// "ra2": [[[6,6,6,6,60,60,0,0]]], // ,60,60,60,60]]],
// /* implossion , explosion */
// /* "ra2": (i === 0) ? [[[60,60,60,60*1.2,60*0.1,60*4]]] : [[[60,60*1.1,60*0.1,60*1.2*1.1,60*0.1*1.2,60*4*1.6]]], */
// "seg5": 180,
// "pa6":0,"pb7":-1,"v0":0,"v1":1,
// "kx": 1,"ky":1,
// "csx":0,
// "cf":[[[999,999]]],
// "cs":[[[999,777]]],
// "cw":0.9,
// "co":[[[0.03,0.03,0.03,0.7,0.1,0.03]]],
// "cp":0.5,
// "tx":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
// "w4":[[[0,360]]],
// "ra2":30, // 196, // 90(path ra2) - 2 * 6 (ring ra2) // less is softer
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0,"v1":1,
// "tx":[[[300,250]]],
// }
// ]]],
// "ty":[[[
// {
// "typ":"afp",
// "td":18000,"t0":0,"t1":1000,"t2":1,"t3":1,
// "m1":4,"m2":4,"n1":2,"n2":2,"n3":2,
// "a":1,"b":1, // change in for taken by rotation in pb7
// "w4":[[[-90,270]]],
// "ra2":20, // 154, // diff in ra2 would get ellipse
// "seg5":360,"pa6":0,
// "pb7":-8,
// "v0":0,"v1":1,
// "tx":[[[350,100,100,100,150]]],
// },
// ]]],
// "fuel":{
// "gid":"fuel3","cid":"fuel3",
// "f":1,"sam":[[[24,24,24]]],
// "m1":6,"m2":6,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
// "w4":0,"ra2":[[[0.5,0.5,0.5,0.5]]],
// "seg5":[[[0,0,0,0,0,0,0]]],
// "pa6":0,"pb7":-1,
// "v0":0,"v1":1,
// "csx":0,
// "cf":[[[9900, 6000,9900, 6000,6000,6000]]],
// "cs":666,"cw":0.6,"co":1,
// },
// "trace":{
// "gid":"traces3","cid":'trace3',
// "m1":5,"m2":5,"n1":30,"n2":100,"n3":100,"a":1,"b":1,
// "mod":4,
// "seg5":24,"ra2":2,"w4":0,"mod":8,"pa6":0,"pb7":-1,"v0":0,"v1":1,
// "hc":1024,
// "csx":0,
// "cf":[[[3000,6000]]],
// "cs":[[[3000,6000]]],
// "cw":1,"co":[[[1,0.5,0.5,0.5,0.1]]],"cp":[[[1,0.5,0.5,0.5,0.1]]],
// },
// },
],
addforms:[
{ // form 01
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"form","cid":"form01",},
"formA":
[
{
"loc": 0,
"mot":
{
"m1":[[[4,4]]],"m2":[[[2,2]]],"n1":[[[2,2]]],"n2":[[[2,2]]],"n3":[[[2,2]]],"a":[[[1,1]]],"b":[[[4,4]]],
"ra2":[[[0,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-1,
},
},
{
"loc": 0,
"mot":
{
"m1":44,"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":6, // ellipse
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-2,
}
}
],
"formB":
[
{
"loc": 0,
"mot":
{
"m1":[[[4,4]]],"m2":[[[2,2]]],"n1":[[[2,2]]],"n2":[[[2,2]]],"n3":[[[2,2]]],"a":[[[1,1]]],"b":[[[4,4]]],
"ra2":[[[0,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
},
},
{
"loc": 0,
"mot":
{
"m1":[[[44,44]]],"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":6, // ellipse
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
}
},
],
"stateA": {
"loc": [[[100,100]]],
},
"stateB": {
"loc": [[[150,150]]],
},
"pic": {"csx":[[[0,0]]],"cf":[[[333,333]]],"cs":[[[333,999]]],"cw":0.9,"co":[[[0.4,0.4]]],"cp":0.4,},
},
{ // form 02
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"form","cid":"form102",},
"formA":
[
{
"loc": 0,
"mot":
{
"m1":[[[4,4]]],"m2":[[[2,2]]],"n1":[[[2,2]]],"n2":[[[2,2]]],"n3":[[[2,2]]],"a":[[[1,1]]],"b":[[[4,4]]],
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-1,
},
},
{
"loc": 0,
"mot":
{
"m1":44,"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":6, // ellipse
"ra2":[[[0,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-2,
}
}
],
"formB":
[
{
"loc": 0,
"mot":
{
"m1":[[[4,4]]],"m2":[[[2,2]]],"n1":[[[2,2]]],"n2":[[[2,2]]],"n3":[[[2,2]]],"a":[[[1,1]]],"b":[[[4,4]]],
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
},
},
{
"loc": 0,
"mot":
{
"m1":[[[44,44]]],"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":6, // ellipse
"ra2":[[[0,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
}
},
],
"stateA": {
"loc": [[[300,300]]],
},
"stateB": {
"loc": [[[150,150]]],
},
"pic": {"csx":[[[0,0]]],"cf":[[[333,333]]],"cs":[[[333,999]]],"cw":0.9,"co":[[[0.4,0.4]]],"cp":0.4,},
},
{ // form 03
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"form","cid":"form03",},
"formA":
[
{
"loc": 0,
"mot":
{
"m1":[[[4,4]]],"m2":[[[4,4]]],"n1":[[[2,2]]],"n2":[[[2,2]]],"n3":[[[2,2]]],"a":[[[4,4]]],"b":[[[1,1]]],
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":180,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-1,
},
},
],
"formB":
[
{
"loc": 0,
"mot":
{
"m1":[[[4,4]]],"m2":[[[4,4]]],"n1":[[[2,2]]],"n2":[[[2,2]]],"n3":[[[2,2]]],"a":[[[4,4]]],"b":[[[1,1]]],
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":180,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
},
},
],
"stateA": {
"loc": [[[500,500]]],
},
"stateB": {
"loc": [[[150,150]]],
},
"pic": {"csx":[[[0,0]]],"cf":[[[333,333]]],"cs":[[[333,999]]],"cw":0.9,"co":[[[0.4,0.4]]],"cp":0.4,},
},
{ // form04
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"form","cid":"form04",},
"formA":
[
{
"loc": 0,
"mot":
{
"m1":44,"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":6, // ellipse
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-2,
}
}
],
"formB":
[
{
"loc": 0,
"mot":
{
"m1":[[[44,44]]],"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":6, // ellipse
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
}
},
],
"stateA": {
"loc": [[[500,500]]],
},
"stateB": {
"loc": [[[150,150]]],
},
"pic": {"csx":[[[0,0]]],"cf":[[[333,333]]],"cs":[[[333,999]]],"cw":0.9,"co":[[[0.4,0.4]]],"cp":0.4,},
},
{ // form21
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"form","cid":"form21",},
"formA":
[
{
"loc": 0,
"mot":
{
"m1":4,"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":1, // ellipse
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-2
},
},
{
"loc": 0,
"mot":
{
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"ra2":[[[0,60]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-2,
}
}
],
"formB":
[
{
"loc": 0,
"mot":
{
"m1":[[[4,4]]],"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":1, // ellipse
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
},
},
{
"loc": 0,
"mot":
{
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"ra2":[[[0,60]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
}
},
],
"stateA": {
"loc": [[[100,100]]],
},
"stateB": {
"loc": [[[250,250]]],
},
"pic": {"csx":[[[0,0]]],"cf":[[[333,333]]],"cs":[[[333,999]]],"cw":0.9,"co":[[[0.4,0.4]]],"cp":0.4,},
},
{ // form22
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"form","cid":"form22",},
"formA":
[
{
"loc": 0,
"mot":
{
"m1":4,"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":1, // ellipse
"ra2":[[[0,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-2
},
},
{
"loc": 0,
"mot":
{
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"ra2":[[[60,60]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-2,
}
}
],
"formB":
[
{
"loc": 0,
"mot":
{
"m1":[[[4,4]]],"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":1, // ellipse
"ra2":[[[0,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
},
},
{
"loc": 0,
"mot":
{
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"ra2":[[[60,60]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
}
},
],
"stateA": {
"loc": [[[300,300]]],
},
"stateB": {
"loc": [[[250,250]]],
},
"pic": {"csx":[[[0,0]]],"cf":[[[333,333]]],"cs":[[[333,999]]],"cw":0.9,"co":[[[0.4,0.4]]],"cp":0.4,},
},
{ // form23
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"form","cid":"form23",},
"formA":
[
{
"loc": 0,
"mot":
{
"m1":4,"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":1, // ellipse
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-2,
}
}
],
"formB":
[
{
"loc": 0,
"mot":
{
"m1":[[[4,4]]],"m2":2,"n1":2,"n2":2,"n3":2,"a":4,"b":1, // ellipse
"ra2":[[[90,90]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
}
},
],
"stateA": {
"loc": [[[500,500]]],
},
"stateB": {
"loc": [[[250,250]]],
},
"pic": {"csx":[[[0,0]]],"cf":[[[333,333]]],"cs":[[[333,999]]],"cw":0.9,"co":[[[0.4,0.4]]],"cp":0.4,},
},
{ // form24
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"form","cid":"form24",},
"formA":
[
{
"loc": 0,
"mot":
{
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"ra2":[[[60,60]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[0,0]]],
"seg5":360, "pa6":0,"pb7":-2,
}
}
],
"formB":
[
{
"loc": 0,
"mot":
{
"m1":5,"m2":5,"n1":2,"n2":7,"n3":7,"a":1,"b":1,
"ra2":[[[60,60]]],
"v0":0,"v1":1,
"ngx":4,"ngy":4,
"xabs":[[[0,0]]],
"w4":-90,
"fas8": [[[-90,-90]]],
"seg5":360, "pa6":0,"pb7":-1,
}
},
],
"stateA": {
"loc": [[[500,500]]],
},
"stateB": {
"loc": [[[250,250]]],
},
"pic": {"csx":[[[0,0]]],"cf":[[[333,333]]],"cs":[[[333,999]]],"cw":0.9,"co":[[[0.4,0.4]]],"cp":0.4,},
},
],
bird2: [
{ // external squircle
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"f01g","cid":"f11c","fid":"f11f",},
"formA": {
"m1":3,"m2":3,"n1":1,"n2":6,"n3":2,"a":0.6,"b":1,
"ra2":130,"v0":0,"v1":1,"w4":90,"pa6":0,"pb7":-1,
"seg5":360,
"fas8": 0,
},
"formB": {
"m1":[[[3,3]]],"m2":3,"n1":1,"n2":6,"n3":2,"a":0.6,"b":1,
"ra2":130,"v0":0,"v1":1,"w4":90,"pa6":0,"pb7":-1,
"seg5":360,
"fas8": -90,
},
"stateA": {"loc":[[[150,150]]],},
"stateB": {"loc":[[[225,225]]],},
"pic": {"csx":0,"cf":[[[333,999]]],"cs":[[[999,999]]],"cw":0.9,"co":[[[0.04,0.04]]],"cp":0.9,},
},
],
lightening: [
{ // external squircle
"tim": {"td":9000,"t0":0,"t1":1000,"t2":1,"t3":1,},
"ric": {"typ":"form","gid":"f01g","cid":"f11c","fid":"f11f",},
"formA": {
"m1":3,"m2":3,"n1":1,"n2":6,"n3":2,"a":.6,"b":1,
"ra2":130,"v0":0,"v1":1,"w4":90,
"seg5":360, "pa6":0,"pb7":-1,
"fas8": 0,
},
"formB": {
"m1":[[[3,4444]]],"m2":3,"n1":1,"n2":6,"n3":2,"a":.6,"b":1,
"ra2":130,"v0":0,"v1":1,"w4":90,
"seg5":360, "pa6":0,"pb7":-1,
"fas8": -90,
},
"stateA": {"loc":[[[150,150]]],},
"stateB": {"loc":[[[225,225]]],},
"pic": {"csx":0,"cf":[[[333,999]]],"cs":[[[999,999]]],"cw":0.9,"co":[[[0.04,0.04]]],"cp":0.9,},
},
],
intrapolation: [
{
"ric":{"typ":"form","gid":"bird2","cid":"bird","fid":"bird2",},
"formA":
[[
[
[[], {
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"v0":0,"v1":1,
"w4":0,"ra2":60,"seg5":90,
"fas8":0,
} ] ,
[[], {
"m1":3,"m2":3,"n1":1,"n2":6,"n3":2,"a":.6,"b":1,
"v0":0,"v1":1,
"w4":0,"ra2":60,"seg5":90,
"fas8":0,
} ]
],
]]
,
"formB":
[[
[
[[], {
"m1":4,"m2":4,"n1":2,"n2":2,"n3":2,"a":1,"b":1,
"v0":0,"v1":1,
"w4":0,"ra2":60,"seg5":90,
"fas8":-90,
} ] ,
[[], {
"m1":3,"m2":3,"n1":1,"n2":6,"n3":2,"a":.6,"b":1,
"v0":0,"v1":1,
"w4":0,"ra2":60,"seg5":90,
"fas8":-90,
} ]
],
]]
,
"stateA":[[[150,350]]],
"stateB":200,
"pic":{
// "test":[[ [ [2,3,4],[33,34],[5,6,7,8,9] ] ]], // ========================
// "test":[[ [[2,3,4],[2,3,4]] ]], // ========================
"csx":0,
"cf":555,
"cs":555,
"cw":1,"co":1,"cp":1,
},
// "animas": [
// {
// "ric": {"typ":"fuel","gid":"fuel_21","cid":'fuel_21',},
// "formA": {
// "m1":4,"m2":11.5,"n1":-11,"n2":19,"n3":15.5,"a":-8,"b":-13,
// "ra2": 1,
// "v0":0, "v1":1,
// "ngx":[[[4,4]]],"ngy":[[[4,4]]], // [[[8,8]]],
// "xabs":[[[0,0]]],
// "w4": [[[90 + 0, 90 + 360]]],
// "seg5": 12,"pa6":0,"pb7":-1,
// "fas8": [[[0,720]]],
// },
// "formB": {
// "fas8": -90,
// },
// "stateA": {
// },
// "stateB": {
// },
// "pic": {
// "csx":1,"cf":666,"cs":[[[111,333,111]]],"cw":1,"co":0.9,"cp":0.7,
// "kan":5,"sam":[[[24,24,24]]],"f":1,
// },
// },
// ],
"___animas": [
{
"ric": {"typ":"form","gid":"t21g","cid":'t21c',},
"formA": {
"m1":4,"m2":11.5,"n1":-11,"n2":19,"n3":15.5,"a":-8,"b":-13,
"ra2": 6,
"v0":0,"v1":1,
"w4": [[[90 + 0, 90 + 360]]],"pa6":0,"pb7":-1,
"seg5": 1,
"fas8": [[[0,720]]],
},
"formB": {
"fas8": -90,
},
"stateA": {
"pos": 10,
},
"stateB": {
"pos": 10,
},
"pic": {
"csx":1,"cf":666,"cs":[[[999,333,999]]],"cw":1,"co":0.01,"cp":0.7,
"hc":20,"hn":3,"hm":5,
},
},
// {
// "ric": {"typ":"nums","gid":"numsg","cid":'numsc',},
// "pic": {
// "csx":0,"cf":666,"cs":[[[999,999,999]]],"cw":0.5 ,"co":0.01,"cp":0.99,
// "step":30,"ra2":[[[8,8,8]]],"div":1,"mod":13,"z":0,
// "dist":[[[12,6,12]]],
// },
// },
// },
// {
// "ric": {"typ":"msg","gid":"msgg","cid":'msgc',},
// "pic": {
// "txt":"bird form",
// "csx":0,"cf":666,"cs":[[[999,333,999]]],"cw":1,"co":0.9,"cp":0.7,
// "ra2":20,"pos":-1,
// "distx":0,"disty":0,
// },
// },
],
},
],
// star: "m1":-900,"m2":-900,"n1":4,"n2":2,"n3":2,"a":2,"b":1,
// cross "m1":-11.63,"m2":-3.86,"n1":6.66,"n2":15.12,"n3":15.88,"a":17.78,"b":14.52,
// cross "m1":-0.81,"m2":8.12,"n1":6.2,"n2":19.45,"n3":8.4,"a":-5.61,"b":16.83,
// arrow: "m1":-15.56,"m2":-0.99,"n1":0.61,"n2":-11.23,"n3":-9.13,"a":2.44,"b":-17.33,
// arrow: "m1":2.92,"m2":3.56,"n1":12.84,"n2":9.81,"n3":11.59,"a":14.66,"b":-4.1,
// fly: "m1":13.65,"m2":-5.14,"n1":2.1,"n2":-999.83,"n3":-19.93,"a":-16.34,"b":-19.29,
// strwberry "m1":-17.21,"m2":0.78,"n1":-11.92,"n2":18.5,"n3":12.94,"a":-19.96,"b":13.18,
// Y: "m1":7.07,"m2":7.19,"n1":10.64,"n2":10.68,"n3":4.66,"a":11.53,"b":-8.55,
// Y: "m1":15.83,"m2":-6.78,"n1":8.64,"n2":13.53,"n3":3.68,"a":-6.54,"b":-9.05,
// Y: "m1":-3.96,"m2":-5.36,"n1":11.93,"n2":16.27,"n3":9.56,"a":11.65,"b":-15.3,
// V: "m1":-2.77,"m2":17.17,"n1":-18.41,"n2":-4.85,"n3":10.08,"a":7.43,"b":-0.18,
// rocket: "m1":-13.45,"m2":3.72,"n1":10.57,"n2":18.78,"n3":10.76,"a":-15.26,"b":9.27,
// lemon: "m1":-3.21,"m2":-1.53,"n1":5.28,"n2":-3.6,"n3":-17.57,"a":-9.22,"b":1.09,
// cross: "m1":-7.99,"m2":-1.74,"n1":0.29,"n2":-18.84,"n3":9.24,"a":-12.23,"b":-10.57,
// cross: "m1":-8.18,"m2":1.78,"n1":-12.08,"n2":-3.79,"n3":18.36,"a":8.09,"b":17.08,
// T: "m1":-1.29,"m2":-8.03,"n1":7.12,"n2":16.03,"n3":10.3,"a":16.7,"b":19.07,
// T: "m1":-6.97,"m2":-1.4,"n1":0.28,"n2":-8.25,"n3":3.59,"a":6.38,"b":-15.18,
// deca: "m1":-19.6,"m2":19.58,"n1":-7.06,"n2":-6.17,"n3":14.52,"a":9.76,"b":0.08,
// OO: "m1":1.54,"m2":-3.96,"n1":16.7,"n2":-4.94,"n3":-17.05,"a":3.97,"b":-5.21,
// M: "m1":-2.21,"m2":13.07,"n1":3.71,"n2":9.78,"n3":-0.83,"a":-0.07,"b":7.89,
// fruit: "m1":6.65,"m2":-1.24,"n1":-12.6,"n2":14.5,"n3":7.85,"a":-7.06,"b":-5.89,
// fruit: "m1":2.57,"m2":0.58,"n1":4.08,"n2":-6.68,"n3":17.44,"a":-5.05,"b":14.87,
// 8: "m1":4,"m2":4,"n1":0.3,"n2":0,"n3":10,"a":1,"b":1,
// vessel: "m1":-3.27,"m2":1.93,"n1":11.96,"n2":15.22,"n3":4.17,"a":-1.87,"b":-9.51,
// fly: "m1":7.85,"m2":-5.15,"n1":2.74,"n2":-13.4,"n3":-12.86,"a":-11.47,"b":19.46,
// "m1":-10.71,"m2":0.48,"n1":17.96,"n2":-13.79,"n3":-10.48,"a":17.91,"b":6.03, // fly
// "m1":-8.29,"m2":-5.36,"n1":6.52,"n2":-12.7,"n3":-13.37,"a":13.36,"b":18.66, // fly
// "m1":10.28,"m2":-4.64,"n1":12,"n2":-4.5,"n3":-5.87,"a":9.2,"b":11.58, // fly
// "m1":-11.86,"m2":4.5,"n1":8.01,"n2":-5.25,"n3":-7.76,"a":-14.66,"b":6.93, // fly
// "m1":-6.82,"m2":-2.98,"n1":17.84,"n2":-17.33,"n3":-13.74,"a":-2.16,"b":6.82, // fly
// "m1":-11,"m2":-2.25,"n1":3.02,"n2":-6.2,"n3":-17.93,"a":15.99,"b":-0.51, // fly
// "m1":-7.49,"m2":-1.24,"n1":1.78,"n2":-14.86,"n3":-5.95,"a":-9.15,"b":17.49, // fly
// "m1":11.3,"m2":-3.01,"n1":10.16,"n2":-18.45,"n3":-7.58,"a":-4.77,"b":-12.56, // fly
// "m1":-15.53,"m2":2.11,"n1":19,"n2":-18.8,"n3":-16.25,"a":13.5,"b":-5.67, // fly
// "m1":-7.79,"m2":9.65,"n1":7.71,"n2":-12.04,"n3":-12.54,"a":-18.75,"b":17.24, // fly
// "m1":19.44,"m2":1.95,"n1":5.24,"n2":-12.28,"n3":-7.31,"a":3.74,"b":-3.96, // fly
// "m1":15.67,"m2":4.96,"n1":13.95,"n2":-7.85,"n3":-9.9,"a":-17.65,"b":11.52, // fly
// "m1":-5.49,"m2":13.25,"n1":4.95,"n2":19.59,"n3":-6.05,"a":-0.23,"b":10.73, // fly
// "m1":-11.75,"m2":-7.65,"n1":16.37,"n2":-12.03,"n3":-17.78,"a":-14.43,"b":-6.02, // fly
// "m1":14.98,"m2":-2.1,"n1":10.31,"n2":-12.68,"n3":-16.58,"a":5.12,"b":1.65, // fly
// "m1":11.51,"m2":13.55,"n1":5.69,"n2":-14.01,"n3":-12.51,"a":-6.68,"b":-10.43, // fly
// "m1":-19.57,"m2":14.21,"n1":2.31,"n2":-19.33,"n3":-9.9,"a":-3.87,"b":15.3, // fly
// "m1":7.77,"m2":-4.54,"n1":3.34,"n2":-6.92,"n3":-5.23,"a":4.54,"b":6.17, // fly
// "m1":2.72,"m2":-6.29,"n1":-0.48,"n2":0.61,"n3":15.59,"a":-4.86,"b":-5.97, // fruit
// "m1":11.82,"m2":2.44,"n1":-10.36,"n2":18.48,"n3":15.77,"a":-10.25,"b":-9.53, // fruit
// "m1":2.16,"m2":-0.75,"n1":-16.27,"n2":19.82,"n3":10.75,"a":-17.19,"b":-15.16, // fruit
// "m1":18.85,"m2":-0.97,"n1":-14.55,"n2":11.91,"n3":5.72,"a":-12.83,"b":-18.32, // fruit
// "m1":-2.38,"m2":5.37,"n1":-3.51,"n2":4.87,"n3":8.41,"a":10.89,"b":7.75, // fruit
// "m1":-16.71,"m2":0.19,"n1":-7.15,"n2":17.65,"n3":9.92,"a":-9.02,"b":2.11, // fruit
// "m1":13.3,"m2":1.12,"n1":-5.09,"n2":11.99,"n3":6.74,"a":14.21,"b":-13.31, // fruit
// "m1":-5.04,"m2":-11.36,"n1":-5.01,"n2":1.56,"n3":9.1,"a":-7.15,"b":-1, // crew
// "m1":-4.67,"m2":18.6,"n1":12.01,"n2":-7.93,"n3":-6.31,"a":6.72,"b":0.74, // crew
// "m1":-4.92,"m2":18.35,"n1":-2.3,"n2":5.91,"n3":7.91,"a":3.32,"b":-2.84, // crew
// "m1":-4.82,"m2":10.32,"n1":8.56,"n2":-9.63,"n3":-8.36,"a":11.62,"b":0.98, // crew
// doubleface: "m1":3.52,"m2":10.75,"n1":-14.48,"n2":4.84,"n3":9.32,"a":-8.51,"b":-2.71,
// carrot: "m1":-1.77,"m2":-19.87,"n1":-6.1,"n2":-15.14,"n3":12.32,"a":-0.64,"b":-0.55,
// helex3: "m1":5.83,"m2":-2.36,"n1":1.83,"n2":-16.23,"n3":18.91,"a":5.34,"b":15.14,
// helex4: "m1":-0.04,"m2":-7.56,"n1":-1.22,"n2":17.12,"n3":5.41,"a":5.3,"b":-15.22,
// helex4: "m1":-10.82,"m2":8.06,"n1":5.37,"n2":9.72,"n3":-2.82,"a":-13.87,"b":1.46,
// helex5: "m1":-9.77,"m2":18.77,"n1":5.56,"n2":-12.22,"n3":13.87,"a":-2.54,"b":4.45,
// helex6: "m1":-8.19,"m2":11.74,"n1":-4.59,"n2":0.19,"n3":15.86,"a":-3.18,"b":-0.54,
// helex6: "m1":-6.26,"m2":-11.72,"n1":3.26,"n2":2.96,"n3":-18.08,"a":4.88,"b":-13.51,
// vase: "m1":0.04,"m2":-2.97,"n1":-6.25,"n2":14.66,"n3":16.16,"a":-16.06,"b":10.69,
// vase: "m1":2.29,"m2":-6.84,"n1":16.45,"n2":7.78,"n3":10.37,"a":5.73,"b":-8.76,
// vase: "m1":-5.11,"m2":5,"n1":1.23,"n2":0.49,"n3":1.5,"a":-17.43,"b":-4.27,
// vase: "m1":-4.56,"m2":-6.15,"n1":3.61,"n2":4.86,"n3":1.88,"a":-1.2,"b":-1.22,
// vase: "m1":2.54,"m2":1.63,"n1":12.61,"n2":19.92,"n3":17.49,"a":14.85,"b":15.34,
// vase: "m1":-7.16,"m2":10.89,"n1":18.47,"n2":2.14,"n3":2.74,"a":4.3,"b":6.37,
// vase: "m1":4.65,"m2":1.24,"n1":15.31,"n2":8.33,"n3":5.26,"a":9.22,"b":-5.64,
// ballom: "m1":2.63,"m2":-18.66,"n1":0.85,"n2":-3.1,"n3":9.46,"a":2.65,"b":-6.4,
// lemon: "m1":9.38,"m2":4.17,"n1":12.47,"n2":6.18,"n3":2.76,"a":-4.8,"b":19.1,
// lemon: "m1":-11.89,"m2":3.51,"n1":7.01,"n2":12.57,"n3":1.42,"a":1.7,"b":17.38,
// pear: "m1":-8.87,"m2":0.98,"n1":18.84,"n2":16.09,"n3":5.45,"a":-9.98,"b":18.45,
// star4: "m1":8.04,"m2":-5.76,"n1":-14.11,"n2":-8.04,"n3":10.21,"a":4.62,"b":-11.52,
// angle2: "m1":-5.01,"m2":-0.79,"n1":-13.68,"n2":-15.82,"n3":18.51,"a":-6.88,"b":-4.65,
// angle2: "m1":-2.79,"m2":1.32,"n1":-19.26,"n2":-18.16,"n3":2.72,"a":19.13,"b":-15.94,
// cloud: "m1":-4.02,"m2":4.33,"n1":-19.33,"n2":16.57,"n3":11.46,"a":-4.15,"b":10.59,
// cloud: "m1":-3.04,"m2":2.61,"n1":-8.97,"n2":9.32,"n3":7.51,"a":7.52,"b":17.62,
// cloud: "m1":-7.5,"m2":-11.35,"n1":-12.84,"n2":0.52,"n3":1.14,"a":-1.09,"b":-0.52,
// cloud: "m1":-2.76,"m2":-0.52,"n1":-9.44,"n2":13.61,"n3":6.31,"a":-4.28,"b":-9.11,
// cloud: "m1":-8.64,"m2":8.75,"n1":-17.5,"n2":8.01,"n3":13.02,"a":-13.1,"b":4.25,
// cloud: "m1":15.77,"m2":-18.79,"n1":-13.74,"n2":0.63,"n3":0.7,"a":8.69,"b":-13.08,
// cloud: "m1":-0.83,"m2":-4.67,"n1":-18.21,"n2":17.89,"n3":16.02,"a":14.6,"b":-13.95,
// cloud: "m1":-3.97,"m2":2.51,"n1":-18.44,"n2":3.02,"n3":10.48,"a":-17.98,"b":-2.6,
// spear: "m1":9.26,"m2":3.17,"n1":5.91,"n2":14.34,"n3":9.22,"a":11.72,"b":-7.78,
// spear: "m1":-12.39,"m2":-3.56,"n1":14.7,"n2":18.53,"n3":18.27,"a":17.9,"b":-4.26,
// gear: "m1":0.44,"m2":-16.89,"n1":11.92,"n2":13.6,"n3":9.55,"a":5.02,"b":3.89,
// heart: "m1":7.45,"m2":-0.52,"n1":18.33,"n2":13.41,"n3":-11.41,"a":8.53,"b":-3.57,
// heart: "m1":18.59,"m2":-0.97,"n1":15.91,"n2":-3.63,"n3":-15.55,"a":-6.19,"b":13.73,
// heart: "m1":-2.58,"m2":-0.1,"n1":16.95,"n2":14.4,"n3":-19.07,"a":11.21,"b":17.99,
// heart: "m1":15.15,"m2":-1.75,"n1":12.04,"n2":14.76,"n3":-16.37,"a":5.39,"b":-5.13,
// heart: "m1":-13.98,"m2":-0.04,"n1":7.08,"n2":6.37,"n3":-7.39,"a":7.43,"b":-7.8,
// heart: "m1":15.22,"m2":-0.84,"n1":8,"n2":18.76,"n3":-10.34,"a":-18.24,"b":-15.24,
// heart: "m1":4.36,"m2":1.6,"n1":12.16,"n2":18.02,"n3":-19.84,"a":-0.65,"b":3.59,
// legs: "m1":4.16,"m2":4.31,"n1":18.09,"n2":14.02,"n3":7.78,"a":-10.92,"b":-10.78,
// body: "m1":2.99,"m2":-9.25,"n1":19.4,"n2":6.75,"n3":14.76,"a":10.81,"b":-2.39,
// nice: "m1":16.47,"m2":-8.75,"n1":-15.51,"n2":-15.16,"n3":19.29,"a":-2.91,"b":-0.04,
// nice: "m1":2.63,"m2":1.58,"n1":12.47,"n2":9.22,"n3":17.13,"a":-13.21,"b":-19.86,
// nice: "m1":18.54,"m2":6.53,"n1":-14.8,"n2":-5.75,"n3":19.79,"a":0,"b":-2.34,
// nice: "m1":-1.91,"m2":-2.47,"n1":5.19,"n2":0.81,"n3":12.65,"a":10.45,"b":-0.54,
// nice: "m1":-3.39,"m2":-4.32,"n1":1.62,"n2":15.24,"n3":3.15,"a":-0.81,"b":11.23,
// nice: "m1":-19.57,"m2":6.02,"n1":9.29,"n2":19.26,"n3":3.79,"a":0.75,"b":-13.98,
// nice: "m1":0.25,"m2":8.07,"n1":12.06,"n2":19.4,"n3":8.74,"a":3.42,"b":-8.19,
// nice: "m1":-8.42,"m2":16.1,"n1":-9.91,"n2":6.5,"n3":10.61,"a":-16.48,"b":-5.43,
// nice: "m1":6.79,"m2":18.75,"n1":7.15,"n2":-12.71,"n3":2.23,"a":0.52,"b":11.09,
// nice: "m1":8.45,"m2":12.45,"n1":15.17,"n2":4.95,"n3":-17.66,"a":-12.81,"b":0.31,
// nice: "m1":-17,"m2":-4.24,"n1":1.18,"n2":9.06,"n3":7.14,"a":-8.52,"b":1.94,
// nice: "m1":1.18,"m2":10.64,"n1":18.7,"n2":-19.27,"n3":-19.71,"a":17.21,"b":-2.58,
// nice: "m1":0.76,"m2":16.33,"n1":2.86,"n2":-17.17,"n3":-6.4,"a":-7.72,"b":-9.45,
// nice: "m1":-4.94,"m2":3.03,"n1":17.68,"n2":14.65,"n3":-3.56,"a":0.28,"b":4.32,
// nice: "m1":-0.79,"m2":18.01,"n1":3.78,"n2":-9.77,"n3":-7.33,"a":18.59,"b":-9.55,
// nice: "m1":1.62,"m2":15.52,"n1":8.17,"n2":-12.63,"n3":-15.91,"a":11.19,"b":1.25,
// nice: "m1":3.14,"m2":-9.5,"n1":-15.55,"n2":8.19,"n3":9.67,"a":-4.87,"b":-3.43,
// nice: "m1":2.24,"m2":10.4,"n1":13.58,"n2":12.25,"n3":-3.58,"a":-0.18,"b":13.1,
// nice: "m1":-13.41,"m2":8.88,"n1":3.95,"n2":1.14,"n3":17.64,"a":8.24,"b":0.71,
// nice: "m1":-4.92,"m2":14.58,"n1":7.2,"n2":19.64,"n3":15.37,"a":5.13,"b":-19.03,
// nice: "m1":2.95,"m2":-0.54,"n1":11.55,"n2":-15.63,"n3":-16.81,"a":-12.09,"b":-3.99,
// nice: "m1":1.61,"m2":6.83,"n1":3.06,"n2":-9.15,"n3":9.2,"a":-2.49,"b":0.24,
// nice: "m1":0.86,"m2":-13.99,"n1":1.8,"n2":2.88,"n3":-13.39,"a":-4.61,"b":-0.56,
// flower: "m1":2.04,"m2":-10.05,"n1":-18.73,"n2":-17.2,"n3":12.87,"a":0,"b":-15.33,
// flower: "m1":8.05,"m2":3.78,"n1":12.26,"n2":-9.57,"n3":11.32,"a":14.06,"b":-6.2,
// house: ,"m1":-5.82,"m2":16.34,"n1":16.83,"n2":5.42,"n3":8.81,"a":8.54,"b":5.49,
// ship: "m1":14.51,"m2":7.45,"n1":18.06,"n2":11.43,"n3":8.05,"a":-12.34,"b":0.79,
// ship: "m1":-5.6,"m2":-12.18,"n1":17.26,"n2":8.89,"n3":12.55,"a":15.15,"b":-13.57,
// ship: "m1":-5.72,"m2":-7.09,"n1":2.31,"n2":3.2,"n3":0.69,"a":-3.15,"b":12.31,
// ship: "m1":10.58,"m2":-8.91,"n1":19.28,"n2":13.79,"n3":5.06,"a":1.76,"b":1.34,
// ship: "m1":4.51,"m2":6.59,"n1":15.94,"n2":18.41,"n3":8.25,"a":10.53,"b":-3.36,
// ship: "m1":4.23,"m2":-15.3,"n1":14.43,"n2":7.68,"n3":13.66,"a":6.7,"b":-11.57,
// ship: "m1":9.76,"m2":5.32,"n1":-11.47,"n2":-4.3,"n3":17.44,"a":-10.86,"b":-0.45,
// ship: "m1":4.37,"m2":17.25,"n1":10.67,"n2":3.09,"n3":7.79,"a":15.04,"b":-3.64,
// ship: "m1":3.92,"m2":-11.18,"n1":14.41,"n2":6.55,"n3":9.3,"a":-4.6,"b":-12.44,
// ship: "m1":7.74,"m2":7.15,"n1":10.12,"n2":12.33,"n3":3.49,"a":5.79,"b":9.31,
// pin: "m1":-9.93,"m2":15.85,"n1":9.21,"n2":13.46,"n3":13.48,"a":-15.97,"b":-18.56,
// pin: "m1":-6.06,"m2":-19.29,"n1":9.76,"n2":16.93,"n3":17.93,"a":0.5,"b":-1.29,
// pin: "m1":5.99,"m2":3.42,"n1":4.51,"n2":3.46,"n3":12.15,"a":13.72,"b":-3.02,
// round6: "m1":-0.88,"m2":11.26,"n1":-12.38,"n2":-0.99,"n3":11.93,"a":-17.01,"b":-0.79,
// round4: "m1":-0.36,"m2":-7.65,"n1":13.38,"n2":14.34,"n3":12.27,"a":-12.81,"b":19,
// round5: "m1":-0.37,"m2":-10.3,"n1":9.61,"n2":-10.35,"n3":3.44,"a":-0.49,"b":-5.38,
// round7: "m1":-13.56,"m2":-3.16,"n1":-15.32,"n2":1.05,"n3":1.09,"a":6.81,"b":-10.39,
// round7: "m1":0.42,"m2":14.22,"n1":1.24,"n2":0.53,"n3":2.67,"a":-11.39,"b":4.57,
// round9: "m1":-17.57,"m2":17.96,"n1":15.27,"n2":1.42,"n3":1.99,"a":-17.91,"b":16.58,
// roundn: "m1":12.93,"m2":12.87,"n1":-8.95,"n2":5.6,"n3":6.08,"a":18.83,"b":11.54,
// roundn: "m1":-9.42,"m2":-8.71,"n1":12.51,"n2":5.97,"n3":7.64,"a":12.61,"b":-7.23,
// roundn: "m1":-18.12,"m2":18.1,"n1":-5.2,"n2":4.44,"n3":2.2,"a":1.24,"b":3.89,
// egg: "m1":-1.47,"m2":-7.9,"n1":0.36,"n2":-6.79,"n3":10.3,"a":-4.92,"b":-7.64,
// egg: "m1":-0.56,"m2":-5.95,"n1":4.5,"n2":2.41,"n3":2.98,"a":-13.25,"b":11.67,
// egg: "m1":0.81,"m2":5.42,"n1":-0.98,"n2":-3.57,"n3":11.18,"a":14.43,"b":-19.17,
// egg: "m1":-1.74,"m2":1.57,"n1":1.7,"n2":-19.58,"n3":13.55,"a":3.02,"b":-0.9,
// present: "m1":-5.79,"m2":15.11,"n1":11.52,"n2":15.25,"n3":-5.9,"a":-0.5,"b":2.32,
// cross: "m1":-14.81,"m2":7.54,"n1":6.16,"n2":16.18,"n3":16.88,"a":15.59,"b":-7.14,
// cross: "m1":8.07,"m2":7.73,"n1":10.26,"n2":9.58,"n3":13.32,"a":6.56,"b":-18.81,
// semicirc: "m1":-1.55,"m2":-1.15,"n1":10.04,"n2":3.73,"n3":15.31,"a":-9.31,"b":-1.16,
// semicirc: "m1":2.28,"m2":-1.51,"n1":15.75,"n2":4.82,"n3":4.98,"a":-1.55,"b":1.84,
// semicirc: "m1":-6.38,"m2":1.59,"n1":8.35,"n2":13.32,"n3":10.07,"a":5.47,"b":-5.1,
// lines: "m1":-11.91,"m2":-17.4,"n1":4.17,"n2":6.36,"n3":10.41,"a":-2,"b":18.27,
// star: "m1":19.46,"m2":19.21,"n1":2.38,"n2":8.18,"n3":12.3,"a":-9.13,"b":15.82,
// star: "m1":15.82,"m2":6.23,"n1":-19.5,"n2":-10.56,"n3":2.91,"a":-19.71,"b":19.57,
// star: "m1":-19.8,"m2":18.77,"n1":-2.95,"n2":-0.49,"n3":15.19,"a":-7.9,"b":8.35,
// star: "m1":-19.74,"m2":11.23,"n1":-11.4,"n2":-3.36,"n3":2.84,"a":10.34,"b":-3.74,
// star: "m1":-19.79,"m2":-13.17,"n1":8.36,"n2":0.97,"n3":13.65,"a":-5.28,"b":-4.22,
// drop: "m1":1.93,"m2":18.36,"n1":19.77,"n2":5.45,"n3":12.07,"a":-11.13,"b":-19.13,
// drop: "m1":1.92,"m2":-10.44,"n1":-9.18,"n2":-5.19,"n3":17.38,"a":1.16,"b":-10.03,
// drop: "m1":4.3,"m2":0.7,"n1":-2.85,"n2":2.76,"n3":12.51,"a":9.55,"b":-0.5,
// helex: "m1":-15.13,"m2":-11.94,"n1":13.89,"n2":-0.76,"n3":-13.81,"a":15.46,"b":-16.12,
// helex: "m1":13.1,"m2":8.17,"n1":9.16,"n2":-0.93,"n3":-11.66,"a":-14.09,"b":5.63,
// crew: "m1":4.86,"m2":-13.68,"n1":-13,"n2":11.04,"n3":13.42,"a":9.38,"b":-7.11,
// fruit: "m1":-19.05,"m2":0.56,"n1":-3.64,"n2":9.05,"n3":5.12,"a":-12.55,"b":9.63,
// fruit: "m1":2.53,"m2":14.72,"n1":9.69,"n2":-14.2,"n3":13.74,"a":-8.77,"b":-17.73,
// star: m:0.01250,n1:1,n2:1,n3:2.563,a:0.6500,b:-3.175,
// "m1":7.28,"m2":7.67,"n1":10.19,"n2":14.4,"n3":-7.48,"a":5.38,"b":4.45, // quadrifolio
/* implossion , explosion */
/* "ra2": (i === 0) ? [[[60,60,60,60*1.2,60*0.1,60*4]]] : [[[60,60*1.1,60*0.1,60*1.2*1.1,60*0.1*1.2,60*4*1.6]]], */
} // end a
var enty = function (_) {
if (arguments.length > 0 && typeof _ === 'string' && state[_] !== undefined) return state[_]
else return null
}
return enty
}
exports.muonAnimas = muonAnimas
}))
/******************************************
* @muonAnimation
*
**/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonAnimation = global.muonAnimation || {})))
}(this, function (exports) {
'use strict'
let muonAnimation = function (__mapper) {
let f = __mapper('xs').m('props'),
mstore = __mapper('xs').m('store')
let state = {}
state.animas = [] // global animas
/*******************************************
*
* @aniListener
*
**/
let aniListener = function aniListener (elapsed) {
state.animas = f.a(__mapper('muonStore').animasLive())
/*******************************************
* @TIME
*/
state.animas = f.a(__mapper('muonStore').animasLive())
for (let i = 0; i < state.animas.length; i++) {
let anima = state.animas[i]
anima.payload.tim = __mapper('muonTim')(anima.payload.tim, elapsed) // set time
if (elapsed > anima.payload.tim.limit + anima.payload.tim.msStart) {
anima.payload.delled = 1 // crop by time
}
}
/*******************************************
* @STOP
*/
let maxlimit = state.animas.reduce((pre, item) => Math.max(pre, item.payload.tim.limit + item.payload.tim.msStart), 0)
let nostop = state.animas.reduce((pre, item) => (pre || item.payload.tim.nostop), false)
if (!nostop && (isNaN(maxlimit) ||
(maxlimit > 0 && elapsed > maxlimit) || // stop if spired
(elapsed > maxlimit) )) { // stop if anigrams spired
state.animationStop()
}
/*******************************************
* @WEEN generate animas and offsprings
*/
for (let i = 0; i < state.animas.length; i++) {
let anima = state.animas[i] // each anima in animas live
let newAnimas = __mapper('xs').m('store').ween(anima) // has generated animas
__mapper('xs').m('store').apply({'type': 'UPDANIMA', 'caller': 'alima', 'animas': newAnimas})
}
state.animas = f.a(__mapper('muonStore').animasLive())
/*******************************************
* @SIM defaults position of nodes
*/
let sim = __mapper('xs').m('sim').sim() // simulation on animas
__mapper('xs').m('sim').simulate(sim, state.animas, elapsed) // stored
state.animas = f.a(__mapper('muonStore').animasLive())
/*******************************************
* @GRAMM animas to anigrams
*/
for (let i = 0; i < state.animas.length; i++) {
let anima = state.animas[i]
let newAnigrams = []
//md: mstore.gramm calls UPDANIGRAM
//md: anigrams geofolds are saved in the proformed domain
newAnigrams = f.a(mstore.gramm(anima)) /* GRAMM */
}
let anigrams = __mapper('xs').m('store').anigrams()
/*******************************************
* @RENDER
*/
let featurecollection = {
'type': 'FeatureCollection',
'features': anigrams.map(d => d.geofold)
}
if (__mapper('renderSvg') !== undefined) __mapper('renderSvg').render(elapsed, featurecollection)
if (__mapper('renderWebgl') !== undefined) __mapper('renderWebgl').render(elapsed, featurecollection)
if (__mapper('renderCanvas') !== undefined) __mapper('renderCanvas').render(elapsed, featurecollection)
}
/*******************************************
* @LISTENER
*/
if (state.animationStop === undefined) state.animationStop = __mapper('xs').c('timer').subscribe(aniListener)
/*******************************************
* @enty
*/
function enty () {}
enty.animationStop = () => state.animationStop
return enty
}
exports.muonAnimation = muonAnimation
}))
/***********
* @muonAnitem
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonAnitem = global.muonAnitem || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **manage anitem definition**
// md: ## functions
// md: * [node](#node) - get sim node from anitem payload
// md: @anitem
// md: * [setAnitem](#setAnitem) - rebuild the anitem root components
// md: @anitem
// md: * nodeProformedSitus -
// md: * nodeSitus -
// md: * parentCoords -
// md: * parentSitus -
// md: * coreGeoform -
// md: * coreGeonode -
// md:
// md:
// md: ## methods
// md: * halo -
// md: * geofold -
// md: * payload -
// md: * nodeProformedSitus -
// md: * nodeSitus -
// md: * coreGeoform -
// md: * coreGeonode -
// md: * anigram -
// md: * parentCoords -
// md: * parentSitus -
// md: * node -
// md: * conform -
// md: * conform$2 -
// md: * form -
// md: * form$2 -
// md: * ereform -
// md: * proform -
// md: * ric -
// md: * tim -
// md: * boform -
// md: * avatars -
// md: * parentuid -
// md: * uid -
// md: * dims -
// md: * anilocation -
// md: * x -
// md: * y -
// md: * z -
// md: * iscoord -
// md: * isnat -
// md: * basicclone -
// md:
// md:
// md: # license
// md: MIT
let muonAnitem = function muonAnitem (__mapper = {}) {
let f = __mapper('xs').m('props'),
mgeonode = __mapper('xs').m('geonode')
let state = {}
state.anitem = {}
// ............................. setAnitem
let setAnitem = function (d = {}) {
let a = state.anitem = {}
let c = {
halo: d.halo, // halo
geofold: d.geofold, // geofold
payload: d.payload, // payload
avatars: d.avatars // avatars
}
a = Object.assign(a, c)
return a
}
// ............................. node
let node = function () {
if (state.anitem.payload === undefined) state.anitem.payload = {}
let node = {
x: state.anitem.payload.x,
y: state.anitem.payload.y,
z: state.anitem.payload.z,
_x: state.anitem.payload._x, // past
_y: state.anitem.payload._y, // past
_z: state.anitem.payload._z, // past
vx: state.anitem.payload.vx,
vy: state.anitem.payload.vy,
vz: state.anitem.payload.vz,
fx: state.anitem.payload.fx,
fy: state.anitem.payload.fy,
fz: state.anitem.payload.fz,
dx: state.anitem.payload.dx,
dy: state.anitem.payload.dy,
dz: state.anitem.payload.dz
}
return node
}
// ............................. nodeProformedSitus
let nodeProformedSitus = function (ani) {
let r = [0, 0, 0]
if (ani.geofold &&
ani.geofold.properties.geonode &&
ani.geofold.properties.geonode.properties.nodeProformed !== undefined) {
r = ani.geofold.properties.geonode.properties.nodeProformed.geometry.coordinates
}
return r
}
// ............................. nodeSitus
let nodeSitus = function (ani) {
if (2 && 2 && !ani)console.log(` * error: manitem.nodeSitus:ani: ${ani}`)
let r = [0, 0, 0]
if (ani.geofold &&
ani.geofold.properties.geonode) {
r = ani.geofold.properties.geonode.geometry.coordinates
}
return r
}
// ............................. parentCoords
let parentCoords = function (payload, coords = []) {
// if whole anitem has been passed, focus on payload
if (payload && payload.payload !== undefined) payload = payload.payload
let parentGeometry
let parentuid = payload.parentuid
let parent = __mapper('xs').m('store').findAnigramFromUid(parentuid)
if (parent !== undefined) {
// let geoj = parent.payload.ent
let geoj = parent.geofold
coords = __mapper('xs').m('geoj').getCoords(geoj)
}
return coords
}
// ............................. parentSitus
let parentSitus = function (payload, coords = []) {
// if whole anitem has been passed, focus on payload
if (payload && payload.payload !== undefined) payload = payload.payload
let parentGeometry
let parentuid = payload.parentuid
let parent = __mapper('xs').m('store').findAnigramFromUid(parentuid)
if (parent !== undefined) {
parent.payload.geonode = mgeonode.init(parent.payload.geonode)
coords = parent.payload.geonode.geometry.coordinates
}
return coords
}
// ............................. coreGeoform
let coreGeoform = () => p => ({ // geofold
type: 'Feature',
geometry: { type: 'Point', coordinates: [0, 0, 0]},
properties: {}
})
// ............................. coreGeonode
let coreGeonode = () => ({
type: 'Feature',
geometry: { type: 'Point', coordinates: null },
properties: {orgen: null, velin: null, velang: null, prevous: null, geodelta: null}
})
// ............................. enty
let enty = function (anima, t) {
let anigram = {}
if (anima !== undefined) {
if (t !== undefined) {
anigram = __mapper('xs').m('snap')(anima, t)
} else if (anima.payload.tim && anima.payload.tim.unitTime !== undefined) {
let t = anima.payload.tim.unitTime
anigram = __mapper('xs').m('snap')(anima, t)
}
if (anigram.payload === undefined) anigram.payload = {}
anigram.geofold = f.v((anigram.geofold), anigram) // geofold
anigram.payload.conform = f.v(anigram.payload.conform, anigram) // conform
anigram.payload.proform = f.v(anigram.payload.proform, anigram) // proform
setAnitem(anigram)
}
return enty
}
enty.halo = (_) => { return _ !== undefined ? (state.anitem.halo = _, state.anitem) : state.anitem.halo }
enty.geofold = (_) => { return _ !== undefined ? (state.anitem.geofold = _, state.anitem) : state.anitem.geofold }
enty.payload = (_) => { return _ !== undefined ? (state.anitem.payload = _, state.anitem) : state.anitem.payload }
enty.nodeProformedSitus = nodeProformedSitus
enty.nodeSitus = nodeSitus
enty.coreGeoform = coreGeoform // default halo geofold
enty.coreGeonode = coreGeonode // default halo geonode
enty.anigram = (ani, t) => { // anigam
if (ani !== undefined) { // if give anima
if (t !== undefined) { // if given time
ani = __mapper('xs').m('snap')(ani, t) // anima snap to anigram
}
setAnitem(ani) // build anitem
}
return state.anitem // give anitem back
}
enty.parentCoords = parentCoords
enty.parentSitus = parentSitus
enty.node = node // anitem => node
enty.conform = _ => { return _ !== undefined ? (state.anitem.payload.conform = _, state.anitem) : state.anitem.payload.conform }
enty.conform$2 = _ => { return _ !== undefined ? (state.anitem.payload.conform = _, state.anitem) : (delete state.anitem.payload.conform.z, state.anitem.payload.conform) }
enty.form = (_) => { return _ !== undefined ? (state.anitem.payload.form = _, state.anitem) : state.anitem.payload.form }
enty.form$2 = (_) => { return _ !== undefined ? (state.anitem.payload.form = _, state.anitem) : (delete state.anitem.payload.form.z, state.anitem.payload.form) }
enty.ereform = (_) => { return _ !== undefined ? (state.anitem.payload.ereform = _, state.anitem) : state.anitem.payload.ereform }
enty.proform = (_) => { return _ !== undefined ? (state.anitem.payload.proform = _, state.anitem) : state.anitem.payload.proform }
enty.ric = (_) => { return _ !== undefined ? (state.anitem.payload.ric = _, state.anitem) : state.anitem.payload.ric }
enty.tim = (_) => { return _ !== undefined ? (state.anitem.payload.tim = _, state.anitem) : state.anitem.payload.tim }
enty.boform = (_) => { return _ !== undefined ? (state.anitem.payload.boform = _, state.anitem) : state.anitem.payload.boform }
enty.avatars = (_) => { return _ !== undefined ? (state.anitem.avatars = _, state.anitem) : state.anitem.avatars }
enty.parentuid = (_) => { return _ !== undefined ? (state.anitem.payload.parentuid = _, state.anitem) : state.anitem.payload.parentuid }
enty.uid = (_) => { return _ !== undefined ? (state.anitem.payload.uid = _, state.anitem) : state.anitem.payload.uid }
enty.dims = () => ['x', 'y', 'z']
enty.anilocation = a => [ a.x, a.y, a.z ]
enty.x = a => a.x
enty.y = a => a.y
enty.z = a => a.z
enty.iscoord = _ => _.x !== undefined || _.y !== undefined || _.z !== undefined
enty.isnat = _ => _.m1 !== undefined && _.n1 !== undefined && _.a !== undefined
enty.basicclone = anigram => {
let clone = {}
clone.payload = {}
clone.payload.tim = anigram.payload.tim
clone.payload.ric = {}
clone.payload.ric.gid = anigram.payload.ric.gid
clone.payload.ric.cid = anigram.payload.ric.cid
clone.payload.ric.fid = anigram.payload.ric.fid
return clone
}
return enty
}
exports.muonAnitem = muonAnitem
}))
/***********
* @muonAudio
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonAudio = global.muonAudio || {})))
}(this, function (exports) {
'use strict'
// alexmacy�s Block 41bf2c3727c59a3366528807c2c708b2
// Updated March 30, 2017
// ref.: https://bl.ocks.org/alexmacy/41bf2c3727c59a3366528807c2c708b2
// Released under the The MIT License.
var muonAudio = function (__mapper) {
var audioCtx = new (window.AudioContext || window.webkitAudioContext)(),
oscillator = audioCtx.createOscillator(),
gainNode = audioCtx.createGain(),
analyser = audioCtx.createAnalyser()
oscillator.connect(audioCtx.destination)
gainNode.connect(audioCtx.destination)
oscillator.connect(gainNode)
oscillator.connect(analyser)
var bufferLength = analyser.frequencyBinCount
var dataArray = new Uint8Array(analyser.frequencyBinCount)
gainNode.gain.value = -1
oscillator.frequency.value = 0
oscillator.start(0)
var width = innerWidth,
height = innerHeight
// var scaleY = d3.scalePow().exponent(-.25).domain([height,10]).range([100,5000])
var scaleY = d3.scalePow().exponent(-0.25).domain([height, 1]).range([100, 5000])
var scaleX = d3.scaleLinear().domain([0, bufferLength]).range([0, width])
// var gainScale = d3.scaleLinear().domain([0,width]).range([-1,0])
var gainScale = d3.scaleLinear().domain([0, 60]).range([-1, 0])
var octaves = [110, 220, 440, 880, 1760, 3520]
var tickerHist = [0]
var line = d3.line()
.x(function (d, i) { return scaleX(i) })
.y(function (d) { return (d - 122.5) * (gainNode.gain.value + 1) })
var tickerHist = [0]
oscStart()
function oscStart () {
if (oscillator.noteOn) oscillator.noteOn(0)
}
function oscStop () {
oscillator.frequency.value = 0
gainNode.gain.value = -1
updateWave(100)
}
function oscChange () {
ticker.attr('transform', `translate(${d3.event.pageX},0)`)
oscillator.frequency.value = scaleY(d3.event.pageY)
gainNode.gain.value = gainScale(d3.event.pageX)
updateWave(1)
}
function updateWave (duration) {
analyser.getByteTimeDomainData(dataArray)
// waveShape.transition().duration(duration).ease(d3.easeLinear).attr("d",line)
// freq.text(`Frequency: ${d3.format(',.0f')(oscillator.frequency.value)} Hz`);
}
function enty () { }
enty.play = _ => {
oscillator.frequency.value = scaleY(_.freq) // scaleY(d3.event.pageY) // [100,5000]
gainNode.gain.value = gainScale(_.gain) // d3.event.pageX) // [-1,0]
updateWave(1)
}
enty.stop = () => {
oscillator.frequency.value = 0
gainNode.gain.value = -1
updateWave(100)
}
return enty
}
exports.muonAudio = muonAudio
}))
/***************************
* @muonBezierjs
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonBezierjs = global.muonBezierjs || {})))
}(this, function (exports) {
'use strict'
// https://github.com/Pomax/bezierjs
// http://pomax.github.io/bezierjs/
// https://pomax.github.io/bezierinfo/
let muonBezierjs = function (__mapper = {}) {
/**
* Utils
*
*/
// math-inlining.
var abs = Math.abs,
cos = Math.cos,
sin = Math.sin,
acos = Math.acos,
atan2 = Math.atan2,
sqrt = Math.sqrt,
pow = Math.pow,
// cube root function yielding real roots
crt = function(v) { return (v<0) ? -pow(-v,1/3) : pow(v,1/3); },
// trig constants
pi = Math.PI,
tau = 2*pi,
quart = pi/2,
// float precision significant decimal
epsilon = 0.000001,
// extremas used in bbox calculation and similar algorithms
nMax = (Number.MAX_SAFE_INTEGER||9007199254740991),
nMin = (Number.MIN_SAFE_INTEGER||-9007199254740991);
// Bezier utility functions
var utils = {
// Legendre-Gauss abscissae with n=24 (x_i values, defined at i=n as the roots of the nth order Legendre polynomial Pn(x))
Tvalues: [
-0.0640568928626056260850430826247450385909,
0.0640568928626056260850430826247450385909,
-0.1911188674736163091586398207570696318404,
0.1911188674736163091586398207570696318404,
-0.3150426796961633743867932913198102407864,
0.3150426796961633743867932913198102407864,
-0.4337935076260451384870842319133497124524,
0.4337935076260451384870842319133497124524,
-0.5454214713888395356583756172183723700107,
0.5454214713888395356583756172183723700107,
-0.6480936519369755692524957869107476266696,
0.6480936519369755692524957869107476266696,
-0.7401241915785543642438281030999784255232,
0.7401241915785543642438281030999784255232,
-0.8200019859739029219539498726697452080761,
0.8200019859739029219539498726697452080761,
-0.8864155270044010342131543419821967550873,
0.8864155270044010342131543419821967550873,
-0.9382745520027327585236490017087214496548,
0.9382745520027327585236490017087214496548,
-0.9747285559713094981983919930081690617411,
0.9747285559713094981983919930081690617411,
-0.9951872199970213601799974097007368118745,
0.9951872199970213601799974097007368118745
],
// Legendre-Gauss weights with n=24 (w_i values, defined by a function linked to in the Bezier primer article)
Cvalues: [
0.1279381953467521569740561652246953718517,
0.1279381953467521569740561652246953718517,
0.1258374563468282961213753825111836887264,
0.1258374563468282961213753825111836887264,
0.1216704729278033912044631534762624256070,
0.1216704729278033912044631534762624256070,
0.1155056680537256013533444839067835598622,
0.1155056680537256013533444839067835598622,
0.1074442701159656347825773424466062227946,
0.1074442701159656347825773424466062227946,
0.0976186521041138882698806644642471544279,
0.0976186521041138882698806644642471544279,
0.0861901615319532759171852029837426671850,
0.0861901615319532759171852029837426671850,
0.0733464814110803057340336152531165181193,
0.0733464814110803057340336152531165181193,
0.0592985849154367807463677585001085845412,
0.0592985849154367807463677585001085845412,
0.0442774388174198061686027482113382288593,
0.0442774388174198061686027482113382288593,
0.0285313886289336631813078159518782864491,
0.0285313886289336631813078159518782864491,
0.0123412297999871995468056670700372915759,
0.0123412297999871995468056670700372915759
],
arcfn: function(t, derivativeFn) {
var d = derivativeFn(t);
var l = d.x*d.x + d.y*d.y;
if(typeof d.z !== "undefined") {
l += d.z*d.z;
}
return sqrt(l);
},
between: function(v, m, M) {
return (m <= v && v <= M) || utils.approximately(v, m) || utils.approximately(v, M);
},
approximately: function(a,b,precision) {
return abs(a-b) <= (precision || epsilon);
},
length: function(derivativeFn) {
var z=0.5,sum=0,len=utils.Tvalues.length,i,t;
for(i=0; i<len; i++) {
t = z * utils.Tvalues[i] + z;
sum += utils.Cvalues[i] * utils.arcfn(t,derivativeFn);
}
return z * sum;
},
map: function(v, ds,de, ts,te) {
var d1 = de-ds, d2 = te-ts, v2 = v-ds, r = v2/d1;
return ts + d2*r;
},
lerp: function(r, v1, v2) {
var ret = {
x: v1.x + r*(v2.x-v1.x),
y: v1.y + r*(v2.y-v1.y)
};
if(!!v1.z && !!v2.z) {
ret.z = v1.z + r*(v2.z-v1.z);
}
return ret;
},
pointToString: function(p) {
var s = p.x+"/"+p.y;
if(typeof p.z !== "undefined") {
s += "/"+p.z;
}
return s;
},
pointsToString: function(points) {
return "[" + points.map(utils.pointToString).join(", ") + "]";
},
copy: function(obj) {
return JSON.parse(JSON.stringify(obj));
},
angle: function(o,v1,v2) {
var dx1 = v1.x - o.x,
dy1 = v1.y - o.y,
dx2 = v2.x - o.x,
dy2 = v2.y - o.y,
cross = dx1*dy2 - dy1*dx2,
dot = dx1*dx2 + dy1*dy2;
return atan2(cross, dot);
},
// round as string, to avoid rounding errors
round: function(v, d) {
var s = '' + v;
var pos = s.indexOf(".");
return parseFloat(s.substring(0,pos+1+d));
},
dist: function(p1, p2) {
var dx = p1.x - p2.x,
dy = p1.y - p2.y;
return sqrt(dx*dx+dy*dy);
},
closest: function(LUT, point) {
var mdist = pow(2,63), mpos, d;
LUT.forEach(function(p, idx) {
d = utils.dist(point, p);
if (d<mdist) {
mdist = d;
mpos = idx;
}
});
return { mdist:mdist, mpos:mpos };
},
abcratio: function(t, n) {
// see ratio(t) note on http://pomax.github.io/bezierinfo/#abc
if (n!==2 && n!==3) {
return false;
}
if (typeof t === "undefined") {
t = 0.5;
} else if (t===0 || t===1) {
return t;
}
var bottom = pow(t,n) + pow(1-t,n), top = bottom - 1;
return abs(top/bottom);
},
projectionratio: function(t, n) {
// see u(t) note on http://pomax.github.io/bezierinfo/#abc
if (n!==2 && n!==3) {
return false;
}
if (typeof t === "undefined") {
t = 0.5;
} else if (t===0 || t===1) {
return t;
}
var top = pow(1-t, n), bottom = pow(t,n) + top;
return top/bottom;
},
lli8: function(x1,y1,x2,y2,x3,y3,x4,y4) {
var nx=(x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4),
ny=(x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4),
d=(x1-x2)*(y3-y4)-(y1-y2)*(x3-x4);
if(d==0) { return false; }
return { x: nx/d, y: ny/d };
},
lli4: function(p1,p2,p3,p4) {
var x1 = p1.x, y1 = p1.y,
x2 = p2.x, y2 = p2.y,
x3 = p3.x, y3 = p3.y,
x4 = p4.x, y4 = p4.y;
return utils.lli8(x1,y1,x2,y2,x3,y3,x4,y4);
},
lli: function(v1, v2) {
return utils.lli4(v1,v1.c,v2,v2.c);
},
makeline: function(p1,p2) {
// var Bezier = require('./bezier');
var x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y, dx = (x2-x1)/3, dy = (y2-y1)/3;
return new Bezier(x1, y1, x1+dx, y1+dy, x1+2*dx, y1+2*dy, x2, y2);
},
findbbox: function(sections) {
var mx=nMax,my=nMax,MX=nMin,MY=nMin;
sections.forEach(function(s) {
var bbox = s.bbox();
if(mx > bbox.x.min) mx = bbox.x.min;
if(my > bbox.y.min) my = bbox.y.min;
if(MX < bbox.x.max) MX = bbox.x.max;
if(MY < bbox.y.max) MY = bbox.y.max;
});
return {
x: { min: mx, mid:(mx+MX)/2, max: MX, size:MX-mx },
y: { min: my, mid:(my+MY)/2, max: MY, size:MY-my }
}
},
shapeintersections: function(s1, bbox1, s2, bbox2, curveIntersectionThreshold) {
if(!utils.bboxoverlap(bbox1, bbox2)) return [];
var intersections = [];
var a1 = [s1.startcap, s1.forward, s1.back, s1.endcap];
var a2 = [s2.startcap, s2.forward, s2.back, s2.endcap];
a1.forEach(function(l1) {
if(l1.virtual) return;
a2.forEach(function(l2) {
if(l2.virtual) return;
var iss = l1.intersects(l2, curveIntersectionThreshold);
if(iss.length>0) {
iss.c1 = l1;
iss.c2 = l2;
iss.s1 = s1;
iss.s2 = s2;
intersections.push(iss);
}
});
});
return intersections;
},
makeshape: function(forward, back, curveIntersectionThreshold) {
var bpl = back.points.length;
var fpl = forward.points.length;
var start = utils.makeline(back.points[bpl-1], forward.points[0]);
var end = utils.makeline(forward.points[fpl-1], back.points[0]);
var shape = {
startcap: start,
forward: forward,
back: back,
endcap: end,
bbox: utils.findbbox([start, forward, back, end])
};
var self = utils;
shape.intersections = function(s2) {
return self.shapeintersections(shape,shape.bbox,s2,s2.bbox, curveIntersectionThreshold);
};
return shape;
},
getminmax: function(curve, d, list) {
if(!list) return { min:0, max:0 };
var min=nMax, max=nMin,t,c;
if(list.indexOf(0)===-1) { list = [0].concat(list); }
if(list.indexOf(1)===-1) { list.push(1); }
for(var i=0,len=list.length; i<len; i++) {
t = list[i];
c = curve.get(t);
if(c[d] < min) { min = c[d]; }
if(c[d] > max) { max = c[d]; }
}
return { min:min, mid:(min+max)/2, max:max, size:max-min };
},
align: function(points, line) {
var tx = line.p1.x,
ty = line.p1.y,
a = -atan2(line.p2.y-ty, line.p2.x-tx),
d = function(v) {
return {
x: (v.x-tx)*cos(a) - (v.y-ty)*sin(a),
y: (v.x-tx)*sin(a) + (v.y-ty)*cos(a)
};
};
return points.map(d);
},
roots: function(points, line) {
line = line || {p1:{x:0,y:0},p2:{x:1,y:0}};
var order = points.length - 1;
var p = utils.align(points, line);
var reduce = function(t) { return 0<=t && t <=1; };
if (order === 2) {
var a = p[0].y,
b = p[1].y,
c = p[2].y,
d = a - 2*b + c;
if(d!==0) {
var m1 = -sqrt(b*b-a*c),
m2 = -a+b,
v1 = -( m1+m2)/d,
v2 = -(-m1+m2)/d;
return [v1, v2].filter(reduce);
}
else if(b!==c && d===0) {
return [ (2*b-c)/2*(b-c) ].filter(reduce);
}
return [];
}
// see http://www.trans4mind.com/personal_development/mathematics/polynomials/cubicAlgebra.htm
var pa = p[0].y,
pb = p[1].y,
pc = p[2].y,
pd = p[3].y,
d = (-pa + 3*pb - 3*pc + pd),
a = (3*pa - 6*pb + 3*pc) / d,
b = (-3*pa + 3*pb) / d,
c = pa / d,
p = (3*b - a*a)/3,
p3 = p/3,
q = (2*a*a*a - 9*a*b + 27*c)/27,
q2 = q/2,
discriminant = q2*q2 + p3*p3*p3,
u1,v1,x1,x2,x3;
if (discriminant < 0) {
var mp3 = -p/3,
mp33 = mp3*mp3*mp3,
r = sqrt( mp33 ),
t = -q/(2*r),
cosphi = t<-1 ? -1 : t>1 ? 1 : t,
phi = acos(cosphi),
crtr = crt(r),
t1 = 2*crtr;
x1 = t1 * cos(phi/3) - a/3;
x2 = t1 * cos((phi+tau)/3) - a/3;
x3 = t1 * cos((phi+2*tau)/3) - a/3;
return [x1, x2, x3].filter(reduce);
} else if(discriminant === 0) {
u1 = q2 < 0 ? crt(-q2) : -crt(q2);
x1 = 2*u1-a/3;
x2 = -u1 - a/3;
return [x1,x2].filter(reduce);
} else {
var sd = sqrt(discriminant);
u1 = crt(-q2+sd);
v1 = crt(q2+sd);
return [u1-v1-a/3].filter(reduce);;
}
},
droots: function(p) {
// quadratic roots are easy
if(p.length === 3) {
var a = p[0],
b = p[1],
c = p[2],
d = a - 2*b + c;
if(d!==0) {
var m1 = -sqrt(b*b-a*c),
m2 = -a+b,
v1 = -( m1+m2)/d,
v2 = -(-m1+m2)/d;
return [v1, v2];
}
else if(b!==c && d===0) {
return [(2*b-c)/(2*(b-c))];
}
return [];
}
// linear roots are even easier
if(p.length === 2) {
var a = p[0], b = p[1];
if(a!==b) {
return [a/(a-b)];
}
return [];
}
},
inflections: function(points) {
if (points.length<4) return [];
// FIXME: TODO: add in inflection abstraction for quartic+ curves?
var p = utils.align(points, { p1: points[0], p2: points.slice(-1)[0] }),
a = p[2].x * p[1].y,
b = p[3].x * p[1].y,
c = p[1].x * p[2].y,
d = p[3].x * p[2].y,
v1 = 18 * (-3*a + 2*b + 3*c - d),
v2 = 18 * (3*a - b - 3*c),
v3 = 18 * (c - a);
if (utils.approximately(v1,0)){
if(!utils.approximately(v2,0)){
var t = -v3/v2;
if (0 <= t && t <= 1)
return [t];
}
return [];
}
var trm = v2*v2 - 4*v1*v3,
sq = Math.sqrt(trm),
d = 2 * v1;
if (utils.approximately(d,0)) return [];
return [(sq-v2)/d, -(v2+sq)/d].filter(function(r) {
return (0 <= r && r <= 1);
});
},
bboxoverlap: function(b1,b2) {
var dims=['x','y'],len=dims.length,i,dim,l,t,d
for(i=0; i<len; i++) {
dim = dims[i];
l = b1[dim].mid;
t = b2[dim].mid;
d = (b1[dim].size + b2[dim].size)/2;
if(abs(l-t) >= d) return false;
}
return true;
},
expandbox: function(bbox, _bbox) {
if(_bbox.x.min < bbox.x.min) { bbox.x.min = _bbox.x.min; }
if(_bbox.y.min < bbox.y.min) { bbox.y.min = _bbox.y.min; }
if(_bbox.z && _bbox.z.min < bbox.z.min) { bbox.z.min = _bbox.z.min; }
if(_bbox.x.max > bbox.x.max) { bbox.x.max = _bbox.x.max; }
if(_bbox.y.max > bbox.y.max) { bbox.y.max = _bbox.y.max; }
if(_bbox.z && _bbox.z.max > bbox.z.max) { bbox.z.max = _bbox.z.max; }
bbox.x.mid = (bbox.x.min + bbox.x.max)/2;
bbox.y.mid = (bbox.y.min + bbox.y.max)/2;
if(bbox.z) { bbox.z.mid = (bbox.z.min + bbox.z.max)/2; }
bbox.x.size = bbox.x.max - bbox.x.min;
bbox.y.size = bbox.y.max - bbox.y.min;
if(bbox.z) { bbox.z.size = bbox.z.max - bbox.z.min; }
},
pairiteration: function(c1, c2, curveIntersectionThreshold) {
var c1b = c1.bbox(),
c2b = c2.bbox(),
r = 100000,
threshold = curveIntersectionThreshold || 0.5;
if(c1b.x.size + c1b.y.size < threshold && c2b.x.size + c2b.y.size < threshold) {
return [ ((r * (c1._t1+c1._t2)/2)|0)/r + "/" + ((r * (c2._t1+c2._t2)/2)|0)/r ];
}
var cc1 = c1.split(0.5),
cc2 = c2.split(0.5),
pairs = [
{left: cc1.left, right: cc2.left },
{left: cc1.left, right: cc2.right },
{left: cc1.right, right: cc2.right },
{left: cc1.right, right: cc2.left }];
pairs = pairs.filter(function(pair) {
return utils.bboxoverlap(pair.left.bbox(),pair.right.bbox());
});
var results = [];
if(pairs.length === 0) return results;
pairs.forEach(function(pair) {
results = results.concat(
utils.pairiteration(pair.left, pair.right, threshold)
);
})
results = results.filter(function(v,i) {
return results.indexOf(v) === i;
});
return results;
},
getccenter: function(p1,p2,p3) {
var dx1 = (p2.x - p1.x),
dy1 = (p2.y - p1.y),
dx2 = (p3.x - p2.x),
dy2 = (p3.y - p2.y);
var dx1p = dx1 * cos(quart) - dy1 * sin(quart),
dy1p = dx1 * sin(quart) + dy1 * cos(quart),
dx2p = dx2 * cos(quart) - dy2 * sin(quart),
dy2p = dx2 * sin(quart) + dy2 * cos(quart);
// chord midpoints
var mx1 = (p1.x + p2.x)/2,
my1 = (p1.y + p2.y)/2,
mx2 = (p2.x + p3.x)/2,
my2 = (p2.y + p3.y)/2;
// midpoint offsets
var mx1n = mx1 + dx1p,
my1n = my1 + dy1p,
mx2n = mx2 + dx2p,
my2n = my2 + dy2p;
// intersection of these lines:
var arc = utils.lli8(mx1,my1,mx1n,my1n, mx2,my2,mx2n,my2n),
r = utils.dist(arc,p1),
// arc start/end values, over mid point:
s = atan2(p1.y - arc.y, p1.x - arc.x),
m = atan2(p2.y - arc.y, p2.x - arc.x),
e = atan2(p3.y - arc.y, p3.x - arc.x),
_;
// determine arc direction (cw/ccw correction)
if (s<e) {
// if s<m<e, arc(s, e)
// if m<s<e, arc(e, s + tau)
// if s<e<m, arc(e, s + tau)
if (s>m || m>e) { s += tau; }
if (s>e) { _=e; e=s; s=_; }
} else {
// if e<m<s, arc(e, s)
// if m<e<s, arc(s, e + tau)
// if e<s<m, arc(s, e + tau)
if (e<m && m<s) { _=e; e=s; s=_; } else { e += tau; }
}
// assign and done.
arc.s = s;
arc.e = e;
arc.r = r;
return arc;
},
numberSort: function(a, b) {
return a - b;
}
};
/**
* Poly Bezier
* @param {[type]} curves [description]
*/
var PolyBezier = function(curves) {
this.curves = [];
this._3d = false;
if(!!curves) {
this.curves = curves;
this._3d = this.curves[0]._3d;
}
}
PolyBezier.prototype = {
valueOf: function() {
return this.toString();
},
toString: function() {
return "[" + this.curves.map(function(curve) {
return utils.pointsToString(curve.points);
}).join(", ") + "]";
},
addCurve: function(curve) {
this.curves.push(curve);
this._3d = this._3d || curve._3d;
},
length: function() {
return this.curves.map(function(v) { return v.length(); }).reduce(function(a,b) { return a+b; });
},
curve: function(idx) {
return this.curves[idx];
},
bbox: function() {
var c = this.curves;
var bbox = c[0].bbox();
for(var i=1; i<c.length; i++) {
utils.expandbox(bbox, c[i].bbox());
}
return bbox;
},
offset: function(d) {
var offset = [];
this.curves.forEach(function(v) {
offset = offset.concat(v.offset(d));
});
return new PolyBezier(offset);
}
};
/**
A javascript Bezier curve library by Pomax.
Based on http://pomax.github.io/bezierinfo
This code is MIT licensed.
**/
// math-inlining.
var //
// abs = Math.abs,
min = Math.min,
max = Math.max,
// cos = Math.cos,
// sin = Math.sin,
// acos = Math.acos,
// sqrt = Math.sqrt,
// pi = Math.PI,
// a zero coordinate, which is surprisingly useful
ZERO = {x:0,y:0,z:0};
// quite needed
// var utils = require('./utils.js');
// not quite needed, but eventually this'll be useful...
// var PolyBezier = require('./poly-bezier.js');
/**
* Bezier curve constructor. The constructor argument can be one of three things:
*
* 1. array/4 of {x:..., y:..., z:...}, z optional
* 2. numerical array/8 ordered x1,y1,x2,y2,x3,y3,x4,y4
* 3. numerical array/12 ordered x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4
*
*/
var Bezier = function(coords) {
var args = (coords && coords.forEach) ? coords : [].slice.call(arguments);
var coordlen = false;
if(typeof args[0] === "object") {
coordlen = args.length;
var newargs = [];
args.forEach(function(point) {
['x','y','z'].forEach(function(d) {
if(typeof point[d] !== "undefined") {
newargs.push(point[d]);
}
});
});
args = newargs;
}
var higher = false;
var len = args.length;
if (coordlen) {
if(coordlen>4) {
if (arguments.length !== 1) {
throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");
}
higher = true;
}
} else {
if(len!==6 && len!==8 && len!==9 && len!==12) {
if (arguments.length !== 1) {
throw new Error("Only new Bezier(point[]) is accepted for 4th and higher order curves");
}
}
}
var _3d = (!higher && (len === 9 || len === 12)) || (coords && coords[0] && typeof coords[0].z !== "undefined");
this._3d = _3d;
var points = [];
for(var idx=0, step=(_3d ? 3 : 2); idx<len; idx+=step) {
var point = {
x: args[idx],
y: args[idx+1]
};
if(_3d) { point.z = args[idx+2] };
points.push(point);
}
this.order = points.length - 1;
this.points = points;
var dims = ['x','y'];
if(_3d) dims.push('z');
this.dims = dims;
this.dimlen = dims.length;
(function(curve) {
var order = curve.order;
var points = curve.points;
var a = utils.align(points, {p1:points[0], p2:points[order]});
for(var i=0; i<a.length; i++) {
if(abs(a[i].y) > 0.0001) {
curve._linear = false;
return;
}
}
curve._linear = true;
}(this));
this._t1 = 0;
this._t2 = 1;
this.update();
};
Bezier.fromSVG = function(svgString) {
var list = svgString.match(/[-+]?\d*\.?\d+(?:[eE][-+]?\d+)?/g).map(parseFloat);
var relative = /[cq]/.test(svgString);
if(!relative) return new Bezier(list);
list = list.map(function(v,i) {
return i < 2 ? v : v + list[i % 2];
});
return new Bezier(list);
};
function getABC(n,S,B,E,t) {
if(typeof t === "undefined") { t = 0.5; }
var u = utils.projectionratio(t,n),
um = 1-u,
C = {
x: u*S.x + um*E.x,
y: u*S.y + um*E.y
},
s = utils.abcratio(t,n),
A = {
x: B.x + (B.x-C.x)/s,
y: B.y + (B.y-C.y)/s
};
return { A:A, B:B, C:C };
}
Bezier.quadraticFromPoints = function(p1,p2,p3, t) {
if(typeof t === "undefined") { t = 0.5; }
// shortcuts, although they're really dumb
if(t===0) { return new Bezier(p2,p2,p3); }
if(t===1) { return new Bezier(p1,p2,p2); }
// real fitting.
var abc = getABC(2,p1,p2,p3,t);
return new Bezier(p1, abc.A, p3);
};
Bezier.cubicFromPoints = function(S,B,E, t,d1) {
if(typeof t === "undefined") { t = 0.5; }
var abc = getABC(3,S,B,E,t);
if(typeof d1 === "undefined") { d1 = utils.dist(B,abc.C); }
var d2 = d1 * (1-t)/t;
var selen = utils.dist(S,E),
lx = (E.x-S.x)/selen,
ly = (E.y-S.y)/selen,
bx1 = d1 * lx,
by1 = d1 * ly,
bx2 = d2 * lx,
by2 = d2 * ly;
// derivation of new hull coordinates
var e1 = { x: B.x - bx1, y: B.y - by1 },
e2 = { x: B.x + bx2, y: B.y + by2 },
A = abc.A,
v1 = { x: A.x + (e1.x-A.x)/(1-t), y: A.y + (e1.y-A.y)/(1-t) },
v2 = { x: A.x + (e2.x-A.x)/(t), y: A.y + (e2.y-A.y)/(t) },
nc1 = { x: S.x + (v1.x-S.x)/(t), y: S.y + (v1.y-S.y)/(t) },
nc2 = { x: E.x + (v2.x-E.x)/(1-t), y: E.y + (v2.y-E.y)/(1-t) };
// ...done
return new Bezier(S,nc1,nc2,E);
};
var getUtils = function() {
return utils;
};
Bezier.getUtils = getUtils;
Bezier.prototype = {
getUtils: getUtils,
valueOf: function() {
return this.toString();
},
toString: function() {
return utils.pointsToString(this.points);
},
toSVG: function(relative) {
if(this._3d) return false;
var p = this.points,
x = p[0].x,
y = p[0].y,
s = ["M", x, y, (this.order===2 ? "Q":"C")];
for(var i=1, last=p.length; i<last; i++) {
s.push(p[i].x);
s.push(p[i].y);
}
return s.join(" ");
},
update: function() {
// one-time compute derivative coordinates
this.dpoints = [];
for(var p=this.points, d=p.length, c=d-1; d>1; d--, c--) {
var list = [];
for(var j=0, dpt; j<c; j++) {
dpt = {
x: c * (p[j+1].x - p[j].x),
y: c * (p[j+1].y - p[j].y)
};
if(this._3d) {
dpt.z = c * (p[j+1].z - p[j].z);
}
list.push(dpt);
}
this.dpoints.push(list);
p = list;
};
this.computedirection();
},
computedirection: function() {
var points = this.points;
var angle = utils.angle(points[0], points[this.order], points[1]);
this.clockwise = angle > 0;
},
length: function() {
return utils.length(this.derivative.bind(this));
},
_lut: [],
getLUT: function(steps) {
steps = steps || 100;
if (this._lut.length === steps) { return this._lut; }
this._lut = [];
for(var t=0; t<=steps; t++) {
this._lut.push(this.compute(t/steps));
}
return this._lut;
},
on: function(point, error) {
error = error || 5;
var lut = this.getLUT(), hits = [], c, t=0;
for(var i=0; i<lut.length; i++) {
c = lut[i];
if (utils.dist(c,point) < error) {
hits.push(c)
t += i / lut.length;
}
}
if(!hits.length) return false;
return t /= hits.length;
},
project: function(point) {
// step 1: coarse check
var LUT = this.getLUT(), l = LUT.length-1,
closest = utils.closest(LUT, point),
mdist = closest.mdist,
mpos = closest.mpos;
if (mpos===0 || mpos===l) {
var t = mpos/l, pt = this.compute(t);
pt.t = t;
pt.d = mdist;
return pt;
}
// step 2: fine check
var ft, t, p, d,
t1 = (mpos-1)/l,
t2 = (mpos+1)/l,
step = 0.1/l;
mdist += 1;
for(t=t1,ft=t; t<t2+step; t+=step) {
p = this.compute(t);
d = utils.dist(point, p);
if (d<mdist) {
mdist = d;
ft = t;
}
}
p = this.compute(ft);
p.t = ft;
p.d = mdist;
return p;
},
get: function(t) {
return this.compute(t);
},
point: function(idx) {
return this.points[idx];
},
compute: function(t) {
// shortcuts
if(t===0) { return this.points[0]; }
if(t===1) { return this.points[this.order]; }
var p = this.points;
var mt = 1-t;
// linear?
if(this.order===1) {
ret = {
x: mt*p[0].x + t*p[1].x,
y: mt*p[0].y + t*p[1].y
};
if (this._3d) { ret.z = mt*p[0].z + t*p[1].z; }
return ret;
}
// quadratic/cubic curve?
if(this.order<4) {
var mt2 = mt*mt,
t2 = t*t,
a,b,c,d = 0;
if(this.order===2) {
p = [p[0], p[1], p[2], ZERO];
a = mt2;
b = mt*t*2;
c = t2;
}
else if(this.order===3) {
a = mt2*mt;
b = mt2*t*3;
c = mt*t2*3;
d = t*t2;
}
var ret = {
x: a*p[0].x + b*p[1].x + c*p[2].x + d*p[3].x,
y: a*p[0].y + b*p[1].y + c*p[2].y + d*p[3].y
};
if(this._3d) {
ret.z = a*p[0].z + b*p[1].z + c*p[2].z + d*p[3].z;
}
return ret;
}
// higher order curves: use de Casteljau's computation
var dCpts = JSON.parse(JSON.stringify(this.points));
while(dCpts.length > 1) {
for (var i=0; i<dCpts.length-1; i++) {
dCpts[i] = {
x: dCpts[i].x + (dCpts[i+1].x - dCpts[i].x) * t,
y: dCpts[i].y + (dCpts[i+1].y - dCpts[i].y) * t
};
if (typeof dCpts[i].z !== "undefined") {
dCpts[i] = dCpts[i].z + (dCpts[i+1].z - dCpts[i].z) * t
}
}
dCpts.splice(dCpts.length-1, 1);
}
return dCpts[0];
},
raise: function() {
var p = this.points, np = [p[0]], i, k=p.length, pi, pim;
for (var i=1; i<k; i++) {
pi = p[i];
pim = p[i-1];
np[i] = {
x: (k-i)/k * pi.x + i/k * pim.x,
y: (k-i)/k * pi.y + i/k * pim.y
};
}
np[k] = p[k-1];
return new Bezier(np);
},
derivative: function(t) {
var mt = 1-t,
a,b,c=0,
p = this.dpoints[0];
if(this.order===2) { p = [p[0], p[1], ZERO]; a = mt; b = t; }
if(this.order===3) { a = mt*mt; b = mt*t*2; c = t*t; }
var ret = {
x: a*p[0].x + b*p[1].x + c*p[2].x,
y: a*p[0].y + b*p[1].y + c*p[2].y
};
if(this._3d) {
ret.z = a*p[0].z + b*p[1].z + c*p[2].z;
}
return ret;
},
inflections: function() {
return utils.inflections(this.points);
},
normal: function(t) {
return this._3d ? this.__normal3(t) : this.__normal2(t);
},
__normal2: function(t) {
var d = this.derivative(t);
var q = sqrt(d.x*d.x + d.y*d.y)
return { x: -d.y/q, y: d.x/q };
},
__normal3: function(t) {
// see http://stackoverflow.com/questions/25453159
var r1 = this.derivative(t),
r2 = this.derivative(t+0.01),
q1 = sqrt(r1.x*r1.x + r1.y*r1.y + r1.z*r1.z),
q2 = sqrt(r2.x*r2.x + r2.y*r2.y + r2.z*r2.z);
r1.x /= q1; r1.y /= q1; r1.z /= q1;
r2.x /= q2; r2.y /= q2; r2.z /= q2;
// cross product
var c = {
x: r2.y*r1.z - r2.z*r1.y,
y: r2.z*r1.x - r2.x*r1.z,
z: r2.x*r1.y - r2.y*r1.x
};
var m = sqrt(c.x*c.x + c.y*c.y + c.z*c.z);
c.x /= m; c.y /= m; c.z /= m;
// rotation matrix
var R = [ c.x*c.x, c.x*c.y-c.z, c.x*c.z+c.y,
c.x*c.y+c.z, c.y*c.y, c.y*c.z-c.x,
c.x*c.z-c.y, c.y*c.z+c.x, c.z*c.z ];
// normal vector:
var n = {
x: R[0] * r1.x + R[1] * r1.y + R[2] * r1.z,
y: R[3] * r1.x + R[4] * r1.y + R[5] * r1.z,
z: R[6] * r1.x + R[7] * r1.y + R[8] * r1.z
};
return n;
},
hull: function(t) {
var p = this.points,
_p = [],
pt,
q = [],
idx = 0,
i=0,
l=0;
q[idx++] = p[0];
q[idx++] = p[1];
q[idx++] = p[2];
if(this.order === 3) { q[idx++] = p[3]; }
// we lerp between all points at each iteration, until we have 1 point left.
while(p.length>1) {
_p = [];
for(i=0, l=p.length-1; i<l; i++) {
pt = utils.lerp(t,p[i],p[i+1]);
q[idx++] = pt;
_p.push(pt);
}
p = _p;
}
return q;
},
split: function(t1, t2) {
// shortcuts
if(t1===0 && !!t2) { return this.split(t2).left; }
if(t2===1) { return this.split(t1).right; }
// no shortcut: use "de Casteljau" iteration.
var q = this.hull(t1);
var result = {
left: this.order === 2 ? new Bezier([q[0],q[3],q[5]]) : new Bezier([q[0],q[4],q[7],q[9]]),
right: this.order === 2 ? new Bezier([q[5],q[4],q[2]]) : new Bezier([q[9],q[8],q[6],q[3]]),
span: q
};
// make sure we bind _t1/_t2 information!
result.left._t1 = utils.map(0, 0,1, this._t1,this._t2);
result.left._t2 = utils.map(t1, 0,1, this._t1,this._t2);
result.right._t1 = utils.map(t1, 0,1, this._t1,this._t2);
result.right._t2 = utils.map(1, 0,1, this._t1,this._t2);
// if we have no t2, we're done
if(!t2) { return result; }
// if we have a t2, split again:
t2 = utils.map(t2,t1,1,0,1);
var subsplit = result.right.split(t2);
return subsplit.left;
},
extrema: function() {
var dims = this.dims,
result={},
roots=[],
p, mfn;
dims.forEach(function(dim) {
mfn = function(v) { return v[dim]; };
p = this.dpoints[0].map(mfn);
result[dim] = utils.droots(p);
if(this.order === 3) {
p = this.dpoints[1].map(mfn);
result[dim] = result[dim].concat(utils.droots(p));
}
result[dim] = result[dim].filter(function(t) { return (t>=0 && t<=1); });
roots = roots.concat(result[dim].sort(utils.numberSort));
}.bind(this));
roots = roots.sort(utils.numberSort).filter(function(v,idx) { return (roots.indexOf(v) === idx); });
result.values = roots;
return result;
},
bbox: function() {
var extrema = this.extrema(), result = {};
this.dims.forEach(function(d) {
result[d] = utils.getminmax(this, d, extrema[d]);
}.bind(this));
return result;
},
overlaps: function(curve) {
var lbbox = this.bbox(),
tbbox = curve.bbox();
return utils.bboxoverlap(lbbox,tbbox);
},
offset: function(t, d) {
if(typeof d !== "undefined") {
var c = this.get(t);
var n = this.normal(t);
var ret = {
c: c,
n: n,
x: c.x + n.x * d,
y: c.y + n.y * d
};
if(this._3d) {
ret.z = c.z + n.z * d;
};
return ret;
}
if(this._linear) {
var nv = this.normal(0);
var coords = this.points.map(function(p) {
var ret = {
x: p.x + t * nv.x,
y: p.y + t * nv.y
};
if(p.z && n.z) { ret.z = p.z + t * nv.z; }
return ret;
});
return [new Bezier(coords)];
}
var reduced = this.reduce();
return reduced.map(function(s) {
return s.scale(t);
});
},
simple: function() {
if(this.order===3) {
var a1 = utils.angle(this.points[0], this.points[3], this.points[1]);
var a2 = utils.angle(this.points[0], this.points[3], this.points[2]);
if(a1>0 && a2<0 || a1<0 && a2>0) return false;
}
var n1 = this.normal(0);
var n2 = this.normal(1);
var s = n1.x*n2.x + n1.y*n2.y;
if(this._3d) { s += n1.z*n2.z; }
var angle = abs(acos(s));
return angle < pi/3;
},
reduce: function() {
var i, t1=0, t2=0, step=0.01, segment, pass1=[], pass2=[];
// first pass: split on extrema
var extrema = this.extrema().values;
if(extrema.indexOf(0)===-1) { extrema = [0].concat(extrema); }
if(extrema.indexOf(1)===-1) { extrema.push(1); }
for(t1=extrema[0], i=1; i<extrema.length; i++) {
t2 = extrema[i];
segment = this.split(t1,t2);
segment._t1 = t1;
segment._t2 = t2;
pass1.push(segment);
t1 = t2;
}
// second pass: further reduce these segments to simple segments
pass1.forEach(function(p1) {
t1=0;
t2=0;
while(t2 <= 1) {
for(t2=t1+step; t2<=1+step; t2+=step) {
segment = p1.split(t1,t2);
if(!segment.simple()) {
t2 -= step;
if(abs(t1-t2)<step) {
// we can never form a reduction
return [];
}
segment = p1.split(t1,t2);
segment._t1 = utils.map(t1,0,1,p1._t1,p1._t2);
segment._t2 = utils.map(t2,0,1,p1._t1,p1._t2);
pass2.push(segment);
t1 = t2;
break;
}
}
}
if(t1<1) {
segment = p1.split(t1,1);
segment._t1 = utils.map(t1,0,1,p1._t1,p1._t2);
segment._t2 = p1._t2;
pass2.push(segment);
}
});
return pass2;
},
scale: function(d) {
var order = this.order;
var distanceFn = false
if(typeof d === "function") { distanceFn = d; }
if(distanceFn && order === 2) { return this.raise().scale(distanceFn); }
// TODO: add special handling for degenerate (=linear) curves.
var clockwise = this.clockwise;
var r1 = distanceFn ? distanceFn(0) : d;
var r2 = distanceFn ? distanceFn(1) : d;
var v = [ this.offset(0,10), this.offset(1,10) ];
var o = utils.lli4(v[0], v[0].c, v[1], v[1].c);
if(!o) { throw new Error("cannot scale this curve. Try reducing it first."); }
// move all points by distance 'd' wrt the origin 'o'
var points=this.points, np=[];
// move end points by fixed distance along normal.
[0,1].forEach(function(t) {
var p = np[t*order] = utils.copy(points[t*order]);
p.x += (t?r2:r1) * v[t].n.x;
p.y += (t?r2:r1) * v[t].n.y;
}.bind(this));
if (!distanceFn) {
// move control points to lie on the intersection of the offset
// derivative vector, and the origin-through-control vector
[0,1].forEach(function(t) {
if(this.order===2 && !!t) return;
var p = np[t*order];
var d = this.derivative(t);
var p2 = { x: p.x + d.x, y: p.y + d.y };
np[t+1] = utils.lli4(p, p2, o, points[t+1]);
}.bind(this));
return new Bezier(np);
}
// move control points by "however much necessary to
// ensure the correct tangent to endpoint".
[0,1].forEach(function(t) {
if(this.order===2 && !!t) return;
var p = points[t+1];
var ov = {
x: p.x - o.x,
y: p.y - o.y
};
var rc = distanceFn ? distanceFn((t+1)/order) : d;
if(distanceFn && !clockwise) rc = -rc;
var m = sqrt(ov.x*ov.x + ov.y*ov.y);
ov.x /= m;
ov.y /= m;
np[t+1] = {
x: p.x + rc*ov.x,
y: p.y + rc*ov.y
}
}.bind(this));
return new Bezier(np);
},
outline: function(d1, d2, d3, d4) {
d2 = (typeof d2 === "undefined") ? d1 : d2;
var reduced = this.reduce(),
len = reduced.length,
fcurves = [],
bcurves = [],
p,
alen = 0,
tlen = this.length();
var graduated = (typeof d3 !== "undefined" && typeof d4 !== "undefined");
function linearDistanceFunction(s,e, tlen,alen,slen) {
return function (v) {
var f1 = alen/tlen, f2 = (alen+slen)/tlen, d = e-s;
return utils.map(v, 0,1, s+f1*d, s+f2*d);
};
};
// form curve oulines
reduced.forEach(function(segment) {
slen = segment.length();
if (graduated) {
fcurves.push(segment.scale( linearDistanceFunction( d1, d3, tlen,alen,slen) ));
bcurves.push(segment.scale( linearDistanceFunction(-d2,-d4, tlen,alen,slen) ));
} else {
fcurves.push(segment.scale( d1));
bcurves.push(segment.scale(-d2));
}
alen += slen;
});
// reverse the "return" outline
bcurves = bcurves.map(function(s) {
p = s.points;
if(p[3]) { s.points = [p[3],p[2],p[1],p[0]]; }
else { s.points = [p[2],p[1],p[0]]; }
return s;
}).reverse();
// form the endcaps as lines
var fs = fcurves[0].points[0],
fe = fcurves[len-1].points[fcurves[len-1].points.length-1],
bs = bcurves[len-1].points[bcurves[len-1].points.length-1],
be = bcurves[0].points[0],
ls = utils.makeline(bs,fs),
le = utils.makeline(fe,be),
segments = [ls].concat(fcurves).concat([le]).concat(bcurves),
slen = segments.length;
return new PolyBezier(segments);
},
outlineshapes: function(d1, d2, curveIntersectionThreshold) {
d2 = d2 || d1;
var outline = this.outline(d1,d2).curves;
var shapes = [];
for(var i=1, len=outline.length; i < len/2; i++) {
var shape = utils.makeshape(outline[i], outline[len-i], curveIntersectionThreshold);
shape.startcap.virtual = (i > 1);
shape.endcap.virtual = (i < len/2-1);
shapes.push(shape);
}
return shapes;
},
intersects: function(curve, curveIntersectionThreshold) {
if(!curve) return this.selfintersects(curveIntersectionThreshold);
if(curve.p1 && curve.p2) {
return this.lineIntersects(curve);
}
if(curve instanceof Bezier) { curve = curve.reduce(); }
return this.curveintersects(this.reduce(), curve, curveIntersectionThreshold);
},
lineIntersects: function(line) {
var mx = min(line.p1.x, line.p2.x),
my = min(line.p1.y, line.p2.y),
MX = max(line.p1.x, line.p2.x),
MY = max(line.p1.y, line.p2.y),
self=this;
return utils.roots(this.points, line).filter(function(t) {
var p = self.get(t);
return utils.between(p.x, mx, MX) && utils.between(p.y, my, MY);
});
},
selfintersects: function(curveIntersectionThreshold) {
var reduced = this.reduce();
// "simple" curves cannot intersect with their direct
// neighbour, so for each segment X we check whether
// it intersects [0:x-2][x+2:last].
var i,len=reduced.length-2,results=[],result,left,right;
for(i=0; i<len; i++) {
left = reduced.slice(i,i+1);
right = reduced.slice(i+2);
result = this.curveintersects(left, right, curveIntersectionThreshold);
results = results.concat( result );
}
return results;
},
curveintersects: function(c1, c2, curveIntersectionThreshold) {
var pairs = [];
// step 1: pair off any overlapping segments
c1.forEach(function(l) {
c2.forEach(function(r) {
if(l.overlaps(r)) {
pairs.push({ left: l, right: r });
}
});
});
// step 2: for each pairing, run through the convergence algorithm.
var intersections = [];
pairs.forEach(function(pair) {
var result = utils.pairiteration(pair.left, pair.right, curveIntersectionThreshold);
if(result.length > 0) {
intersections = intersections.concat(result);
}
});
return intersections;
},
arcs: function(errorThreshold) {
errorThreshold = errorThreshold || 0.5;
var circles = [];
return this._iterate(errorThreshold, circles);
},
_error: function(pc, np1, s, e) {
var q = (e - s) / 4,
c1 = this.get(s + q),
c2 = this.get(e - q),
ref = utils.dist(pc, np1),
d1 = utils.dist(pc, c1),
d2 = utils.dist(pc, c2);
return abs(d1-ref) + abs(d2-ref);
},
_iterate: function(errorThreshold, circles) {
var t_s = 0, t_e = 1, safety;
// we do a binary search to find the "good `t` closest to no-longer-good"
do {
safety=0;
// step 1: start with the maximum possible arc
t_e = 1;
// points:
var np1 = this.get(t_s), np2, np3, arc, prev_arc;
// booleans:
var curr_good = false, prev_good = false, done;
// numbers:
var t_m = t_e, prev_e = 1, step = 0;
// step 2: find the best possible arc
do {
prev_good = curr_good;
prev_arc = arc;
t_m = (t_s + t_e)/2;
step++;
np2 = this.get(t_m);
np3 = this.get(t_e);
arc = utils.getccenter(np1, np2, np3);
//also save the t values
arc.interval = {
start: t_s,
end: t_e
};
var error = this._error(arc, np1, t_s, t_e);
curr_good = (error <= errorThreshold);
done = prev_good && !curr_good;
if(!done) prev_e = t_e;
// this arc is fine: we can move 'e' up to see if we can find a wider arc
if(curr_good) {
// if e is already at max, then we're done for this arc.
if (t_e >= 1) {
// make sure we cap at t=1
arc.interval.end = prev_e = 1;
prev_arc = arc;
// if we capped the arc segment to t=1 we also need to make sure that
// the arc's end angle is correct with respect to the bezier end point.
if (t_e > 1) {
var d = {
x: arc.x + arc.r * cos(arc.e),
y: arc.y + arc.r * sin(arc.e)
};
arc.e += utils.angle({x:arc.x, y:arc.y}, d, this.get(1));
}
break;
}
// if not, move it up by half the iteration distance
t_e = t_e + (t_e-t_s)/2;
}
// this is a bad arc: we need to move 'e' down to find a good arc
else {
t_e = t_m;
}
}
while(!done && safety++<100);
if(safety>=100) {
break;
}
// console.log("L835: [F] arc found", t_s, prev_e, prev_arc.x, prev_arc.y, prev_arc.s, prev_arc.e);
prev_arc = (prev_arc ? prev_arc : arc);
circles.push(prev_arc);
t_s = prev_e;
}
while(t_e < 1);
return circles;
}
};
/***************************
* @enty
*/
let enty = function () {}
enty.Bezier = Bezier
enty.utils = utils
enty.PolyBezier = PolyBezier
return enty
}
exports.muonBezierjs = muonBezierjs
}))
/***********
* @muonBoform
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonBoform = global.muonBoform || {})))
}(this, function (exports) {
'use strict'
let muonBoform = function (__mapper = {}) {
let f = __mapper('xs').m('props')
let mstore = __mapper('xs').m('store')
/* *********************
* getStyle - process style attributes
*/
let getStyle = function (boform) {
let style = {}
if (boform !== undefined) {
if (boform.csx === undefined) boform.csx = 0
if (boform.cf !== undefined && boform.csx !== undefined) style['fill'] = f.kolor(boform.cf, boform.csx)
if (boform.cf !== undefined && boform.csx !== undefined) style['stroke'] = f.kolor(boform.cs, boform.csx)
if (boform.co !== undefined) style['fill-opacity'] = boform.co
if (boform.cw !== undefined) style['stroke-width'] = boform.cw
if (boform.cp !== undefined) style['stroke-opacity'] = boform.cp
}
return style
}
/* *********************
* @m.boform.boformer(anigram, json)
*/
let boformer = function (anigram, json) {
if (json !== undefined && json !== null) {
if (json.type === undefined) {
if (2 && 2) console.log('m.boform.boformer:json.type undefined')
} else if (typeof anigram.payload.boform !== 'object') {
if (2 && 2) console.log('m.boform.boformer boform is not an object')
} else if (json.type === 'Feature') { // Feature
let feature = json
let boform = {}, featureStyle = {}
if (feature.properties !== undefined && feature.properties.boform !== undefined) {
boform = feature.properties.boform
} else if (anigram.payload.boform) {
boform = anigram.payload.boform
} else {
if (2 && 2) console.log("(( boform not defined", json, anigram)
}
let jsonStyle = getStyle(boform)
if (feature.properties !== undefined && feature.properties.style !== undefined) {
featureStyle = feature.properties.style
}
if (feature.properties === undefined) feature.properties = {}
feature.properties.style = Object.assign(jsonStyle, featureStyle)
} else if (json.type === 'FeatureCollection') { // FeatureCollection
for (let i = 0; i < json.features.length; i++) {
let feature = json.features[i]
feature = boformer(anigram, feature)
}
} else {
console.log('m.boform.boformer nothing done')
}
}
return json
}
/***********
* @enty
*/
function enty () { return enty }
enty.boformer = boformer
return enty
}
exports.muonBoform = muonBoform
}))
/***********
* @muonClone
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonClone = global.muonClone || {})))
}(this, function (exports) {
'use strict'
let muonClone = function muonClone (__mapper = {}) {
let f = __mapper('xs').m('props')
/***********
* @clone : anigram
*/
let clone = function (v) {
if (v === null) return null // 00 _____ o
else if (typeof (v) === 'number') return v // 02 _____ num
else if (typeof (v) === 'string') return v // 03 _____ str
else if (f.isArray(v) && v.length === 0) return v // 04 _____ []
else if (typeof (v) === 'function') return v // v(t) //01 _____ fn
else if (f.isObject(v) // 06 ___ v :: {}
) {
let r = {}
for (let y of Reflect.ownKeys(v)) {
r[y] = clone(v[y]) // reenter
}
return r
} else if (f.isArray(v) // 09 ____ [[[ ], {}]] // last chance for the array
) {
let ws = v.map(d => clone(d))
return ws
} else {
return v
}
}
/***********
* @enty
*/
let enty = v => clone(v)
return enty
}
exports.muonClone = muonClone
}))
/***************************
* @muonDelaunator
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonDelaunator = global.muonDelaunator || {})))
}(this, function (exports) {
'use strict'
var muonDelaunator = function (__mapper = {}) {
// Copyright (c) 2017, by Philippe Rivière
// Distributed under the terms of the MIT License
// https://bl.ocks.org/fil/7f8cf2557039c4cad69bd8b1872723f1
// ref: https://github.com/mapbox/delaunator
function Delaunator (points, getX, getY) {
if (!getX) getX = defaultGetX
if (!getY) getY = defaultGetY
var minX = Infinity
var minY = Infinity
var maxX = -Infinity
var maxY = -Infinity
var coords = this.coords = []
var ids = this.ids = new Uint32Array(points.length)
for (var i = 0; i < points.length; i++) {
var p = points[i]
var x = getX(p)
var y = getY(p)
ids[i] = i
coords[2 * i] = x
coords[2 * i + 1] = y
if (x < minX) minX = x
if (y < minY) minY = y
if (x > maxX) maxX = x
if (y > maxY) maxY = y
}
var cx = (minX + maxX) / 2
var cy = (minY + maxY) / 2
var minDist = Infinity
var i0, i1, i2
// pick a seed point close to the centroid
for (i = 0; i < points.length; i++) {
var d = dist(cx, cy, coords[2 * i], coords[2 * i + 1])
if (d < minDist) {
i0 = i
minDist = d
}
}
minDist = Infinity
// find the point closest to the seed
for (i = 0; i < points.length; i++) {
if (i === i0) continue
d = dist(coords[2 * i0], coords[2 * i0 + 1], coords[2 * i], coords[2 * i + 1])
if (d < minDist && d > 0) {
i1 = i
minDist = d
}
}
var minRadius = Infinity
// find the third point which forms the smallest circumcircle with the first two
for (i = 0; i < points.length; i++) {
if (i === i0 || i === i1) continue
var r = circumradius(
coords[2 * i0], coords[2 * i0 + 1],
coords[2 * i1], coords[2 * i1 + 1],
coords[2 * i], coords[2 * i + 1])
if (r < minRadius) {
i2 = i
minRadius = r
}
}
if (minRadius === Infinity) {
throw new Error('No Delaunay triangulation exists for this input.')
}
// swap the order of the seed points for counter-clockwise orientation
if (area(coords[2 * i0], coords[2 * i0 + 1],
coords[2 * i1], coords[2 * i1 + 1],
coords[2 * i2], coords[2 * i2 + 1]) < 0) {
var tmp = i1
i1 = i2
i2 = tmp
}
var i0x = coords[2 * i0]
var i0y = coords[2 * i0 + 1]
var i1x = coords[2 * i1]
var i1y = coords[2 * i1 + 1]
var i2x = coords[2 * i2]
var i2y = coords[2 * i2 + 1]
var center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y)
this._cx = center.x
this._cy = center.y
// sort the points by distance from the seed triangle circumcenter
quicksort(ids, coords, 0, ids.length - 1, center.x, center.y)
// initialize a hash table for storing edges of the advancing convex hull
this._hashSize = Math.ceil(Math.sqrt(points.length))
this._hash = []
for (i = 0; i < this._hashSize; i++) this._hash[i] = null
// initialize a circular doubly-linked list that will hold an advancing convex hull
var e = this.hull = insertNode(coords, i0)
this._hashEdge(e)
e.t = 0
e = insertNode(coords, i1, e)
this._hashEdge(e)
e.t = 1
e = insertNode(coords, i2, e)
this._hashEdge(e)
e.t = 2
var maxTriangles = 2 * points.length - 5
var triangles = this.triangles = new Uint32Array(maxTriangles * 3)
triangles[0] = i0
triangles[1] = i1
triangles[2] = i2
this.trianglesLen = 3
var adjacent = this.adjacent = new Int32Array(maxTriangles * 3)
adjacent[0] = -1
adjacent[1] = -1
adjacent[2] = -1
var xp, yp
for (var k = 0; k < ids.length; k++) {
i = ids[k]
x = coords[2 * i]
y = coords[2 * i + 1]
// skip duplicate points
if (x === xp && y === yp) continue
xp = x
yp = y
// skip seed triangle points
if ((x === i0x && y === i0y) ||
(x === i1x && y === i1y) ||
(x === i2x && y === i2y)) continue
// find a visible edge on the convex hull using edge hash
var startKey = this._hashKey(x, y)
var key = startKey
var start
do {
start = this._hash[key]
key = (key + 1) % this._hashSize
} while ((!start || start.removed) && key !== startKey)
e = start
while (area(x, y, e.x, e.y, e.next.x, e.next.y) >= 0) {
e = e.next
if (e === start) {
throw new Error('Something is wrong with the input points.')
}
}
var walkBack = e === start
// add the first triangle from the point
var t = this._addTriangle(i, e)
adjacent[t] = -1
adjacent[t + 1] = -1
this._link(t + 2, e.t)
e.t = t // keep track of boundary triangles on the hull
e = insertNode(coords, i, e)
// recursively flip triangles from the point until they satisfy the Delaunay condition
e.t = this._legalize(t + 2)
// walk forward through the hull, adding more triangles and flipping recursively
var q = e.next
while (area(x, y, q.x, q.y, q.next.x, q.next.y) < 0) {
t = this._addTriangle(i, q)
this._link(t, q.prev.t)
adjacent[t + 1] = -1
this._link(t + 2, q.t)
q.prev.t = this._legalize(t + 2)
this.hull = removeNode(q)
q = q.next
}
if (walkBack) {
// walk backward from the other side, adding more triangles and flipping
q = e.prev
while (area(x, y, q.prev.x, q.prev.y, q.x, q.y) < 0) {
t = this._addTriangle(i, q.prev)
adjacent[t] = -1
this._link(t + 1, q.t)
this._link(t + 2, q.prev.t)
this._legalize(t + 2)
q.prev.t = t
this.hull = removeNode(q)
q = q.prev
}
}
// save the two new edges in the hash table
this._hashEdge(e)
this._hashEdge(e.prev)
}
// trim typed triangle mesh arrays
this.triangles = triangles.subarray(0, this.trianglesLen)
this.adjacent = adjacent.subarray(0, this.trianglesLen)
}
Delaunator.prototype = {
_hashEdge: function (e) {
this._hash[this._hashKey(e.x, e.y)] = e
},
_hashKey: function (x, y) {
var dx = x - this._cx
var dy = y - this._cy
// use pseudo-angle: a measure that monotonically increases
// with real angle, but doesn't require expensive trigonometry
var p = 1 - dx / (Math.abs(dx) + Math.abs(dy))
return Math.floor((2 + (dy < 0 ? -p : p)) * (this._hashSize / 4))
},
_legalize: function (a) {
var triangles = this.triangles
var coords = this.coords
var adjacent = this.adjacent
var b = adjacent[a]
var a0 = a - a % 3
var b0 = b - b % 3
var al = a0 + (a + 1) % 3
var ar = a0 + (a + 2) % 3
var br = b0 + (b + 1) % 3
var bl = b0 + (b + 2) % 3
var p0 = triangles[ar]
var pr = triangles[a]
var pl = triangles[al]
var p1 = triangles[bl]
var illegal = inCircle(
coords[2 * p0], coords[2 * p0 + 1],
coords[2 * pr], coords[2 * pr + 1],
coords[2 * pl], coords[2 * pl + 1],
coords[2 * p1], coords[2 * p1 + 1])
if (illegal) {
triangles[a] = p1
triangles[b] = p0
this._link(a, adjacent[bl])
this._link(b, adjacent[ar])
this._link(ar, bl)
this._legalize(a)
return this._legalize(br)
}
return ar
},
_link: function (a, b) {
this.adjacent[a] = b
if (b !== -1) this.adjacent[b] = a
},
_addTriangle (i, e) {
var t = this.trianglesLen
this.triangles[t] = e.i
this.triangles[t + 1] = i
this.triangles[t + 2] = e.next.i
this.trianglesLen += 3
return t
}
}
function dist (ax, ay, bx, by) {
var dx = ax - bx
var dy = ay - by
return dx * dx + dy * dy
}
function area (px, py, qx, qy, rx, ry) {
return (qy - py) * (rx - qx) - (qx - px) * (ry - qy)
}
function inCircle (ax, ay, bx, by, cx, cy, px, py) {
ax -= px
ay -= py
bx -= px
by -= py
cx -= px
cy -= py
var ap = ax * ax + ay * ay
var bp = bx * bx + by * by
var cp = cx * cx + cy * cy
var det = ax * (by * cp - bp * cy) -
ay * (bx * cp - bp * cx) +
ap * (bx * cy - by * cx)
return det < 0
}
function circumradius (ax, ay, bx, by, cx, cy) {
bx -= ax
by -= ay
cx -= ax
cy -= ay
var bl = bx * bx + by * by
var cl = cx * cx + cy * cy
if (bl === 0 || cl === 0) return Infinity
var d = bx * cy - by * cx
if (d === 0) return Infinity
var x = (cy * bl - by * cl) * 0.5 / d
var y = (bx * cl - cx * bl) * 0.5 / d
return x * x + y * y
}
function circumcenter (ax, ay, bx, by, cx, cy) {
bx -= ax
by -= ay
cx -= ax
cy -= ay
var bl = bx * bx + by * by
var cl = cx * cx + cy * cy
var d = bx * cy - by * cx
var x = (cy * bl - by * cl) * 0.5 / d
var y = (bx * cl - cx * bl) * 0.5 / d
return {
x: ax + x,
y: ay + y
}
}
// create a new node in a doubly linked list
function insertNode (coords, i, prev) {
var node = {
i: i,
x: coords[2 * i],
y: coords[2 * i + 1],
t: 0,
prev: null,
next: null,
removed: false
}
if (!prev) {
node.prev = node
node.next = node
} else {
node.next = prev.next
node.prev = prev
prev.next.prev = node
prev.next = node
}
return node
}
function removeNode (node) {
node.prev.next = node.next
node.next.prev = node.prev
node.removed = true
return node.prev
}
function quicksort (ids, coords, left, right, cx, cy) {
var i, j, temp
if (right - left <= 20) {
for (i = left + 1; i <= right; i++) {
temp = ids[i]
j = i - 1
while (j >= left && compare(coords, ids[j], temp, cx, cy) > 0) ids[j + 1] = ids[j--]
ids[j + 1] = temp
}
} else {
var median = (left + right) >> 1
i = left + 1
j = right
swap(ids, median, i)
if (compare(coords, ids[left], ids[right], cx, cy) > 0) swap(ids, left, right)
if (compare(coords, ids[i], ids[right], cx, cy) > 0) swap(ids, i, right)
if (compare(coords, ids[left], ids[i], cx, cy) > 0) swap(ids, left, i)
temp = ids[i]
while (true) {
do i++; while (compare(coords, ids[i], temp, cx, cy) < 0)
do j--; while (compare(coords, ids[j], temp, cx, cy) > 0)
if (j < i) break
swap(ids, i, j)
}
ids[left + 1] = ids[j]
ids[j] = temp
if (right - i + 1 >= j - left) {
quicksort(ids, coords, i, right, cx, cy)
quicksort(ids, coords, left, j - 1, cx, cy)
} else {
quicksort(ids, coords, left, j - 1, cx, cy)
quicksort(ids, coords, i, right, cx, cy)
}
}
}
function compare (coords, i, j, cx, cy) {
var d1 = dist(coords[2 * i], coords[2 * i + 1], cx, cy)
var d2 = dist(coords[2 * j], coords[2 * j + 1], cx, cy)
return (d1 - d2) || (coords[2 * i] - coords[2 * j]) || (coords[2 * i + 1] - coords[2 * j + 1])
}
function swap (arr, i, j) {
var tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
}
function defaultGetX (p) {
return p[0]
}
function defaultGetY (p) {
return p[1]
}
/******************
* @enty
*/
var enty = function enty () {}
enty.delaunator = function (points, getX, getY) {
return new Delaunator(points, getX, getY)
}
return enty
}
exports.muonDelaunator = muonDelaunator
}))
/***************************
* @muonDelaunay
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonDelaunay = global.muonDelaunay || {})))
}(this, function (exports) {
'use strict'
var muonDelaunay = function (__mapper = {}) {
//
// Copyright (c) 2016, by Loren Petrich
//
// Distributed under the terms of the MIT License
//
// http://lpetrich.org/
//
// Calculates the spherical Delaunay triangulation of a set of points
// These points are entered as an array of arrays of coordinates: 0, 1, 2
// Any extra members are ignored
// FindDelaunayTriangulation(Positions) and
// FindDelaunayTriangulationIndexed(Positions, Indices)
// work from an array of points as specified above,
// the second one working from a set of indices into the array,
// and return an object with these members:
// positions -- vectors on a unit sphere
// indices -- of all the vertices
// triangles -- array of TriangleObject
// edges -- array of EdgeObject
// hull -- array of vertex indices -- the convex hull
// vor_positions -- positions of triangles' circumcircle centers (Voronoi vertices)
// vor_edges -- pair of indices in vor_positions (empty one: [-1,-1])
// vor_polygons -- object indexed by vertex index,
// and containing edges (EdgeObject), triangles (TriangleObject),
// and boundary (vertices in vor_positions)
// Open ones have a -1 at each end.
// Warning: ImproveTriangulation() is mysteriously buggy
// and is effectively disabled for now
function dotprd (x, y) {
var sum = 0.0
for (var ic = 0; ic < 3; ic++) { sum += x[ic] * y[ic] }
return sum
}
function crsprd (x, y) {
var prod = new Array(3)
for (var ic = 0; ic < 3; ic++) {
var ic1 = ic + 1
if (ic1 >= 3) ic1 -= 3
var ic2 = ic + 2
if (ic2 >= 3) ic2 -= 3
prod[ic] = x[ic1] * y[ic2] - x[ic2] * y[ic1]
}
return prod
}
function triple_prd (x, y, z) {
return dotprd(crsprd(x, y), z)
}
// This distance formula has some nice properties:
// distance and not square of distance;
// the square roots give better numerical resolution
// distance of antipode(p) to p' = - (distance of p to p')
// Range: -2 to +2
function ptdist (x, y) {
var dst1 = 0.0
var dst2 = 0.0
for (var ic = 0; ic < 3; ic++) {
var diff1 = y[ic] - x[ic]
dst1 += diff1 * diff1
var diff2 = y[ic] + x[ic]
dst2 += diff2 * diff2
}
return Math.sqrt(dst1) - Math.sqrt(dst2)
}
function Normalize (vec) {
var vecres = new Array(3)
var sum = 0.0, nrmult
for (let ic = 0; ic < 3; ic++) {
var val = vec[ic]
sum += val * val
}
if (sum > 0) { nrmult = 1 / Math.sqrt(sum) } else { nrmult = 0 }
for (let ic = 0; ic < 3; ic++) {
vecres[ic] = nrmult * vec[ic]
}
return vecres
}
// Indexed versions
function dotprd_ix (Positions, ix, iy) {
return dotprd(Positions[ix], Positions[iy])
}
function crsprd_ix (Positions, ix, iy) {
return crsprd(Positions[ix], Positions[iy])
}
function triple_prd_ix (Positions, ix, iy, iz) {
return triple_prd(Positions[ix], Positions[iy], Positions[iz])
}
function ptdist_ix (Positions, ix, iy) {
return ptdist(Positions[ix], Positions[iy])
}
// Returns a zero 3-vector
function zerovec () {
var vec = new Array(3)
for (var ic = 0; ic < 3; ic++) { vec[ic] = 0.0 }
return vec
}
// Implements copying
function vec_copy (x) {
var vec = new Array(3)
for (var ic = 0; ic < 3; ic++) { vec[ic] = x[ic] }
return vec
}
// Implements x += y
function vec_add_to (x, y) {
for (var ic = 0; ic < 3; ic++) { x[ic] += y[ic] }
}
// Implements x *= y
function vec_mult_scalar_to (x, y) {
for (var ic = 0; ic < 3; ic++) { x[ic] *= y }
}
// Implements x - y
function vec_difference (x, y) {
var diff = zerovec()
for (var ic = 0; ic < 3; ic++) { diff[ic] = x[ic] - y[ic] }
return diff
}
// JavaScript's counterpart of "null" / "None":
function IsNull (x) {
return (typeof (x) === 'undefined')
}
function TrianglesEqual (tr1, tr2) {
if (IsNull(tr1)) return false
if (IsNull(tr2)) return false
for (var iv = 0; iv < 3; iv++) {
if (tr1.verts[iv] != tr2.verts[iv]) { return false }
}
return true
}
function EdgesEqual (ed1, ed2) {
if (IsNull(ed1)) return false
if (IsNull(ed2)) return false
for (var iv = 0; iv < 2; iv++) {
if (ed1.verts[iv] != ed2.verts[iv]) { return false }
}
return true
}
function min (x, y) {
return (y < x) ? y : x
}
function max (x, y) {
return (y > x) ? y : x
}
function TriangleObject (Positions, verts) {
this.verts = verts
this.edges = new Array(3)
// Find directions for testing whether a point is inside
this.dirs = new Array(3)
for (var ic = 0; ic < 3; ic++) {
var ic1 = ic + 1
if (ic1 >= 3) ic1 -= 3
var ic2 = ic + 2
if (ic2 >= 3) ic2 -= 3
this.dirs[ic] = crsprd_ix(Positions, verts[ic1], verts[ic2])
}
// Tetrahedral volume factor
this.vol = triple_prd_ix(Positions, verts[0], verts[1], verts[2])
// Adjust to get the signs correct for the point-inside test;
// the vertex opposite the edges' vertices ought to give a dot product of 1
for (var ic = 0; ic < 3; ic++) { vec_mult_scalar_to(this.dirs[ic], 1 / this.vol) }
// Circumcircle test
var ccdir = zerovec()
for (var ic = 0; ic < 3; ic++) { vec_add_to(ccdir, this.dirs[ic]) }
this.ccdir = Normalize(ccdir)
var ccdsq = 0
for (var ic = 0; ic < 3; ic++) { ccdsq += ptdist(this.ccdir, Positions[verts[ic]]) }
ccdsq /= 3
this.ccdsq = ccdsq
}
// For copying in vertex info from another triangle
TriangleObject.prototype.copy_vert_info = function (src) {
this.verts = src.verts
this.dirs = src.dirs
this.vol = src.vol
this.ccdir = src.ccdir
this.ccdsq = src.ccdsq
}
TriangleObject.prototype.IsVertexOrderCorrect = function () {
return this.vol >= 0
}
TriangleObject.prototype.IsPointInside = function (p) {
for (var ic = 0; ic < 3; ic++) { if (dotprd(p, this.dirs[ic]) < 0) return false }
return true
}
TriangleObject.prototype.IsPointInCircumcircle = function (p) {
return (ptdist(this.ccdir, p) < this.ccdsq)
}
TriangleObject.prototype.IsVertex = function (ix) {
for (var ic = 0; ic < 3; ic++) { if (ix == this.verts[ic]) return true }
return false
}
TriangleObject.prototype.VertexIndexIn = function (ix) {
for (var ic = 0; ic < 3; ic++) { if (ix == this.verts[ic]) return ic }
return -1
}
TriangleObject.prototype.EdgeIndexIn = function (ed) {
for (var ic = 0; ic < 3; ic++) { if (EdgesEqual(this.edges[ic], ed)) return ic }
return -1
}
function EdgeObject (verts) {
this.verts = verts
this.polys = new Array(2)
}
EdgeObject.prototype.IsVertex = function (ix) {
for (var ic = 0; ic < 2; ic++) { if (ix == this.verts[ic]) return true }
return false
}
EdgeObject.prototype.VertexIndexIn = function (ix) {
for (var ic = 0; ic < 2; ic++) { if (ix == this.verts[ic]) return ic }
return -1
}
EdgeObject.prototype.PolyIndexIn = function (pl) {
for (var ic = 0; ic < 2; ic++) { if (TrianglesEqual(this.polys[ic], pl)) return ic }
return -1
}
function EdgeCheckObject (Positions, verts) {
this.verts = verts
this.pdst = ptdist_ix(Positions, verts[0], verts[1])
this.direc = Normalize(crsprd_ix(Positions, verts[0], verts[1]))
var midpnt = zerovec()
vec_add_to(midpnt, Positions[verts[0]])
vec_add_to(midpnt, Positions[verts[1]])
this.midpnt = Normalize(midpnt)
}
// Check on the possible intersection with another edge-check object
// return a boolean of whether or not it does
EdgeCheckObject.prototype.intersects = function (Positions, other) {
// Assume that sharing a vertex means non-intersecting
for (var ic = 0; ic < 2; ic++) {
for (var ict = 0; ict < 2; ict++) { if (this.verts[ic] == other.verts[ict]) return false }
}
// Find intersection point; will test it and its antipode
var itsc = Normalize(crsprd(this.direc, other.direc))
// Find dot product with midpoints to test if the intersection
// is in the near hemispheres of the lines' midpoints.
// If it is in both near hemispheres or both far hemispheres, it's OK
// In both far hemispheres: antipode is in both near hemispheres
var near0 = dotprd(itsc, this.midpnt) > 0
var near1 = dotprd(itsc, other.midpnt) > 0
if (near1 != near0) return false
var pd0 = []
for (var ic = 0; ic < 2; ic++) {
var pd = ptdist(itsc, Positions[this.verts[ic]])
pd0.push(pd)
}
var pd1 = []
for (var ic = 0; ic < 2; ic++) {
var pd = ptdist(itsc, Positions[other.verts[ic]])
pd1.push(pd)
}
var mxpd0 = max(pd0[0], pd0[1])
var mxpd1 = max(pd1[0], pd1[1])
if ((mxpd0 <= this.pdst) && (mxpd1 <= other.pdst) && near0) return true
// Handle its antipode; use antipode-related shortcuts
// like reversing the distance value and the hemisphere-presence value
vec_mult_scalar_to(itsc, -1)
near0 = !near0
for (var ic = 0; ic < 2; ic++) {
pd0[ic] = -pd0[ic]
pd1[ic] = -pd1[ic]
}
mxpd0 = max(pd0[0], pd0[1])
mxpd1 = max(pd1[0], pd1[1])
if ((mxpd0 <= this.pdst) && (mxpd1 <= other.pdst) && near0) return true
return false
}
// Adds to an array if it was not already present;
// Must resort to this kludge because JavaScript doesn't have sets
function AddUnique (arr, x) {
for (var i = 0; i < arr.length; i++) { if (x == arr[i]) return }
arr.push(x)
}
// Version for edges, since testing equality of objects
// doesn't work that well in JavaScript
function AddUniqueEdge (arr, ed) {
for (var i = 0; i < arr.length; i++) { if (EdgesEqual(arr[i], ed)) return }
arr.push(ed)
}
// Find the set intersection
function FindShared (arr1, arr2) {
var resarr = []
for (var i1 = 0; i1 < arr1.length; i1++) {
var x1 = arr1[i1]
for (var i2 = 0; i2 < arr2.length; i2++) {
var x2 = arr2[i2]
if (x1 == x2) {
resarr.push(x1)
break
}
}
}
return resarr
}
// Version for edges
function FindSharedEdges (arr1, arr2) {
var resarr = []
for (var i1 = 0; i1 < arr1.length; i1++) {
var x1 = arr1[i1]
for (var i2 = 0; i2 < arr2.length; i2++) {
var x2 = arr2[i2]
if (EdgesEqual(x1, x2)) {
resarr.push(x1)
break
}
}
}
return resarr
}
// Takes all the members of of arr2 out of arr1
// and ignores the arr2 members not present in arr1
function FindSetDifference (arr1, arr2) {
if (arr2.length == 0) return
var diffarr = []
for (var i1 = 0; i1 < arr1.length; i1++) {
var x1 = arr1[i1]
var AddThisOne = true
for (var i2 = 0; i2 < arr2.length; i2++) {
var x2 = arr2[i2]
if (x2 == x1) {
AddThisOne = false
break
}
}
if (AddThisOne) diffarr.push(x1)
}
// Clear the array
arr1.splice(0, arr1.length)
for (var i = 0; i < diffarr.length; i++) { arr1.push(diffarr[i]) }
}
// Version for edges
function FindSetDifferenceEdges (arr1, arr2) {
if (arr2.length == 0) return
var diffarr = []
for (var i1 = 0; i1 < arr1.length; i1++) {
var x1 = arr1[i1]
var AddThisOne = true
for (var i2 = 0; i2 < arr2.length; i2++) {
var x2 = arr2[i2]
if (EdgesEqual(x1, x2)) {
AddThisOne = false
break
}
}
if (AddThisOne) diffarr.push(x1)
}
// Clear the array
arr1.splice(0, arr1.length)
for (var i = 0; i < diffarr.length; i++) { arr1.push(diffarr[i]) }
}
// Is the graph (in the mathematical sense) self-consistent?
function TestConsistency (TriSet) {
// Test self-consistency:
var IsConsistent = true
for (var i = 0; i < TriSet.triangles.length; i++) {
var tri = TriSet.triangles[i]
for (var ic = 0; ic < 3; ic++) {
var edge = tri.edges[ic]
var NumVerts = 0
for (var iv = 0; iv < 3; iv++) {
if (edge.IsVertex(tri.verts[iv])) { NumVerts++ }
}
if (NumVerts != 2) IsConsistent = false
if (edge.PolyIndexIn(tri) < 0) IsConsistent = false
}
}
for (var i = 0; i < TriSet.edges.length; i++) {
var edge = TriSet.edges[i]
var NumOutside = 0
for (var ic = 0; ic < 2; ic++) {
var tri = edge.polys[ic]
if (IsNull(tri)) {
NumOutside++
continue
}
var NumVerts = 0
for (var iv = 0; iv < 2; iv++) {
if (tri.IsVertex(edge.verts[iv])) { NumVerts++ }
}
if (NumVerts != 2) IsConsistent = false
if (tri.EdgeIndexIn(edge) < 0) IsConsistent = false
}
if (NumOutside > 1) IsConsistent = false
}
return IsConsistent
}
// Specified by index ix; returns whether it was possible to do so
function AddPointInside (TriSet, ix) {
var Positions = TriSet.positions
var p = Positions[ix]
var NumTris = TriSet.triangles.length
for (var j = 0; j < NumTris; j++) {
var tri = TriSet.triangles[j]
if (tri.IsPointInside(p)) {
// Create three new triangles and their edges
var eds = tri.edges
var trixs = []
for (var ic = 0; ic < 3; ic++) { trixs.push(eds[ic].PolyIndexIn(tri)) }
var newtris = Array(3)
var neweds = Array(3)
for (var ic = 0; ic < 3; ic++) {
var ic1 = ic + 1
if (ic1 >= 3) ic1 -= 3
newtris[ic] = new TriangleObject(Positions, [tri.verts[ic], tri.verts[ic1], ix])
neweds[ic] = new EdgeObject([tri.verts[ic], ix])
}
// Connect those triangles and edges
for (var ic = 0; ic < 3; ic++) {
var ic1 = ic + 1
if (ic1 >= 3) ic1 -= 3
newtris[ic].edges[0] = neweds[ic1]
newtris[ic].edges[1] = neweds[ic]
neweds[ic].polys[0] = newtris[ic]
neweds[ic1].polys[1] = newtris[ic]
}
// Find which external edges go with which triangles
for (var ic = 0; ic < 3; ic++) {
var ed = eds[ic]
var trix = trixs[ic]
for (var ict = 0; ict < 3; ict++) {
var newtri = newtris[ict]
var numverts = 0
for (var iv = 0; iv < 2; iv++) {
if (newtri.IsVertex(ed.verts[iv])) { numverts++ }
if (numverts == 2) {
ed.polys[trix] = newtri
newtri.edges[2] = ed
break
}
}
}
}
// Insert those triangles and edges into the lists
TriSet.triangles[j] = newtris[0]
for (var ic = 1; ic < 3; ic++) { TriSet.triangles.push(newtris[ic]) }
for (var ic = 0; ic < 3; ic++) { TriSet.edges.push(neweds[ic]) }
// All done; indicate that the point was added
return true
}
}
// The point was inside no triangle, and thus was not added
return false
}
function ImproveTriangulation (TriSet) {
var Positions = TriSet.positions
var quad_verts = new Array(4)
for (var itr = 0; itr < 100; itr++) {
var numflips = 0
for (var i = 0; i < TriSet.edges.length; i++) {
var edge = TriSet.edges[i]
var tris = edge.polys
// Skip over external edges
if (IsNull(tris[0])) continue
if (IsNull(tris[1])) continue
// Find the containing quadrangle's vertices
for (var ic = 0; ic < 3; ic++) {
var ix = tris[0].verts[ic]
if (!edge.IsVertex(ix)) break
}
var ic1 = ic + 1
if (ic1 >= 3) ic1 -= 3
var ic2 = ic + 2
if (ic2 >= 3) ic2 -= 3
quad_verts[0] = ix
quad_verts[1] = tris[0].verts[ic1]
quad_verts[3] = tris[0].verts[ic2]
for (var ic = 0; ic < 3; ic++) {
var ix = tris[1].verts[ic]
if (!edge.IsVertex(ix)) break
}
quad_verts[2] = ix
// Are the non-edge points in the other triangles' circumcircles?
var incc0 = tris[0].IsPointInCircumcircle(Positions[quad_verts[2]])
var incc1 = tris[1].IsPointInCircumcircle(Positions[quad_verts[0]])
if ((!incc0) && (!incc1)) continue
// Are the would-be triangles properly oriented?
var newtri0 = new TriangleObject(Positions, [quad_verts[0], quad_verts[1], quad_verts[2]])
if (!newtri0.IsVertexOrderCorrect()) continue
var newtri1 = new TriangleObject(Positions, [quad_verts[0], quad_verts[2], quad_verts[3]])
if (!newtri1.IsVertexOrderCorrect()) continue
// If so, then flip
numflips++
// Adjust the edge and triangle memberships:
// 0-3 goes from 0 to 1, 1-2 goes from 1 to 0
for (var ic = 0; ic < 3; ic++) {
var ed = tris[0].edges[ic]
if (EdgesEqual(ed, edge)) continue
else if (ed.IsVertex(quad_verts[3])) {
var ed03 = ed
var edix03 = ic
break
}
}
for (var ic = 0; ic < 3; ic++) {
var ed = tris[1].edges[ic]
if (EdgesEqual(ed, edge)) continue
else if (ed.IsVertex(quad_verts[1])) {
var ed12 = ed
var edix12 = ic
break
}
}
var trix0 = ed03.PolyIndexIn(tris[0])
var trix1 = ed12.PolyIndexIn(tris[1])
ed03.polys[trix0] = tris[1]
ed12.polys[trix1] = tris[0]
tris[0].edges[edix03] = ed12
tris[1].edges[edix12] = ed03
// Add the vertices
tris[0].copy_vert_info(newtri0)
tris[1].copy_vert_info(newtri1)
edge.verts = [quad_verts[0], quad_verts[2]]
}
if (numflips == 0) break
}
}
function FindConvexHull (TriSet) {
// var Positions = TriSet.positions;
// Find boundary loop -- use as convex hull
var NextVertex = new Object()
var VtxStart = -1
for (var i = 0; i < TriSet.edges.length; i++) {
var edge = TriSet.edges[i]
// Find a boundary one -- look for the triangle that it contains
if (IsNull(edge.polys[0])) {
if (IsNull(edge.polys[1])) { continue } else { var tri = edge.polys[1] }
} else {
if (IsNull(edge.polys[1])) { var tri = edge.polys[0] } else { continue }
}
// Ensure that the hull is in the same direction as the triangles
var ix0 = edge.verts[0]
var ix1 = edge.verts[1]
var posdiff = tri.VertexIndexIn(ix1) - tri.VertexIndexIn(ix0)
if (posdiff < 0) posdiff += 3
if (posdiff != 1) {
var ixs = ix0
ix0 = ix1
ix1 = ixs
}
NextVertex[ix0] = ix1
VtxStart = ix0
}
if (VtxStart >= 0) {
var ix = VtxStart
var hull = [ix]
while (true) {
var ixnext = NextVertex[ix]
if (ixnext == VtxStart) break
hull.push(ixnext)
ix = ixnext
}
TriSet.hull = hull
}
}
// Finds the dual of the Delaunay triangulation
// Won't bother to do the sort of connectivity
// that was necessary for the Delaunay triangulation
function FindVoronoiDiagram (TriSet) {
// Special cases: 3 or fewer points
if (TriSet.triangles.length == 1) {
// A single triangle
if (TriSet.hull.length == 3) {
var tri = TriSet.triangles[0]
TriSet.vor_positions.push(tri.ccdir)
for (var k = 0; k < 3; k++) {
var kx = k + 1
if (kx >= 3) kx = 0
var ky = k - 1
if (ky < 0) ky = 2
var v1 = TriSet.positions[TriSet.hull[k]]
var v2 = TriSet.positions[TriSet.hull[kx]]
var posdiff = vec_difference(v2, v1)
TriSet.vor_positions.push(Normalize(crsprd(posdiff, tri.ccdir)))
TriSet.vor_edges.push([0, k + 1, 4])
var ix = TriSet.hull[k]
TriSet.vor_polygons[ix] = new Object()
var vor_poly = TriSet.vor_polygons[ix]
var iy = TriSet.hull[ky]
for (var l = 0; l < 3; l++) {
var edge = TriSet.edges[l]
var shrd = FindShared([iy, ix], edge.verts)
if (shrd.length == 2) break
}
vor_poly.edges = [edge]
vor_poly.triangles = [tri]
vor_poly.boundary = [0, ky + 1, 4, k + 1]
}
var ept = vec_copy(tri.ccdir)
vec_mult_scalar_to(ept, -1)
TriSet.vor_positions.push(ept)
}
return
} else if (TriSet.triangles.length == 0) {
// A biangle
if (TriSet.hull.length == 2) {
var v0 = TriSet.positions[TriSet.hull[0]]
var v1 = TriSet.positions[TriSet.hull[1]]
var vt0 = zerovec()
vec_add_to(vt0, v0)
vec_add_to(vt0, v1)
vt0 = Normalize(vt0)
TriSet.vor_positions.push(vt0)
var vt1 = Normalize(crsprd(v0, v1))
TriSet.vor_positions.push(vt1)
var vt2 = vec_copy(vt0)
vec_mult_scalar_to(vt2, -1)
TriSet.vor_positions.push(vt2)
var vt3 = vec_copy(vt1)
vec_mult_scalar_to(vt3, -1)
TriSet.vor_positions.push(vt3)
TriSet.vor_edges.push([0, 1, 2, 3, 0])
edge = TriSet.edges[0]
for (var k = 0; k < 2; k++) {
var ix = TriSet.hull[k]
TriSet.vor_polygons[ix] = new Object()
var vor_poly = TriSet.vor_polygons[ix]
vor_poly.edges = [edge]
vor_poly.triangles = [0]
if (k == 0) { vor_poly.boundary = [0, 1, 2, 3] } else if (k == 1) { vor_poly.boundary = [0, 3, 2, 1] }
}
}
return
}
// Create the array of Voronoi-vertex positions:
// Add indices to the triangle objects for convenience
for (var i = 0; i < TriSet.triangles.length; i++) {
var tri = TriSet.triangles[i]
tri.index = i
TriSet.vor_positions.push(tri.ccdir)
}
// Voronoi edges: a cinch
// Voronoi edges parallel original edges
for (var i = 0; i < TriSet.edges.length; i++) {
var edge = TriSet.edges[i]
if (!IsNull(edge.polys[0]) && !IsNull(edge.polys[1])) {
var vor_edge = [edge.polys[0].index, edge.polys[1].index]
TriSet.vor_edges.push(vor_edge)
}
}
// Voronoi polygons: -1 at ends means an open one
// First, collect the edges and triangles at each vertex
// Put them into vor_polygons, because each one
// is for each original vertex
for (var i = 0; i < TriSet.indices.length; i++) {
var ix = TriSet.indices[i]
TriSet.vor_polygons[ix] = new Object()
var vor_poly = TriSet.vor_polygons[ix]
vor_poly.edges = []
vor_poly.triangles = []
vor_poly.boundary = []
}
for (var i = 0; i < TriSet.edges.length; i++) {
var edge = TriSet.edges[i]
for (var ic = 0; ic < 2; ic++) { TriSet.vor_polygons[edge.verts[ic]].edges.push(edge) }
}
for (var i = 0; i < TriSet.triangles.length; i++) {
var tri = TriSet.triangles[i]
for (var ic = 0; ic < 3; ic++) { TriSet.vor_polygons[tri.verts[ic]].triangles.push(tri) }
}
for (var i = 0; i < TriSet.indices.length; i++) {
var ix = TriSet.indices[i]
var vor_poly = TriSet.vor_polygons[ix]
// First triangle
var init_tri = vor_poly.triangles[0]
var tri = init_tri
vor_poly.boundary.push(tri.index)
// First edge
for (var ic = 0; ic < 3; ic++) {
var edge = tri.edges[ic]
if (edge.IsVertex(ix)) { break }
}
var init_edge = edge
// The next triangle and edge
var IsInside = false
while (true) {
var iv = edge.PolyIndexIn(tri)
tri = edge.polys[1 - iv]
if (IsNull(tri)) break
if (TrianglesEqual(tri, init_tri)) {
IsInside = true
break
}
vor_poly.boundary.push(tri.index)
for (var ic = 0; ic < 3; ic++) {
var next_edge = tri.edges[ic]
if (EdgesEqual(next_edge, edge)) continue
if (next_edge.IsVertex(ix)) {
edge = next_edge
break
}
}
}
if (!IsInside) {
vor_poly.boundary.reverse()
tri = init_tri
// First edge the other way
for (var ic = 0; ic < 3; ic++) {
edge = tri.edges[ic]
if (EdgesEqual(edge, init_edge)) continue
if (edge.IsVertex(ix)) { break }
}
while (true) {
var iv = edge.PolyIndexIn(tri)
tri = edge.polys[1 - iv]
if (IsNull(tri)) break
vor_poly.boundary.push(tri.index)
for (var ic = 0; ic < 3; ic++) {
var next_edge = tri.edges[ic]
if (EdgesEqual(next_edge, edge)) continue
if (next_edge.IsVertex(ix)) {
edge = next_edge
break
}
}
}
}
// Add -1 on ends for open polygon:
if (!IsInside) {
vor_poly.boundary.reverse()
vor_poly.boundary.push(-1)
vor_poly.boundary.reverse()
vor_poly.boundary.push(-1)
}
}
// Handle the area outside of the convex hull
if (TriSet.hull.length >= 3) {
// Set up the initial boundary lines
// The boundary lines contain:
// Index of Voronoi vertex / triangle center / intersection (in VorPos)
// Indices of original vertices on each side of the line
var VorBdLns = new Array()
var Positions = TriSet.positions
var hlen = TriSet.hull.length
for (var ic = 0; ic < hlen; ic++) {
var ix = TriSet.hull[ic]
var icx = ic + 1
if (icx >= hlen) icx = 0
var ixa = TriSet.hull[icx]
var edset1 = TriSet.vor_polygons[ix].edges
var edset2 = TriSet.vor_polygons[ixa].edges
var edsetshr = FindSharedEdges(edset1, edset2)
var edge = edsetshr[0]
var tvrt = edge.polys[0].index
var vt0 = Positions[ix]
var vt1 = Positions[ixa]
var vtdf = vec_difference(vt1, vt0)
// Contains: triangle index (Voronoi vertex),
// vertex index 1 (Voronoi region), position
// vertex index 2 (Voronoi region), position,
// great-circle normal
var VorBdLn = [tvrt, TriSet.vor_positions[tvrt], ix, vt0, ixa, vt1, vtdf]
VorBdLns.push(VorBdLn)
}
// Find intersections
while (VorBdLns.length > 3) {
// Check all combinations of neighbors
var n = VorBdLns.length
var itscpts = new Array()
var ptitscs = new Array()
for (var k = 0; k < n; k++) { ptitscs.push(new Array()) }
for (var k = 0; k < n; k++) {
// Find the intersection point; use the convex hull's direction
var kx = k + 1
if (kx >= n) kx = 0
var itscpt = Normalize(crsprd(VorBdLns[k][6], VorBdLns[kx][6]))
vec_mult_scalar_to(itscpt, -1)
ptitscs[k].push(itscpts.length)
ptitscs[kx].push(itscpts.length)
itscpts.push(itscpt)
}
// Find the intersection points that are the closest to their parent points
for (var k = 0; k < n; k++) {
var ptitsc = ptitscs[k]
if (ptitsc.length >= 2) {
var dists = new Array()
for (var kp = 0; kp < ptitsc.length; kp++) { dists.push(ptdist(itscpts[ptitsc[kp]], VorBdLns[k][1])) }
var dx = 0
var dmin = dists[dx]
for (var dxi = 0; dxi < dists.length; dxi++) {
var dst = dists[dxi]
if (dst < dmin) {
dx = dxi; dmin = dst
}
}
var ptitscrd = ptitsc[dx]
} else if (ptitsc.length == 1) { var ptitscrd = ptitsc[0] } else { var ptitscrd = -1 }
ptitscs[k] = ptitscrd
}
var NewVorBdLns = new Array()
for (var k = 0; k < n; k++) {
// Find all matched intersection points and add them
var kx = k + 1
if (kx >= n) kx = 0
var ky = k - 1
if (ky < 0) ky = n - 1
// 0 is lone, 1 is leading, 2 is trailing
// vorvtidx is the index of the Voronoi vertex
var pstat = 0
var ptitsc = ptitscs[k], ptitsc_next
if (ptitsc != -1) {
var ptitsc_prev = ptitscs[ky]
if (ptitsc == ptitsc_prev) { pstat = 2 } else {
ptitsc_next = ptitscs[kx]
if (ptitsc == ptitsc_next) { pstat = 1 }
}
}
if (pstat == 0) {
// Keep the Voronoi line without merging
NewVorBdLns.push(VorBdLns[k])
} else if (pstat == 1) {
// Merge the Voronoi lines and create a new one
var VorBdLn0 = VorBdLns[k]
var VorBdLn1 = VorBdLns[kx]
var itscpt = itscpts[k]
var tvrt0 = VorBdLn0[0]
var tvrt1 = VorBdLn1[0]
var PointOK = (tvrt1 != tvrt0)
if (PointOK) {
var nitx = TriSet.vor_positions.length
var ix0 = VorBdLn0[2]
var vt0 = VorBdLn0[3]
var ix1 = VorBdLn1[4]
var vt1 = VorBdLn1[5]
var dst_in = undefined
var dst_out = undefined
for (var m = 0; m < n; m++) {
var ptstm = ptdist(VorBdLns[m][3], itscpt)
var mrl = m - k
while (mrl < 0) mrl += n
while (mrl >= n) mrl -= n
if (mrl <= 2) {
if (dst_in == undefined) { dst_in = ptstm } else if (ptstm < dst_in) { dst_in = ptstm }
} else {
if (dst_out == undefined) { dst_out = ptstm } else if (ptstm < dst_out) { dst_out = ptstm }
}
}
PointOK = (dst_in < dst_out)
}
if (PointOK) {
var vtdf = vec_difference(vt1, vt0)
var VorBdLn = [nitx, itscpt, ix0, vt0, ix1, vt1, vtdf]
NewVorBdLns.push(VorBdLn)
TriSet.vor_positions.push(itscpt)
var ixi = VorBdLn0[4]
// Should be equal:
// ixi = VorBdLn2[2];
TriSet.vor_edges.push([tvrt0, nitx])
TriSet.vor_edges.push([tvrt1, nitx])
// Add the point to the center Voronoi region and close it
TriSet.vor_polygons[ixi].boundary.shift()
var vpln = TriSet.vor_polygons[ixi].boundary.length
TriSet.vor_polygons[ixi].boundary[vpln - 1] = nitx
// Add the point to the left Voronoi region
if (TriSet.vor_polygons[ix0].boundary[1] == tvrt0) {
TriSet.vor_polygons[ix0].boundary.unshift(-1)
TriSet.vor_polygons[ix0].boundary[1] = nitx
} else {
vpln = TriSet.vor_polygons[ix0].boundary.length
if (TriSet.vor_polygons[ix0].boundary[vpln - 2] == tvrt0) {
TriSet.vor_polygons[ix0].boundary.push(-1)
vpln = TriSet.vor_polygons[ix0].boundary.length
TriSet.vor_polygons[ix0].boundary[vpln - 2] = nitx
}
}
// Add the point to the right Voronoi region
if (TriSet.vor_polygons[ix1].boundary[1] == tvrt1) {
TriSet.vor_polygons[ix1].boundary.unshift(-1)
TriSet.vor_polygons[ix1].boundary[1] = nitx
} else {
vpln = TriSet.vor_polygons[ix1].boundary.length
if (TriSet.vor_polygons[ix1].boundary[vpln - 2] == tvrt1) {
TriSet.vor_polygons[ix1].boundary.push(-1)
vpln = TriSet.vor_polygons[ix1].boundary.length
TriSet.vor_polygons[ix1].boundary[vpln - 2] = nitx
}
}
} else {
NewVorBdLns.push(VorBdLn0)
NewVorBdLns.push(VorBdLn1)
}
}
/*
else if (pstat == 2)
{
// Do nothing
}
*/
}
if (NewVorBdLns.length == VorBdLns.length) break
VorBdLns = NewVorBdLns
}
// Special cases: only two or three points left
if (VorBdLns.length == 2) {
if (VorBdLns[0][0] != VorBdLns[1][0]) {
var VorLn = []
for (var k = 0; k < 2; k++) {
// Connecting line
var kx = VorBdLns[k][0]
VorLn.push(kx)
// Close the Voronoi region by deleting the end -1's
kx = VorBdLns[k][2]
TriSet.vor_polygons[kx].boundary.shift()
TriSet.vor_polygons[kx].boundary.pop()
}
TriSet.vor_edges.push(VorLn)
}
} else if (VorBdLns.length == 3) {
var ic0 = VorBdLns[0][0]
var ic1 = VorBdLns[1][0]
var ic2 = VorBdLns[2][0]
if (ic0 != ic1 && ic0 != ic2 && ic1 != ic2) {
var nitx = TriSet.vor_positions.length
var v0 = VorBdLns[0][3]
var v1 = VorBdLns[1][3]
var v2 = VorBdLns[2][3]
var itscpt = zerovec()
vec_add_to(itscpt, crsprd(v0, v1))
vec_add_to(itscpt, crsprd(v1, v2))
vec_add_to(itscpt, crsprd(v2, v0))
itscpt = Normalize(itscpt)
vec_mult_scalar_to(itscpt, -1)
TriSet.vor_positions.push(itscpt)
for (var k = 0; k < 3; k++) {
// Connecting line
var VorBdLn = VorBdLns[k]
TriSet.vor_edges.push([VorBdLn[0], nitx])
// Add the point to the Voronoi region and close it
var ix = VorBdLn[2]
TriSet.vor_polygons[ix].boundary.shift()
var vpln = TriSet.vor_polygons[ix].boundary.length
TriSet.vor_polygons[ix].boundary[vpln - 1] = nitx
}
}
}
}
// Adjust the orientations
for (var k = 0; k < TriSet.vor_polygons.length; k++) {
vor_poly = TriSet.vor_polygons[k]
if (vor_poly.boundary.length >= 3 && vor_poly.boundary[0] >= 0) {
tri = new TriangleObject(TriSet.vor_positions, vor_poly.boundary.slice(0, 3))
if (!tri.IsVertexOrderCorrect()) { vor_poly.boundary.reverse() }
}
}
}
function FindDelaunayTriangulationIndexed (Positions, Indices) {
// Create the triangle-set object
var TriSet = new Object()
TriSet.positions = Positions
TriSet.indices = Indices
TriSet.triangles = []
TriSet.edges = []
TriSet.hull = []
TriSet.vor_positions = []
TriSet.vor_edges = []
TriSet.vor_polygons = new Object()
// Create the first triangle, if it is possible to create any
if (Indices.length < 3) {
if (Indices.length == 2) {
TriSet.edges.push(new EdgeObject(Indices))
TriSet.hull = Indices
}
FindVoronoiDiagram(TriSet)
return TriSet
}
var tri = new TriangleObject(Positions, Indices.slice(0, 3))
if (!tri.IsVertexOrderCorrect()) { tri = new TriangleObject(Positions, [Indices[0], Indices[2], Indices[1]]) }
TriSet.triangles.push(tri)
var echs = new Array(3)
for (var ic = 0; ic < 3; ic++) {
var ic1 = ic + 1
if (ic1 >= 3) ic1 -= 3
var ix = Indices[ic]
var ix1 = Indices[ic1]
var vts = [ix, ix1]
var edge = new EdgeObject(vts)
var echeck = new EdgeCheckObject(Positions, vts)
echeck.edge = edge
echs[ic] = echeck
tri.edges[ic] = edge
edge.polys[0] = tri
TriSet.edges.push(edge)
}
// Place those crossing checkers in a boundary object;
// will have to use various kludges since JavaScript doesn't have sets
var BoundaryVerts = Indices.slice(0, 3)
var BoundaryEdges = echs
var Verts = Object
for (var ic = 0; ic < 3; ic++) {
var ic1 = ic + 2
if (ic1 >= 3) ic1 -= 3
var ix = Indices[ic]
Verts[ix] = [echs[ic], echs[ic + 1]]
}
// Add points until it is no longer possible
for (var i = 3; i < Indices.length; i++) {
var ix = Indices[i]
// If possible, add the point inside
if (AddPointInside(TriSet, ix)) continue
// Point was not inside
Verts[ix] = []
var NewEdges = []
var VertsAddedTo = []
var EdgesToDelete = []
// Find all the non-intersecting edges
for (var j = 0; j < BoundaryVerts.length; j++) {
var ix1 = BoundaryVerts[j]
var echk = new EdgeCheckObject(Positions, [ix, ix1])
var DoesIntersect = false
for (var k = 0; k < BoundaryEdges.length; k++) {
var echk1 = BoundaryEdges[k]
DoesIntersect = echk.intersects(Positions, echk1)
if (DoesIntersect) break
}
if (DoesIntersect) continue
var edge = new EdgeObject(echk.verts)
echk.edge = edge
AddUniqueEdge(NewEdges, echk)
AddUniqueEdge(Verts[ix], echk)
AddUnique(VertsAddedTo, ix)
AddUniqueEdge(Verts[ix1], echk)
AddUnique(VertsAddedTo, ix1)
}
// Add the new vertex itself
AddUnique(BoundaryVerts, ix)
// Find all the triangles
for (var j = 0; j < BoundaryEdges.length; j++) {
var echk = BoundaryEdges[j]
var echks = []
for (var iv = 0; iv < 2; iv++) {
var vset = FindSharedEdges(Verts[ix], Verts[echk.verts[iv]])
if (vset.length == 0) continue
echks.push(vset[0])
}
if (echks.length < 2) continue
var empt_indx = -1
for (var iv = 0; iv < 2; iv++) {
if (IsNull(echk.edge.polys[iv])) {
empt_indx = iv
break
}
}
if (empt_indx < 0) continue
var oldtri = echk.edge.polys[1 - empt_indx]
var v0 = echk.verts[0]
var i0 = oldtri.VertexIndexIn(v0)
var v1 = echk.verts[1]
var i1 = oldtri.VertexIndexIn(v1)
var i01 = i1 - i0
if (i01 < 0) i01 += 3
if (i01 == 1) {
// Order in original: other, v0, v1
var NewTriVerts = [ix, v1, v0]
} else if (i01 == 2) {
// Order in original: other, v1, v0
var NewTriVerts = [ix, v0, v1]
}
var tri = new TriangleObject(Positions, NewTriVerts)
if (!tri.IsVertexOrderCorrect()) continue
// Add the new triangle
// Also, add the new edges,
// or remove them from the lists if necessary
TriSet.triangles.push(tri)
echk.edge.polys[empt_indx] = tri
tri.edges[0] = echk.edge
tri.edges[1] = echks[0].edge
tri.edges[2] = echks[1].edge
AddUniqueEdge(EdgesToDelete, echk)
for (var iv = 0; iv < 2; iv++) {
var echki = echks[iv]
if (IsNull(echki.edge.polys[0])) {
echki.edge.polys[0] = tri
TriSet.edges.push(echki.edge)
} else {
echki.edge.polys[1] = tri
AddUniqueEdge(EdgesToDelete, echki)
}
}
}
// Add the new edges and remove the edges and vertices
// that are now in the interior
for (var j = 0; j < NewEdges.length; j++) { AddUniqueEdge(BoundaryEdges, NewEdges[j]) }
FindSetDifferenceEdges(BoundaryEdges, EdgesToDelete)
var BoundaryVertsToRemove = []
for (var j = 0; j < VertsAddedTo.length; j++) {
var ixa = VertsAddedTo[j]
FindSetDifferenceEdges(Verts[ixa], EdgesToDelete)
if (Verts[ixa].length == 0) { BoundaryVertsToRemove.push(ixa) }
}
FindSetDifference(BoundaryVerts, BoundaryVertsToRemove)
}
// Improve it iteratively
ImproveTriangulation(TriSet)
// Find the boundary line of this region
FindConvexHull(TriSet)
// Find the regions around each point:
FindVoronoiDiagram(TriSet)
return TriSet
}
let FindDelaunayTriangulation = function (Positions) {
var Indices = new Array(Positions.length)
for (var i = 0; i < Indices.length; i++) { Indices[i] = i }
return FindDelaunayTriangulationIndexed(Positions, Indices)
}
var enty = function () {}
enty.FindDelaunayTriangulation = FindDelaunayTriangulation
return enty
}
exports.muonDelaunay = muonDelaunay
}))
/***********
* @muonEventDispatcher
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonEventDispatcher = global.muonEventDispatcher || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: ** **
// md: usage:
// md:
// md: ```
// md: let mmatrix4 = __mapper('xs').m('matrix4')
// md: let t = new mmatrix4()
// md: let s = t.set()
// md: let t2 = t.clone()
// md: ```
// md:
// md:
// md: # license
// md: MIT
var muonEventDispatcher = function (__mapper = {}) {
let enty = THREE.EventDispatcher
enty.prototype = THREE.EventDispatcher.prototype
return enty
}
exports.muonEventDispatcher = muonEventDispatcher
}))
/***************************
* @muonFibonat
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonFibonat = global.muonFibonat || {})))
}(this, function (exports) {
'use strict'
// md: md:{filename}
// md: ref: Spreading points on a disc and on a sphere
// md: Marmakoide's Blog
// md: http://blog.marmakoide.org/
// md: ref: Fibonacci sphere quasi-random radome
// md: Philippe Rivière’s Block 955da86d6a935b26d3599ca5e344fb38
// md: https://bl.ocks.org/fil/955da86d6a935b26d3599ca5e344fb38
let muonFibonat = function muonFibonat (__mapper = {}) {
let f = __mapper('xs').m('props'),
mlacer = __mapper('xs').m('lacer'),
mgeom = __mapper('xs').m('geom')
let radians = Math.PI / 180, degrees = 180 / Math.PI,
sin = Math.sin, cos = Math.cos
let cache = {} // payload, string
cache.string = []
/* **************************
* @stream
*/
let stream = function (payload = {}) {
let randomize = payload.randomize || false
let samples = payload.samples || 50
let dotsInSegment = payload.dotsInSegment || 12
let offsetstep = payload.offsetstep || 2
let goldenangle = Math.PI * (3.0 - Math.sqrt(5.0))
let string = []
if (randomize == cache.randomize &&
samples == cache.samples &&
dotsInSegment == cache.dotsInSegment
) {
string = cache.string
} else {
let rnd = (randomize) ? Math.random() * samples : 1.0
const offset = offsetstep / samples
let nodes = d3.range(samples)
.map(i => {
const y = ((i * offset) - 1) + (offset / 2),
r = Math.sqrt(1 - Math.pow(y, 2)),
phi = ((i + rnd) % samples) * goldenangle,
x = Math.cos(phi) * r,
z = Math.sin(phi) * r
return ([x, y, z]) // eg. [-0.63, -0.5, 0.58]
})
.map(mgeom.spherical) // eg. [-0.7853, 0.6154]
.map(mgeom.to_degrees) // eg. [-141.93, 35.80]
let string = []
for (let i = 0; i < nodes.length - 1; i++) { // before last node
let dot0 = nodes[i]
let dot1 = nodes[i + 1]
string.push(dot0) // push beginning of segment
if (dotsInSegment > 1) { // for the interior
let dom = [0, dotsInSegment + 2 ] // domain adds frontier
let rngX = [ dot0[0], dot1[0] ] // range bewteen segment extremes
let rngY = [ dot0[1], dot1[1] ]
let scaleX = d3.scaleLinear().domain(dom).range(rngX)
let scaleY = d3.scaleLinear().domain(dom).range(rngY)
let indots = d3.range(1, dotsInSegment + 1, 1).map(d => [scaleX(d), scaleY(d)])
string = [...string, ...indots]
}
}
string.push(nodes[nodes.length - 1]) // add last node
cache.randomize = randomize
cache.samples = samples
cache.dotsInSegment = dotsInSegment
cache.string = string
}
return string
}
/* **************************
* @catesians
*/
let catesians = function (payload = {}) {
const samples = payload.fibonat.samples,
offsetstep = payload.fibonat.offsetstep,
xprecision = payload.fibonat.xprecision,
yprecision = payload.fibonat.yprecision,
goldenangle = payload.fibonat.goldenangle
let rnd = 1.0
const offset = offsetstep / samples
let dots = d3.range(samples)
.map(i => {
const z = ((i * offset) - 1) + (offset / 2)
const radius = Math.sqrt(1 - Math.pow(z, 2))
const phi = ((i + rnd) % samples) * goldenangle
const x = Math.cos(phi) * radius
const y = Math.sin(phi) * radius
return ([x, y, z]) // no conform, scale: 100
})
let gj = {
type: 'Feature',
geometry: {type: 'LineString', coordinates: dots},
properties: {}
}
return gj
}
/* **************************
* @interlinked
*/
let interlinked = function (payload = {}) {
const samples = payload.fibonat.samples,
offsetstep = payload.fibonat.offsetstep,
xprecision = payload.fibonat.xprecision,
yprecision = payload.fibonat.yprecision,
goldenangle = payload.fibonat.goldenangle
const offset = offsetstep / samples
let dots = []
for (let i = 0; i < samples; i++) {
const z = ((i * offset) - 1) + (offset / 2) // , (i*s/n)-1 + s/2n ... 2
if (z <= 1) {
const radius = Math.sqrt(1 - Math.pow(z, 2))
const phi = ((i + 1) % samples) * goldenangle
const lambda = Math.atan2(z, radius)
dots.push([phi * degrees, lambda * degrees, 1]) // proform, scale: 1
}
}
let lines = []
for (let i = 0; i < dots.length - 2; i++) { // -2
lines.push(
f.interlink(
[
f.arywinclosed(dots[i][0], dots[i + 1][0], xprecision),
f.arywinclosed(dots[i][1], dots[i + 1][1], yprecision)
]
)
)
}
let gj = {
type: 'Feature',
geometry: {type: 'MultiLineString', coordinates: lines},
properties: {}
}
return gj
}
/***************************
* @enty
*/
let enty = function () {}
enty.stream = stream
enty.catesians = catesians
enty.interlinked = interlinked
enty.reset = () => { cache = {}; return enty }
return enty
}
exports.muonFibonat = muonFibonat
}))
/***********
* @muonForces
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonForces = global.muonForces || {})))
}(this, function (exports) {
'use strict'
/***********
* @isolate
*/
let isolate = function (params) { // filter, force, nodes, params, type
let nodes = params.nodes
let force = params.force
let filter = params.filter
if (force !== null) {
let simNodes = nodes.filter(filter) // filter nodes
let dim = params.dim || 3 // params for dim
var initialize = force.initialize
force.initialize = () => initialize.call(force, simNodes, dim)
return force
}
}
var muonForces = function (__mapper = {}) {
let f = __mapper('xs').m('props')
let force = function (params) {
let aniforce, d3force
let p = {
nodes: params.nodes,
filter: params.filter,
force: params.force || undefined
}
if (params.type !== undefined) {
p.type = params.type
p.force = (__mapper('xs').f(p.type))
? __mapper('xs').f(p.type).force(params) // muon d3force
: null
p.params = params
}
if (p.force == null && p.type !== 'noforce') {
console.info(p.type, "force not found")
}
aniforce = isolate(p) // force, params:{nodes, filter, force}
return aniforce
}
/***********
* @enty
*/
let enty = v => force(v)
return enty
}
exports.muonForces = muonForces
}))
/***************************
* @muonFourier
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonFourier = global.muonFourier || {})))
}(this, function (exports) {
'use strict'
// https://raw.githubusercontent.com/andymac-2/fourier-polygon/master/fourier-polygon.js
// https://github.com/andymac-2/fourier-polygon
// (C) 2018 Andrew Pritchard (MIT License)
// https://www.youtube.com/watch?v=2hfoX51f6sg
//md: m.fourier : fourier transform
var muonFourier = function (__mapper) {
let mgeoj = __mapper('xs').m('geoj')
// fourierTransform
var fourierTransformObjectType = {
Feature: function(object) {
return fourierTransformGeometry(object.geometry);
},
FeatureCollection: function(object) {
var features = object.features, i = -1, n = features.length;
let ret = object
ret.features = features.map(feature => fourierTransformGeometry(feature.geometry))
return ret
}
}
var fourierTransformGeometryType = {
Sphere: function() {
// return true;
},
Point: function(object) {
return fourierTransformPoint(object.coordinates)
},
MultiPoint: function(object) {
var coordinates = object.coordinates.map(coords => fourierTransformPoint(coords))
let ret = object
ret.coordinates = coordinates
return ret
},
LineString: function(object) {
let ret = object
ret.coordinates = fourierTransformLine(object.coordinates);
return ret
},
MultiLineString: function(object) {
var coordinates = object.coordinates
let ret = object
ret.coordinates = coordinates.map(line => fourierTransformLine(line))
return ret
},
Polygon: function(object) {
var coordinates = object.coordinates
let ret = object
ret.coordinates = coordinates.map(line => fourierTransformLine(line))
return ret
},
MultiPolygon: function(object) {
var polygons = object.coordinates.map(
polygon => polygon.map(
ring => fourierTransformLine(ring)))
let ret = object
ret.coordinates = polygons
return ret
},
GeometryCollection: function(object) {
var geometries = object.geometries.map(
geometry => fourierTransformGeometry(geometry))
return geometries
}
}
function fourierTransformGeometry(geometry) {
return geometry && fourierTransformGeometryType.hasOwnProperty(geometry.type)
? fourierTransformGeometryType[geometry.type](geometry)
: false;
}
function fourierTransform(object) {
return (object && fourierTransformObjectType.hasOwnProperty(object.type)
? fourierTransformObjectType[object.type]
: fourierTransformGeometry)(object)
}
function fourierTransformPoint(coordinates) {
// return Complex(coordinates[0], coordinates[1])
}
function fourierTransformLine(coordinates) {
let ret = []
let N = coordinates.length // N coefficients
for (let k = 0; k < N; k++) { // k coefficient
let q = Complex (0, 0)
for (let n = 0; n < N; n++) { // each is sum of integrals
let coef = Complex (0, (-2) * Math.PI * k * n / N)
let ck = coef.exp().mul(coordinates[n]) // x[n].e^-i2[pi]kn/N
q = q.add(ck) // sum n component
}
ret.push(q)
}
return ret
}
//md: m.fourier.transformedCoefs : get fourier transform coefficients
//md: transformedCoefs(geojson)
//md: return geojson
let transformedCoefs = function (gj) {
let gjc = mgeoj.complexify(gj)
return fourierTransform(gjc)
}
/***************************
* @enty
*/
let enty = () => {}
enty.transformedCoefs = transformedCoefs
return enty
}
exports.muonFourier = muonFourier
}))
/***********
* @muongeoj
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muongeoj = global.muongeoj || {})))
}(this, function (exports) {
'use strict'
let muongeoj = function muongeoj (__mapper = {}) {
let f = __mapper('xs').m('props')
// md: # md:{filename}
// md: **process geojson streams**
// md: ## references
// md: [Maarten’s Block geo to square tiles](https://bl.ocks.org/maartenzam/ec11de22bc8e5608a98f207f1c09bdb6)
// md: [geojson-normalize](https://github.com/mapbox/geojson-normalize/blob/master/index.js)
// md: ## functions
// md: ## methods
// md: * ### trim
// md: **flatten gj**
// md: ref: https://bl.ocks.org/maartenzam/ec11de22bc8e5608a98f207f1c09bdb6
// md:
// md: * ### tclip
// md:
// md: * ### complexify
// md: turns strings of coordinates into arrays of comples numbers
// md: @gj
// md:
// md: * ### deprop
// md: reomove properties from gj object
// md:
// md: * ### snip
// md: return function to get dots within form range [pa6,pb7]
// md: @form
// md:
// md: * ### largestPoly
// md: return the lagest polity on gj
// md: @gj: MultiPolygon
// md:
// md: * ### lineStringFromStream
// md:
// md: * ### polygonFromStream
// md:
// md: * ### multLineStringFromStreamArray
// md:
// md: * ### featurecollect
// md: transform to FeatureCollection
// md: @gj {gj.FeatureCollection, gj.Feature, gj.GeometryCollection}
// md: called by halo to carry ric, sort as properties
// md:
// md: * ### featurize
// md: transform to array of gj.Features
// md: @gj {gj.FeatureCollection, gj.Feature, gj.GeometryCollection}
// md:
// md: * ### ntime
// md: convert geometry to feature and add interval to properties
// md: @gj
// md: @interval
// md:
// md: * ### zorder
// md: @gj FeatureCollection
// md:
// md: * ### centroid
// md: get ring's centroid
// md: @ring
// md: called by zorder
// md:
// md: * ### getCoords
// md: get array of coordinates from gj (eg. parent anigram)
// md:
// md: * ### getCoordsLength
// md: get number of coordinates in gj
// md:
// md: * ### getCoordsInRange
// md: get first nb coordinates
// md:
// md: * ### isValid
// md: check if gj is valid geojson type
// md: @gj
// md: @type
// md:
// md:
// md: # license
// md: MIT
let types = {
Point: 'geometry',
MultiPoint: 'geometry',
LineString: 'geometry',
MultiLineString: 'geometry',
Polygon: 'geometry',
MultiPolygon: 'geometry',
GeometryCollection: 'geometry',
Feature: 'feature',
FeatureCollection: 'featurecollection'
}
// ...................... complexifyObjectType
var complexifyObjectType = {
Feature: function (object) {
return complexifyGeometry(object.geometry)
},
FeatureCollection: function (object) {
var features = object.features, i = -1, n = features.length
let ret = object
ret.features = features.map(feature => complexifyGeometry(feature.geometry))
return ret
}
}
var complexifyGeometryType = {
Sphere: function () {
// return true;
},
Point: function (object) {
return complexifyPoint(object.coordinates)
},
MultiPoint: function (object) {
var coordinates = object.coordinates.map(coords => complexifyPoint(coords))
let ret = object
ret.coordinates = coordinates
return ret
},
LineString: function (object) {
let ret = object
ret.coordinates = complexifyLine(object.coordinates)
return ret
},
MultiLineString: function (object) {
var coordinates = object.coordinates
let ret = object
ret.coordinates = coordinates.map(line => complexifyLine(line))
return ret
},
Polygon: function (object) {
var coordinates = object.coordinates
let ret = object
ret.coordinates = coordinates.map(line => complexifyLine(line))
return ret
},
MultiPolygon: function (object) {
var polygons = object.coordinates.map(
polygon => polygon.map(
ring => complexifyLine(ring)))
let ret = object
ret.coordinates = polygons
return ret
},
GeometryCollection: function (object) {
var geometries = object.geometries.map(
geometry => complexifyGeometry(geometry))
return geometries
}
}
function complexifyGeometry (geometry) {
return geometry && complexifyGeometryType.hasOwnProperty(geometry.type)
? complexifyGeometryType[geometry.type](geometry)
: false
}
function complexify (object) {
return (object && complexifyObjectType.hasOwnProperty(object.type)
? complexifyObjectType[object.type]
: complexifyGeometry)(object)
}
function complexifyPoint (coordinates) {
return Complex(coordinates[0], coordinates[1])
}
function complexifyLine (coordinates) {
let ret = coordinates.map(coords => complexifyPoint(coords))
return ret
}
// ...................... trim
let trim = function (gj) {
let ret = {}
if (gj.type === 'FeatureCollection') {
ret.type = 'FeatureCollection'
ret.features = []
for (let i = 0; i < gj.features.length; i++) {
let newFeature = {}
let feature = gj.features[i]
newFeature.type = 'Feature'
newFeature.properties = feature.properties
newFeature.geometry = {}
newFeature.geometry.coordinates = []
for (let j = 0; j < feature.geometry.coordinates.length; j++) {
let coords = largestPoly(feature.geometry.coordinates[j])
newFeature.geometry.type = 'Polygon'
newFeature.geometry.coordinates[j] = coords[0]
}
ret.features[i] = Object.assign({}, newFeature)
}
} else if (gj.type === 'MultiLineString') {
ret = gj
} else {
ret = gj
}
return ret
}
// ...................... snip
let snip = function (form) {
let dims = __mapper('xs').m('anitem').dims()
let braids = []
return function (gj) {
let c = gj.coordinates
for (let i = 0; i < c.length; i++) {
let braid = f.unslide(c[i])
for (let j = 0; j < braid.length; j++) {
let pa6 = (form[dims[j]] || {}).pa6
let pb7 = (form[dims[j]] || {}).pb7
braids[j] = f.streamRange(braid[j], pa6, pb7)
}
let coordinates = f.slide(braids) // join dim threads
gj.coordinates = Array.of(coordinates)
}
return gj
}
}
// ...................... largestPoly
let largestPoly = function largestPoly (gj) {
let size = -Number.MAX_VALUE,
poly = null
for (let c = 0; c < gj.length; c++) {
let tsize = (gj.type === 'MultiPolygon') ? d3.polygonArea(gj[c][0]) : d3.polygonArea(gj[c])
if (tsize > size) {
size = tsize
poly = c
}
}
return [gj.type === 'MultiPolygon' ? gj[poly][0] : gj[poly]]
}
let lineStringFromStream = function (coords, reverse = false, props = {}) {
let geo = {}
geo.type = 'LineString'
geo.coordinates = coords
geo.properties = props
return geo
}
let polygonFromStream = function (coords, reverse = false, props = {}) {
if (reverse === true) coords = coords.slice().reverse()
let geo = {}
geo.type = 'Polygon'
geo.coordinates = [coords]
geo.properties = props
return geo
}
let multLineStringFromStreamArray = function (coords, reverse = false, props = {}) {
if (reverse === true) coords = coords.slice().reverse()
let geo = {}
geo.type = 'MultiLineString'
geo.coordinates = coords
geo.properties = props
return geo
}
// ...................... ntime
let ntime = function (gj, interval = [0, 1]) {
let tfeatures = []
if (gj.type == 'Feature') {
let geometry = gj.geometry
if (geometry !== null) coords = [...coords, ...getCoords(geometry)]
} else if (gj.type == 'FeatureCollection') {
for (let feature_num = 0; feature_num < gj.features.length; feature_num++) {
let feature = gj.features[feature_num]
getCoords(feature, coords)
}
} else if (gj.type == 'GeometryCollection') {
for (let geom_num = 0; geom_num < gj.coords.length; geom_num++) {
let geometry = gj.coords[geom_num]
coords.push(geometry)
}
} else if (gj.type === 'Point') {
let geometry = gj
coords = [...coords, geometry.coordinates] // if Point, return array
} else if (gj.type === 'LineString') {
let tfeature = {
type: 'Feature',
geometry: {type: 'LineString', coordinates: gj.coordinates},
properties: {interval: interval}
}
tfeatures.push(tfeature)
} else if (gj.type === 'MultiPoint') {
let geometry = gj
coords.push(geometry)
} else if (gj.type === 'Polygon') {
let rings = gj.coordinates
for (let i = 0; i < rings.length; i++) {
let line = rings[i]
let tfeature = {
type: 'Feature',
geometry: {type: 'LineString', coordinates: line},
properties: {interval: interval}
}
tfeatures.push(tfeature)
}
} else if (gj.type === 'MultiLineString') {
let lines = gj.coordinates
for (let i = 0; i < lines.length; i++) {
let line = lines[i]
let tfeature = {
type: 'Feature',
geometry: {type: 'LineString', coordinates: line},
properties: {interval: interval}
}
tfeatures.push(tfeature)
}
} else if (gj.type === 'MultiPolygon') {
let polygons = gj.coordinates
for (let i = 0; i < polygons.length; i++) {
let polygon = polygons[i]
let tfeature = {
type: 'Feature',
// geometry: {type: 'Polygon',coordinates: polygon},
geometry: {type: 'LineString', coordinates: polygon[0]},
properties: {interval: interval}
}
tfeatures.push(tfeature)
}
} else if (gj.type === 'Sphere') {
let geometry = gj
coords.push(geometry)
} else {
throw new Error('gj type not identified.')
}
return tfeatures
}
// ...................... featurize
let featurize = function (gj) {
let features = []
if (gj && gj.type) {
let type = gj.type
if (type === 'Feature') {
features = Array.of(gj)
} else if (type === 'FeatureCollection') {
features = gj.features
} else if (type === 'GeometryCollection') {
features = gj.map(d => ({
type: 'Feature',
geometry: {
type: d.type,
coordinates: d.coordinates},
properties: {}}))
} else {
features = Array.of({
type: 'Feature',
geometry: {
type: gj.type,
coordinates: gj.coordinates},
properties: {geonode: {}}})
}
} else {
console.log('m.geoj.featurize not supported geojson ', gj)
}
return features
}
// ...................... featurecollect
let featurecollect = gj => ({type: 'FeatureCollection', features: featurize(gj)})
// ...................... deprop
let deprop = function (gj) {
let gj2 = Object.assign({}, gj)
if (gj2 && gj2.properties) {
delete gj2.properties
return gj2
} else {
return gj2
}
}
// ...................... zorder
let zorder = function (gj) {
if (2 && 2 && !isValid(gj)) { console.log('** m.geoj.zorder:gj not valid', gj) }
let features = []
if (gj.type === 'FeatureCollection') features = gj.features
else {
if (2 && 2) console.log('** gj is not FeatureCollection')
return gj
}
let zordered = features
.map(d => {
d.properties = d.properties || {}
if (d.properties.zorder === undefined) { // if zorder undefined
if (d.geometry && d.geometry.coordinates && d.geometry.coordinates.length > 0) {
if (d.geometry.type === 'Polygon' ) {
let outring = d.geometry.coordinates[0] // for out ring
let zorder = centroid(outring)
if (zorder) d.properties.zorder = zorder // try centroid.z
else d.properties.zorder = -Infinity // feature unformed
} else if (d.geometry.type === 'LineString' ) {
let outring = d.geometry.coordinates // string
let zorder = centroid(outring)
if (zorder) d.properties.zorder = zorder // try centroid.z
else d.properties.zorder = -Infinity // feature unformed
}
} else {
d.properties.zorder = -Infinity // feature unformed
}
}
return d
})
.sort((a, b) => a.properties.zorder - b.properties.zorder) // z order
.map((d, i) => { d.properties.nid = i; return d }) // sequential ordinal
gj.features = zordered
return gj
}
// ...................... centroid
let centroid = function (outring) {
let z = 0
let dotsinring = outring.length
for (let k = 0; k < dotsinring; k++) {
let ck = outring[k][2] || 0 // z camera view
z += ck
}
return z / dotsinring
}
// ...................... getCoords
let getCoords = function (gj, coords = []) {
if (gj === undefined) {
} else {
if (gj.type == 'Feature') {
let geometry = gj.geometry
if (geometry !== null) coords = [...coords, ...getCoords(geometry)]
} else if (gj.type == 'FeatureCollection') {
for (let feature_num = 0; feature_num < gj.features.length; feature_num++) {
let feature = gj.features[feature_num]
getCoords(feature, coords)
}
} else if (gj.type == 'GeometryCollection') {
for (let geom_num = 0; geom_num < gj.coords.length; geom_num++) {
let geometry = gj.coords[geom_num]
coords.push(geometry)
}
} else if (gj.type === 'Point') {
let geometry = gj
coords = [...coords, geometry.coordinates] // if Point, return array
} else if (gj.type === 'LineString') {
let line = gj.coordinates
let _coords = line
coords = [...coords, ..._coords]
} else if (gj.type === 'MultiPoint') {
let geometry = gj
coords.push(geometry)
} else if (gj.type === 'Polygon') {
let rings = gj.coordinates
let _coords = rings.reduce((p, q) => [...p, ...q], [])
coords = [...coords, ..._coords]
} else if (gj.type === 'MultiLineString') {
let lines = gj.coordinates
let _coords = lines.reduce((p, q) => [...p, ...q], [])
coords = [...coords, ..._coords]
} else if (gj.type === 'MultiPolygon') {
let geometry = gj
coords.push(geometry)
} else if (gj.type === 'Sphere') {
let geometry = gj
coords.push(geometry)
} else {
throw new Error('gj type not identified.')
}
}
return coords
}
// ...................... getCoordsLength
let getCoordsLength = gj => getCoords(gj).length
// ...................... getCoordsInRange
let getCoordsInRange = function (gj, nb) {
let ngj = {}
if (gj.type === 'Polygon') {
ngj = {type: gj.type, coordinates: [] }
let n = 0
for (let i = 0; i < gj.coordinates.length; i++) { // rings
let ring = gj.coordinates[i]
let ringLength = ring.length
if (n + ringLength < nb) { // if ring in scope
ngj.coordinates.push(ring)
n += ringLength
} else {
let tmpring = ring.slice(0, nb - n)
ngj.coordinates.push(tmpring)
n += (nb - n)
break
}
}
} else if ((gj.type === 'MultiLineString')) {
ngj = { type: gj.type, coordinates: [] }
let n = 0
for (let i = 0; i < gj.coordinates.length; i++) { // rings
let line = gj.coordinates[i]
let ringLength = line.length
if (n + ringLength < nb) { // if line in scope
ngj.coordinates.push(line)
n += ringLength
} else {
let tmpring = line.slice(0, nb - n)
ngj.coordinates.push(tmpring)
n += (nb - n)
break
}
}
} else if ((gj.type === 'MultiPoint')) {
ngj = { type: 'MultiPoint', coordinates: [] }
ngj.coordinates = gj.coordinates.slice(0, nb)
} else if ((gj.type === 'LineString')) {
ngj = { type: gj.type, coordinates: [] }
ngj.coordinates = gj.coordinates.slice(0, nb)
} else if ((gj.type === 'Feature')) {
ngj = { type: gj.type, geometry: {}}
ngj.geometry = getCoordsInRange(gj.geometry, nb)
}
return ngj
}
// ............................. isValid
let isValid = function (gj, type) {
let valid = true
if (gj === undefined) {
valid = false
} else {
if (gj.type == 'Feature') {
if (gj.geometry) {
valid = isValid(gj.geometry)
}
} else if (gj.type == 'FeatureCollection') {
for (let i = 0; i < gj.features.length; i++) {
valid = valid && isValid(gj.features[i])
}
} else if (gj.type == 'GeometryCollection') {
if (gj.geometries !== undefined) {
for (let j = 0; j < gj.geometries.length; j++) {
valid = valid && isValid(gj.geometries[j])
}
}
} else if (gj.type === 'Point') {
let point = gj.coordinates
valid = valid &&
Array.isArray(point) &&
point.reduce((p, q) => p && typeof (q === 'number' || q === undefined), true)
} else if (gj.type === 'LineString') {
let line = gj.coordinates
valid = valid &&
Array.isArray(line) &&
line.reduce((p, q) => p &&
q.reduce((p2, q2) => p2 && typeof (q2 === 'number' || q2 === undefined), true),
true)
} else if (gj.type === 'MultiPoint') {
let points = gj.coordinates
points = valid &&
points.reduce((p, q) => p &&
q.reduce((p2, q2) => p2 && typeof (q2 === 'number' || q2 === undefined), true),
true)
} else if (gj.type === 'Polygon') {
let rings = gj.coordinates
valid = valid &&
rings.reduce((p, q) => p &&
q.reduce((p2, q2) => p2 && // ring
Array.isArray(q2) && q2.reduce((p3, q3) => p3 && // point
typeof (q3 === 'number' || q3 === undefined) // coord
,
true),
true),
true)
} else if (gj.type === 'MultiLineString') {
let lines = gj.coordinates
valid = valid &&
lines.reduce((p, q) => p &&
Array.isArray(q) && q.reduce((p2, q2) => p2 && // line
Array.isArray(q2) && q2.reduce((p3, q3) => p3 && // point
typeof (q3 === 'number' || q3 === undefined), // coord
true),
true),
true)
} else if (gj.type === 'MultiPolygon') {
let polygons = gj.coordinates
valid = valid &&
polygons.reduce((p, q) => p &&
Array.isArray(q) && q.reduce((p2, q2) => p2 && // polygon
Array.isArray(q2) && q2.reduce((p3, q3) => p3 && // ring
Array.isArray(q3) && q3.reduce((p4, q4) => p4 && // point
typeof (q4 === 'number' || q4 === undefined), // coord
true),
true),
true),
true)
} else if (gj.type == 'Sphere') {
valid = true
} else {
valid = false
throw new Error('gj type not identified.', gj)
}
}
return valid
}
// ............................. tclip
let tclip = function (gj, t = 1, interval = [0, 1]) {
let ret = gj
let t0 = interval[0],
t1 = interval[1],
period = t1 - t0,
tInPeriod = (t - t0) / period
if (t < interval[0] || t > interval[1]) {
ret = [] // return empty set
} else if (tInPeriod === 1) { // return geojson
} else if (gj.type && gj.type === 'Point') {
ret = gj // in period
} else if (gj.type && gj.type === 'MultiPoint') {
} else if (gj.type && gj.type === 'LineString') {
} else if (gj.type && gj.type === 'MultiLineString') {
} else if (gj.type && gj.type === 'Polygon') {
let ngj = { type: 'Polygon', coordinates: [] } // return polygon
let rings = gj.coordinates // coords is rings array
let tnb = rings.reduce((p, q) => p += q.length, 0)
let nb = Math.floor(tnb * tInPeriod)
let outrings = []
let n = 0
for (let i = 0; i < rings.length; i++) {
let ring = rings[i]
let ringLength = ring.length
if (n + ringLength < nb) { // if ring in scope
ngj.coordinates.push(ring)
n += ringLength
} else { // complement with part of next ring
let tmpring = ring.slice(0, nb - n)
ngj.coordinates.push(tmpring)
n += (nb - n)
break
}
}
ret = ngj
} else if (gj.type && gj.type === 'MultiPolygon') {
} else if (gj.type && gj.type === 'GeometryCollection') {
} else if (gj.type && gj.type === 'Feature') {
} else if (gj.type && gj.type === 'FeatureCollection') {
}
return ret
}
// ............................. enty
let enty = function () {}
enty.trim = trim
enty.tclip = tclip
enty.complexify = complexify
enty.deprop = deprop
enty.snip = snip
enty.largestPoly = largestPoly
enty.lineStringFromStream = lineStringFromStream
enty.polygonFromStream = polygonFromStream
enty.multLineStringFromStreamArray = multLineStringFromStreamArray
enty.featurecollect = featurecollect
enty.featurize = featurize
enty.ntime = ntime
enty.zorder = zorder
enty.centroid = centroid
enty.getCoords = getCoords
enty.getCoordsLength = getCoordsLength
enty.getCoordsInRange = getCoordsInRange
enty.isValid = isValid
return enty
}
exports.muongeoj = muongeoj
}))
/***********
* @muongeom
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muongeom = global.muongeom || {})))
}(this, function (exports) {
'use strict'
let muongeom = function muongeom (__mapper = {}) {
let pi = Math.PI,
degrees = 180 / pi,
radians = pi / 180
let polar = function (cartesian) {
let lambda = Math.atan2(cartesian[0], cartesian[1])
let radio = Math.sqrt(cartesian[0] * cartesian[0] + cartesian[1] * cartesian[1])
return [ radio, lambda ]
}
let cartesian = function (spherical) {
let lambda = spherical[0] * radians,
phi = spherical[1] * radians,
cosphi = Math.cos(phi)
return [
Math.cos(lambda) * cosphi,
Math.sin(lambda) * cosphi,
Math.sin(phi)
]
}
let spherical = function (cartesian) {
let r = Math.sqrt(cartesian[0] * cartesian[0] + cartesian[1] * cartesian[1]),
lat = Math.atan2(cartesian[2], r),
lng = Math.atan2(cartesian[1], cartesian[0])
let d = Math.sqrt(cartesian[0] * cartesian[0] + cartesian[1] * cartesian[1] + cartesian[2] * cartesian[2])
return [lng / radians, lat / radians, d]
}
let mapline = function (positions, verts) {
return verts
.map(function (v) {
return enty.spherical(positions[v])
})
}
let normalizeangle = function (angd) {
while (angd >= 180) { angd -= 360 }
while (angd < -180) { angd += 360 }
return angd
}
// https://bl.ocks.org/mbostock/ece50c027bdf8cc20003a17d93e4f60e
// Copyright Mike Bostock
// Released under the GNU General Public License, version 3.
// Clips the specified subject polygon to the specified clip polygon;
// requires the clip polygon to be counterclockwise and convex.
// https://en.wikipedia.org/wiki/Sutherland–Hodgman_algorithm
let polygonClip = function (clip, subject) {
let input,
closed = polygonClosed(subject),
i = -1,
n = clip.length - polygonClosed(clip),
j,
m,
a = clip[n - 1],
b,
c,
d
while (++i < n) {
input = subject.slice()
subject.length = 0
b = clip[i]
c = input[(m = input.length - closed) - 1]
j = -1
while (++j < m) {
d = input[j]
if (polygonInside(d, a, b)) {
if (!polygonInside(c, a, b)) {
subject.push(polygonIntersect(c, d, a, b))
}
subject.push(d)
} else if (polygonInside(c, a, b)) {
subject.push(polygonIntersect(c, d, a, b))
}
c = d
}
if (closed) subject.push(subject[0])
a = b
}
return subject
}
function polygonInside (p, a, b) {
return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0])
}
// Intersect two infinite lines cd and ab.
function polygonIntersect (c, d, a, b) {
let x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3,
y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3,
ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21)
return [x1 + ua * x21, y1 + ua * y21]
}
// Returns true if the polygon is closed.
function polygonClosed (coordinates) {
let a = coordinates[0],
b = coordinates[coordinates.length - 1]
return !(a[0] - b[0] || a[1] - b[1])
}
// http://bl.ocks.org/johnburnmurdoch/60a427a44ea68e152da1771b28af9bdc
let pointInCircle = function (p, c, r) {
return Math.pow(Math.pow(p.x - c.x, 2) + Math.pow(p.y - c.y, 2), 0.5) < r
}
let pointInPolygon = function (px, py, vs) {
return d3.polygonContains(vs, [px, py])
}
let polygonInPolygon = function (ps, vs) {
let inside = false
for (let i = 0, n = ps.length; i < n; i++) {
let px = ps[i][0]
let py = ps[i][1]
inside = enty.pointInPolygon(px, py, vs)
}
return inside
}
let polygonInMultiPolygon = function (ps, mvs = []) {
let inside = false
for (let i = 0, n = mvs.length; i < n; i++) {
inside = enty.polygonInPolygon(ps, mvs[i])
if (inside === true) break
}
return inside
}
/**************************
* @enty
*/
let enty = function enty () {}
enty.polygonArea = polygon => d3.polygonArea(polygon)
enty.polygonRadius = polygon => Math.sqrt(Math.abs(d3.polygonArea(polygon))) / Math.PI
enty.polygonHull = points => d3.polygonHull(points)
enty.polygonContains = (polygon, p) => d3.polygonContains(polygon, p)
enty.polygonCentroid = polygon => d3.polygonCentroid(polygon)
enty.polygonLength = polygon => d3.polygonLength(polygon)
enty.minExtent = points => [Math.min(...points.map(d => d[0])), Math.min(...points.map(d => d[1]))]
enty.maxExtent = points => [Math.max(...points.map(d => d[0])), Math.max(...points.map(d => d[1]))]
enty.polygonExtent = points => [enty.minExtent(points), enty.maxExtent(points)]
enty.extentCentroid = extent => [(extent[0][0] + extent[1][0]) / 2, (extent[0][1] + extent[1][1]) / 2]
enty.extentEdges = extent => [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]]
enty.extentPolygon = e => [
[e[0][0], e[0][1]],
[e[0][0], e[1][1]],
[e[1][0], e[1][1]],
[e[1][0], e[0][1]],
[e[0][0], e[0][1]]
]
enty.pointsInPolygon = (points, pol) => points.filter(p => enty.pointInPolygon(p[0], p[1], pol))
enty.cartesian = cartesian
enty.spherical = spherical
enty.mapline = mapline
enty.normalizeangle = normalizeangle
enty.polar = polar
enty.polygonClip = polygonClip
enty.pointInCircle = pointInCircle
enty.pointInPolygon = pointInPolygon
enty.polygonInPolygon = polygonInPolygon
enty.polygonInMultiPolygon = polygonInMultiPolygon
enty.dot = (x1, y1, x2, y2) => x1 * x2 + y1 * y2
enty.distance = (x1, y1, x2, y2) => {
let dx = x1 - x2
let dy = y1 - y2
return Math.sqrt(dx * dx + dy * dy)
}
enty.distance3d = (v1=0, v2=0) => {
let dx = v2[0] - v1[0],
dy = v2[1] - v1[1],
dz = (v2[2] || 0) - (v1[2] || 0)
return dx * dx + dy * dy + dz * dz
}
enty.normalize$2 = (x, y) => {
let l = enty.distance(0, 0, x, y)
if (l > 0.00001) {
return [x / l, y / l]
} else {
return [0, 0]
}
}
enty.norm = (x, y) => enty.distance(0, 0, x, y)
enty.spherical = function (cartesian) {
return [
Math.atan2(cartesian[1], cartesian[0]),
Math.asin(Math.max(-1, Math.min(1, cartesian[2])))
]
}
enty.to_degrees = v => v.map(d => d * degrees)
enty.normalize = function (a) {
let d = Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2])
return a.map(e => e / d)
}
enty.cartesian = function (spherical) {
let radians = Math.PI / 180
let lambda = spherical[0] * radians,
phi = spherical[1] * radians,
cosphi = Math.cos(phi)
return [
Math.cos(lambda) * cosphi,
Math.sin(lambda) * cosphi,
Math.sin(phi)
]
}
enty.add = function (v0, v1) {
let added = []
let dims = Math.max(v0.length, v1.length)
for (let i = 0; i < dims; i++) {
added[i] = (v0[i] || 0) + (v1[i] || 0)
}
return added
}
enty.zerovector = function (v) {
let zerovector = []
let dims = v.length
for (let i = 0; i < dims; i++) {
zerovector[i] = 0
}
return zerovector
}
enty.degrees = () => 180 / Math.PI
enty.radians = () => Math.PI / 180
enty.to_radians = v => Array.isArray(v) ? v.map(d => d * Math.PI / 180)
: typeof (v) === 'number' ? v * Math.PI / 180
: null
enty.to_degrees = v => Array.isArray(v) ? v.map(d => d * 180 / Math.PI)
: typeof (v) === 'number' ? v * 180 / Math.PI : null
enty.coefsF0 = () => [
1.44224957030741,
0.240374928384568,
0.0686785509670194,
0.0178055502507087,
0.00228276285265497,
-1.48379585422573e-3,
-1.64287728109203e-3,
-1.02583417082273e-3,
-4.83607537673571e-4,
-1.67030822094781e-4,
-2.45024395166263e-5,
2.14092375450951e-5,
2.55897270486771e-5,
1.73086854400834e-5,
8.72756299984649e-6,
3.18304486798473e-6,
4.79323894565283e-7 -
4.58968389565456e-7,
-5.62970586787826e-7,
-3.92135372833465e-7
]
enty.coefsG0 = () => [
1.15470053837925,
0.192450089729875,
0.0481125224324687,
0.010309826235529,
3.34114739114366e-4,
-1.50351632601465e-3,
-1.23044177962310e-3,
-6.75190201960282e-4,
-2.84084537293856e-4,
-8.21205120500051e-5,
-1.59257630018706e-6,
1.91691805888369e-5,
1.73095888028726e-5,
1.03865580818367e-5,
4.70614523937179e-6,
1.4413500104181e-6,
1.92757960170179e-8,
-3.82869799649063e-7,
-3.57526015225576e-7,
-2.2175964844211e-7
]
return enty
}
exports.muongeom = muongeom
}))
/**********************
* @muonGeonode
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonGeonode = global.muonGeonode || {})))
}(this, function (exports) {
'use strict'
let muonGeonode = function muonGeonode (__mapper = {}) {
let props = __mapper('xs').m('props')
/***************************
* @getAnigramRic
*/
let init = function (node={}) {
let geonode = {
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [0, 0, 0]
},
properties: {
orgen: [0, 0, 0],
velin: [0, 0, 0],
velang: [0, 0, 0],
prevous: [0, 0, 0],
geodelta: [0, 0, 0]
}
}
let _geonode = Object.assign({}, geonode, node)
return _geonode
}
/**********************
* @enty
*/
let enty = function () {}
enty.init = init // build geonode
return enty
}
exports.muonGeonode = muonGeonode
}))
/***********
* @muonGraticule
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonGraticule = global.muonGraticule || {})))
}(this, function (exports) {
'use strict'
//md: # md:{filename}
//md: **process graticule objects**
//md: ## references
//md: [D3.js](https://github.com/d3) by [Mike Bostock](https://en.wikipedia.org/wiki/Mike_Bostock)
//md: [d3-geo/graticule.js](http://ci.testling.com/substack/minimist)
//md: ## functions
//md: *tidx
//md: return `function(column, row)` that gives the sequential index of [column,row]
//md: ``` js
//md: tidx (horq, verq, hd = 1, vd = 1)
//md: ```
//md: * `@argv.horq` number of rows
//md: * `@argv.verq` number of columns
//md: * `@argv.hd` span between columns
//md: * `@argv.vd` span between rows
//md:
//md: *ridx
//md: return `function(idx)` , give [row,column] of sequential index
//md: *oneface
//md: a,b,c coord-vertices in [xn, yn] space give face verts indices
//md: *bifaces
//md: (i,h) in [xn,yn[]
//md: vertices to ...
//md: inPolygons to filter coords if in pols
//md: mersCoords to get vert coords
//md: *gratiparams
//md: use:
//md: ```
//md: let {X0, X1, DX, PX, x0, x1, dx, px,
//md: Y0, Y1, DY, PY, y0, y1, dy, py} = gratiparams(params)
//md: ```
//md: lattice.[ Xx, Yy ]
//md: lattice specifies x and y discrete with same major and minor
//md: frame.[ [X,Y], [x,y] ] X:[X0,X1,DX,PX]
//md: frame defineds x and y major and minor discretes
//md: frame.[ [ Xx, Yy ] ] Xx:[X0,X1,DX,PX]
//md: [ Xx, Yy ]
//md: if type not specified assume lattice
//md:
//md: *arywinopen
//md: call `arywinopen(x0,x1,dx)`
//md: return array of elements in [x0,x1] with pass dx
//md:
//md: *arywinclose
//md: as arywinopen closing the array
//md:
//md: *symgraticuleY
//md: return function of dot to arywinclose array
//md:
//md: *symgraticuleX
//md: return function of dot to arywinclose array
//md: open range interval [x0,x1)
//md:
//md: *asymgraticuleY
//md: return function of dot to arywinclose array
//md:
//md: *asymgraticuleX
//md: return function of dot to arywinclose array
//md: open range interval [x0,x1)
//md:
//md: ## methods
//md: *grarr
//md: return `{mms, pps}` of meridians and parallels
//md: on symetrical discretes with symgraticuleX and symgraticuleY
//md: mms and pps are gj.MultiLineString geometries
//md:
//md: *equator
//md: return Feature.LineString coordinates: equator
//md: equator: [ [ [-180, 180, 360, 1], [-90, 90, 360, 1] ] ]
//md:
//md: *vhMultiLine
//md: return Feature.MultiLineString.coordinates: [...mersCoords,...parsCoords]
//md:
//md: *vMultiLine
//md: return Feature.MultiLineString.coordinates: mersCoords
//md:
//md: *hMultiLine
//md: return Feature.MultiLineString.coordinates: parsCoords
//md:
//md: *dedges
//md:
//md:
//md: *gvertices
//md: call `gvertices(params)`
//md: get mersq sym mers and parsq sym pars from grarr
//md: takes vertices from meridians with step being the y precision (dy/py)
//md: mers[i].length may be 5, while parsq: 3
//md:
//md: *gfaces
//md:
//md:
//md: *equator
//md:
//md:
//md: # license
//md: MIT
let muonGraticule = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
mgeoj = __mapper('xs').m('geoj')
const 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, eps = 1e-5
let defaultMajor = [ [-180, 180, 90, 2.5], [-90, 90, 360, 2.5] ]
let defaultMinor = [ [-180, 180, 10, 2.5], [-80, 80, 10, 2.5] ]
let state = {}
// .................. tidx
let tidx = function (horq, verq, hd = 1, vd = 1) {
return function (col, row) { // ridx([3,5]) => 17
let ret = (row * hd) * (horq * vd) + col
return ret
}
}
// .................. ridx
let ridx = function (horq, verq, hd = 1, vd = 1) { // ridx(6,4,1,1)
return function (idx) { // ridx(3) => [0,2], ridx(17) => [3,5]
let ret = [Math.floor(((idx / hd) / vd) / horq), idx % horq]
return ret
}
}
// .................. oneface
let oneface = function (a, b, c, xn, yn) { // xy,ru,ry
let index = tidx(xn, yn)
return [ index(a[0], a[1]), index(b[0], b[1]), index(c[0], c[1]) ]
}
// .................. bifaces
let bifaces = function bifaces (i, j, xn, yn) {
let index = tidx(xn, yn)
let i0 = i
let i1 = (i + 1) % xn
let j0 = j
let j1 = (j + 1)
let f1 = oneface([i0, j0], [i1, j0], [i1, j1], xn, yn)
let f2 = oneface([i0, j0], [i1, j1], [i0, j1], xn, yn)
return [f1, f2]
}
// .................. gratiparams
let gratiparams = function (params = {}, rp = {}) {
let X0, X1, DX, PX, x0, x1, dx, px,
Y0, Y1, DY, PY, y0, y1, dy, py
let X_extent, Y_extent, x_extent, y_extent
if (params.lattice !== undefined) { // lattice
// lattice: [x_extent, y_extent]
// eg. [ [180, 55], [90, 2.5] ]
let lattice = params.lattice
x_extent = lattice[0] // x major::minor
y_extent = lattice[1] // y major::minor
if (Array.isArray(x_extent[0])) { // eg. [ [ [-40,180], 55], [] ]
X1 = x_extent[0][1] // x_extentMajor eg. 180
X0 = x_extent[0][0]
} else { // eg. [ [ 180, 55], [] ]
X1 = x_extent[0] // x_extentMajor eg. 180
X0 = -X1
}
x1 = X1 // x_extentMinor eg. 180
x0 = -x1
DX = x_extent[1] // x_stepMajor eg. 90
dx = DX // x_stepMinor eg. 10
PX = DX // x_precision eg. 2.5
px = PX
if (Array.isArray(y_extent[0])) {
Y1 = y_extent[0][1] // x_extentMajor eg. 180
Y0 = y_extent[0][0]
} else {
Y1 = y_extent[0] // x_extentMajor eg. 180
Y0 = -Y1
}
y1 = Y1 // y_extentMinor eg. 80
y0 = -y1
DY = y_extent[1] // y_stepMajor eg. 360
dy = DY // y_stepMinor eg. 10
PY = DY // y_precision eg. 2.5
py = PY
rp = {X0,X1,DX,PX,x0,x1,dx,px,Y0,Y1,DY,PY,y0,y1,dy,py}
} else if (params.frame !== undefined) { // frame
// frame: [ [X_extent, Y_extent] , [x_extent, y_extent] ]
let graticule = params.frame // major, minor
if (graticule.length === 2) {
// eg. [ [ [-180, 180, 45, 45], [-90, 90, 22.5, 22.5] ],
// [ [-180, 180, 45, 45], [-90, 90, 22.5, 22.5] ] ]
X_extent = graticule[0][0]
Y_extent = graticule[0][1]
x_extent = graticule[1][0]
y_extent = graticule[1][1]
} else if (graticule.length === 1) { // major, minor coincide
// eg. [ [ [-180, 180, 45, 45], [-90, 90, 22.5, 22.5] ]
X_extent = graticule[0][0]
Y_extent = graticule[0][1]
x_extent = graticule[0][0]
y_extent = graticule[0][1]
}
X0 = X_extent[0]
X1 = X_extent[1]
DX = X_extent[2]
PX = X_extent[3]
x0 = x_extent[0]
x1 = x_extent[1]
dx = x_extent[2]
px = x_extent[3]
Y0 = Y_extent[0]
Y1 = Y_extent[1]
DY = Y_extent[2]
PY = Y_extent[3]
y0 = y_extent[0]
y1 = y_extent[1]
dy = y_extent[2]
py = y_extent[3]
rp = {X0,X1,DX,PX,x0,x1,dx,px,Y0,Y1,DY,PY,y0,y1,dy,py}
} else if (Array.isArray(params)) { // default to frame
let p = {frame: params} // eg. [ [-180, 180, 45, 45], [-90, 90, 22.5, 22.5] ]
rp = gratiparams(p)
}
return rp
}
// .................. arywinopen
let arywinopen = (x0,x1,dx) => {
let epsilon = 1e-5
let xx = []
let mx = Math.max(Math.abs(x0),Math.abs(x1)) - epsilon
let mt = Math.ceil(mx / dx)
for (let i=-mt; i<mt; i++) {if (x0 < i * dx && i * dx < x1) {xx.push(i * dx)}}
return xx
}
// .................. arywinclosed
let arywinclosed = (x0,x1,dx) => [x0, ...arywinopen(x0,x1,dx), x1]
// .................. symgraticuleX
function symgraticuleX (y0, y1, dy) {
let y = arywinclosed(y0, y1, dy) // sym win
return _ => y.map(y => [_, y])
}
// .................. symgraticuleY
function symgraticuleY (x0, x1, dx) {
let x = arywinclosed(x0, x1, dx) // sym win
return _ => x.map(x => [x, _])
}
// .................. asymgraticuleX
function asymgraticuleX (y0, y1, dy) {
let y = d3.range(y0, y1 - eps, dy).concat(y1) // [y0,y1) ,y1]
return _ => y.map(y => [_, y])
}
// .................. asymgraticuleY
function asymgraticuleY (x0, x1, dx) {
let x = d3.range(x0, x1 - eps, dx).concat(x1) // [x0,x1) ,x1]
return _ => x.map(x => [x, _])
}
// .................. grarr
let grarr = function (params = {}) {
let {X0, X1, DX, PX, x0, x1, dx, px,
Y0, Y1, DY, PY, y0, y1, dy, py} = gratiparams(params)
// get circles from point ni sphere and step
let X = symgraticuleX(Y0, Y1, PY), // get X(Y) by PY
Y = symgraticuleY(X0, X1, PX), // get Y(X) by PX
x = symgraticuleX(y0, y1, py), // get x(y) by py
y = symgraticuleY(x0, x1, px) // get y(x) by px
// include first meridian
let bigmer = (params.bigmer !== undefined) ? params.bigmer : 1
// function to generate meridians
let merfn = (params.merfn !== undefined) ?
params.merfn :
(a, b, d) => d3.range(Math.ceil(a / d) * d, b, d)
let mmBig = merfn(X0, X1, DX) // long mers
let mmShort = merfn(x0, x1, dx) // short mers
let mmAll = _merge(mmBig, mmShort) // deg location of mers in [-180,180] xy
let mmLines = mmAll.map(d => (Math.abs(d % DX) > eps) ? x(d) : X(d))
// meridians
let mms = { type: 'MultiLineString', coordinates: mmLines }
if (!mgeoj.isValid(mms)) { console.error("mms not valid") }
// include equator
let bigpar = (params.bigpar !== undefined) ? params.bigpar : 1
// function to generate parallels
let parfn = (params.parfn !== undefined) ?
params.parfn :
(a, b, d) => d3.range(Math.ceil(a / d) * d, b, d)
let ppBig = parfn(Y0, Y1, DY)
let ppShort = parfn(y0, y1 + eps, dy)
let ppAll = _merge(ppBig, ppShort) // deg location of pars in [-90,90] z
let ppLines = ppAll.map(d => (Math.abs(d % DY) > eps) ? y(d) : Y(d)) // d:120
// parallels
let pps = { type: 'MultiLineString', coordinates: ppLines }
if (!mgeoj.isValid(pps)) { console.error("pps not valid") }
let ret = {mms, pps}
return ret
}
// .................. equator
let equator = function (params) {
let p = params || [ [ [-180, 180, 360, 1], [-90, 90, 360, 1] ] ] // [xMm, yMm]
let g = grarr(p)
let coords = g.pps.coordinates[0] // first and only ring
let gj = {
type: 'Feature',
geometry: {type: 'LineString',coordinates: coords,},
properties: {mgraticule:'equator'}
}
if (!mgeoj.isValid(gj)) console.error("gj not valid")
return gj
}
// .................. vhMultiLine
let vhMultiLine = function (params = {}) {
let g = grarr(params)
let mersCoords = g.mms.coordinates
let parsCoords = g.pps.coordinates
let coords = [].concat(mersCoords).concat(parsCoords)
let gj = {
type: 'Feature',
geometry: {type: 'MultiLineString',coordinates: coords,},
properties: {mgraticule:'vhMultiLine'}
}
if (!mgeoj.isValid(gj)) console.error("gj not valid")
return gj
}
// .................. vMultiLine
let vMultiLine = function (params = {}) {
let g = grarr(params)
let mersCoords = g.mms.coordinates
let parsCoords = g.pps.coordinates
let coords = [].concat(mersCoords)
let gj = {
type: 'Feature',
geometry: {type: 'MultiLineString',coordinates: coords,},
properties: {mgraticule:'vhMultiLine'}
}
if (!mgeoj.isValid(gj)) console.error("gj not valid")
return gj
}
// .................. hMultiLine
let hMultiLine = function (params = {}) {
let g = grarr(params)
let mersCoords = g.mms.coordinates
let parsCoords = g.pps.coordinates
let coords = [].concat(parsCoords)
let gj = {
type: 'Feature',
geometry: {type: 'MultiLineString',coordinates: coords,},
properties: {mgraticule:'vhMultiLine'}
}
if (!mgeoj.isValid(gj)) console.error("gj not valid")
return gj
}
// .................. dedges
let dedges = function (params) {
let g = grarr(params)
let mersCoords = g.mms.coordinates
let parsCoords = g.pps.coordinates
let mersq = mersCoords.length // 12 x 7
let parsq = parsCoords.length // 7 x 13
let index = tidx(mersq, parsq) // 12, 7
let m0 = 0 // 0
let mn = mersq // 12
let p0 = 0 // 0
let pn = parsq // 6
let lines = []
let line = []
for (let i = m0; i < mn; i++) { // meridians 0 - 11
for (let j = p0; j < pn - 1; j++) { // exclude upper segement
let i0 = i
let i1 = (i + 1) % mersq // mer 12 is mer 0
let j0 = j
let j1 = (j + 1) // % (parsq) // parabolic
let coord = [ index(i0, j0), index(i1, j1) ]
line.push(coord)
}
lines.push(line)
}
let gj = {
type: 'Feature',
geometry: {type: 'MultiLineString',coordinates: lines,},
properties: {mgraticule:'vhMultiLine'}
}
if (!mgeoj.isValid(gj)) console.error("gj not valid")
return gj
}
// .................. gvertices
let gvertices = function (params = {}) {
let g = grarr(params)
let mersCoords = g.mms.coordinates // with y delta, precision
let parsCoords = g.pps.coordinates // with x delta, precision
let {X0, X1, DX, PX, x0, x1, dx, px,
Y0, Y1, DY, PY, y0, y1, dy, py} = gratiparams(params)
let ry = dy / py // step to precision ratio in meridiam
let mersq = mersCoords.length // [-90, 90] [dy,py]
let parsq = parsCoords.length // [-180, 180] [dx,px]
let index = tidx(mersq, parsq) // 12, 7
if (1 && 1) console.log('mersq, parsq', mersq, parsq)
if (1 && 1) console.log('mersCoords', mersCoords[0])
let m0 = 0
let mn = mersq // eg. 4 mers with 5 coords each
let p0 = 0
let pn = parsq // eg. 3
let vertices = []
for (let i = m0; i < mn; i++) { // meridians
// for (let j = p0; j < pn; j++) { // parallels exclude upper lat
for (let j = p0; j < mersCoords[i].length-1; j++) { // parallels exclude upper lat
let i0 = i // mer index
let i1 = (i + 1) % mersq // return to origin
let j0 = j // par index
let j1 = (j + 1) //
let j0p = Math.round(j0 * ry) // revert precision to step
let j1p = Math.round(j1 * ry)
let verts = []
verts[0] = vertices[index(i0, j0)] = mersCoords[i0][j0p] // [0,0] [0,0]
verts[1] = vertices[index(i0, j1)] = mersCoords[i0][j1p] // [0,1] [0,1]
verts[2] = vertices[index(i1, j0)] = mersCoords[i1][j0p] // [1,0] [1,0]
verts[3] = vertices[index(i1, j1)] = mersCoords[i1][j1p] // [1,1] [1,1]
// if (1 && 1) console.log('>>>')
// if (1 && 1) console.log('mers',i,j, i0,j0p, i1,j1p)
// if (1 && 1) console.log('verts', ...verts)
}
}
return { // return vertices
type: 'Feature',
geometry: {type: 'LineString',coordinates: vertices},
properties: {}
}
}
// .................. gfaces
let gfaces = function (params, range = null, tile = null, inPolygons = []) {
let g = grarr(params)
let mersCoords = g.mms.coordinates
let parsCoords = g.pps.coordinates
let mersq = mersCoords.length // 12 x 7
let parsq = parsCoords.length // 7 x 13
let index = tidx(mersq, parsq) // 12, 7
let m0 = 0 // 0
let mn = mersq // 12
let p0 = 0 // 0
let pn = parsq // 6
let faces = []
for (let i = m0; i < mn; i++) { // meridians 0 - 11
// for (let j = p0; j < pn - 1; j++) { // exclude upper segement
for (let j = p0; j < mersCoords[i].length-1; j++) { // exclude upper segement
let i0 = i
let i1 = (i + 1) % mersq // mer 12 is mer 0
let j0 = j
let j1 = (j + 1) // % (parsq) // parabolic
let fs = bifaces(i, j, mersq, parsq, mersCoords, inPolygons)
fs.forEach(f => faces.push(f))
}
}
return faces
}
// .................. _merge
let _merge = function (major, minor, ret = {}) {
ret = [...major, ...minor]
.sort((a, b) => a - b)
.filter((elem, pos, arr) => arr.indexOf(elem) == pos)
return ret
}
// .................. enty
let enty = function (p={}) {
state.graticule = gratiparams(p)
return enty
}
enty.grarr = grarr
enty.vhMultiLine = vhMultiLine
enty.vMultiLine = vMultiLine
enty.hMultiLine = hMultiLine
enty.dedges = dedges
enty.gfaces = gfaces
enty.gvertices = gvertices
enty.equator = equator
return enty
}
exports.muonGraticule = muonGraticule
}))
/***********
* @muonImage
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonImage = global.muonImage || {})))
}(this, function (exports) {
'use strict'
let muonImage = function (__mapper) {
let enty = function (src) {
let name = src || 'space.jpg'
if (__mapper('renderSvg')) {
let imgs = __mapper('renderSvg').svg()
.select('svg').selectAll('image').data([0])
imgs.enter()
.insert('svg:image')
.attr('xlink:href', './' + name)
.attr('x', '0')
.attr('y', '0')
.attr('width', '600')
.attr('height', '400')
.style('position', 'absolute; top:0px; left:0px; z-index:1')
.attr('overflow', 'visible') // _e_
} else {
// "no renderSvg"
}
}
return enty
}
exports.muonImage = muonImage
}))
// https://github.com/Fil/d3-inertia Version 0.0.5. Copyright 2017 Philippe Riviere.
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-drag'), require('d3-selection'), require('d3-timer'))
: typeof define === 'function' && define.amd ? define(['exports', 'd3-drag', 'd3-selection', 'd3-timer'], factory)
: (factory((global.d3 = global.d3 || {}), global.d3, global.d3, global.d3))
}(this, function (exports, d3Drag, d3Selection, d3Timer) {
'use strict'
function geoInertiaDragHelper (opt) {
var 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.
v10, // Mouse position in Cartesian coordinates just before end of drag gesture.
v11, // Mouse position in Cartesian coordinates at end.
q10 // Projection rotation as versor at end.
var inertia = inertiaHelper({
start: function () {
v0 = versor.cartesian(projection.invert(inertia.position))
r0 = projection.rotate()
q0 = versor(r0)
opt.start && opt.start()
},
move: function () {
var inv = projection.rotate(r0).invert(inertia.position)
if (isNaN(inv[0])) return
var v1 = versor.cartesian(inv),
q1 = versor.multiply(q0, versor.delta(v0, v1)),
r1 = versor.rotation(q1)
opt.render(r1)
opt.move && opt.move()
},
end: function () {
// velocity
v10 = versor.cartesian(
projection.invert(
inertia.position.map(function (d, i) {
return d - inertia.velocity[i] / 1000
})
)
)
q10 = versor(projection.rotate())
v11 = versor.cartesian(projection.invert(inertia.position))
opt.end && opt.end()
},
render: function (t) {
var rotation = versor.rotation(
versor.multiply(q10, versor.delta(v10, v11, t * 1000))
)
opt.render && opt.render(rotation)
},
time: opt.time
})
return inertia
}
function geoInertiaDrag (target, render, proj, opt) {
// use the "global" projection function if none given
if (!proj && typeof projection === 'function') proj = projection
if (!opt) opt = {}
// complete params: (projection, render, startDrag, dragging, endDrag)
var inertia = geoInertiaDragHelper({
projection: proj,
render: function (rotation) {
proj.rotate(rotation)
render && render()
},
start: opt.start,
move: opt.move,
end: opt.end,
time: opt.time
})
target.call(
d3Drag.drag()
.on('start', inertia.start)
.on('drag', inertia.move)
.on('end', inertia.end)
)
return inertia
}
function inertiaHelper (opt) {
var A = opt.time || 5000 // reference time in ms
var limit = 1.0001
var B = -Math.log(1 - 1 / limit)
var inertia = {
start: function () {
var position = d3Selection.mouse(this)
inertia.position = position
inertia.velocity = [0, 0]
if (inertia.timer) inertia.timer.stop(), inertia.timer = null, this.classList.remove('inertia')
this.classList.add('dragging')
opt.start && opt.start.call(this, position)
},
move: function () {
var position = d3Selection.mouse(this)
var time = performance.now()
var deltaTime = time - inertia.time
var decay = 1 - Math.exp(-deltaTime / 1000)
inertia.velocity = inertia.velocity.map(function (d, i) {
var deltaPos = position[i] - inertia.position[i],
deltaTime = time - inertia.time
return 1000 * (1 - decay) * deltaPos / deltaTime + d * decay
})
inertia.time = time
inertia.position = position
opt.move && opt.move.call(this, position)
},
end: function () {
var v = inertia.velocity
if (v[0] * v[0] + v[1] * v[1] < 100) return inertia.timer = null, this.classList.remove('inertia')
this.classList.remove('dragging')
this.classList.add('inertia')
opt.end && opt.end()
var me = this
inertia.timer = d3Timer.timer(function (e) {
inertia.t = limit * (1 - Math.exp(-B * e / A))
opt.render && opt.render(inertia.t)
if (inertia.t > 1) {
inertia.timer.stop(), inertia.timer = null, me.classList.remove('inertia')
inertia.velocity = [0, 0]
inertia.t = 1
}
})
},
position: [0, 0],
velocity: [0, 0], // in pixels/s
timer: null,
time: 0
}
return inertia
}
exports.geoInertiaDragHelper = geoInertiaDragHelper
exports.geoInertiaDrag = geoInertiaDrag
exports.inertia = inertiaHelper
Object.defineProperty(exports, '__esModule', { value: true })
}))
/*******************************************
* @muonInit
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonInit = global.muonInit || {})))
}(this, function (exports) {
'use strict'
let muonInit = function (__mapper = {}) {
let state = {
canvas: 0,
svg: 0, // SVG
webgl: 0, // WEBGL
bck: 0, // BCK IMAGE
img: 'zimg-black.jpg', // BCK IMAGE
wen: 0, // SVG WEN
versor: 0, // SVG VERSOR
gui: 0, // GUI https://github.com/dataarts/dat.gui
key: 0, // KEYBRD CONTROLS
ray: 0, // RAYDER mouse control
fps: 0,
stats: 0
}
// .................. setContext
let setContext = function (p) {
if (p.canvas && p.canvas !== state.canvas) {
state.canvas = 1
__mapper({'renderCanvas': renderCanvas.renderCanvas(__mapper)})
}
if (p.svg && p.svg !== state.svg) {
state.svg = 1
__mapper({'renderSvg': renderSvg.renderSvg(__mapper)})
}
if (p.bck && p.bck !== state.bck) {
state.bck = 1
__mapper('xs').m('image')(state.img)
}
if (p.svg && p.wen && p.wen !== state.wen) {
state.wen = 1
__mapper('xs').c('wen').control(__mapper('renderSvg').svg())
}
if (p.svg && p.versor && p.versor !== state.versor) {
state.versor = 1
__mapper('xs').c('versor').control(__mapper('renderSvg').svg())
}
if (p.webgl && p.webgl !== state.webgl) {
state.webgl = 1
__mapper({'renderWebgl': renderWebgl.renderWebgl(__mapper)})
}
if (p.gui && p.gui !== state.gui) {
state.gui = 1
gui = new dat.GUI(); gui.add(window, 'restart')
}
if (p.key && p.key !== state.key) {
state.key = 1
__mapper('xs').c('key').start() // KEYBRD CONTROLS
if (__mapper('controlKey') !== undefined) {
let controltimerLeftArrowAlt = () => { // LEFT ARROW
if (__mapper('muonAnimation').animationStop !== undefined) {
console.log('controltimerLeftArrowAlt')
if (__mapper('controlTimer').started()) {
__mapper('controlTimer').stop()
} else {
__mapper('controlTimer').resume()
}
}
}
__mapper('controlKey').subscribe(controltimerLeftArrowAlt, 'leftArrowAlt')
}
if (__mapper('controlKey') !== undefined) {
let controltimerUpArrowAlt = () => { // UP ARROW
console.log('controltimerUpArrowAlt')
__mapper('controlWen').control(__mapper('renderSvg').svg()) // SVG WEN
}
__mapper('controlKey').subscribe(controltimerUpArrowAlt, 'upArrowAlt')
}
let controltimerRightArrowAlt = () => { // RIGHT ARROW
if (__mapper('muonAnimation').animationStop !== undefined) {
if (__mapper('controlTimer').started()) {
__mapper('controlTimer').stop()
} else {
__mapper('controlTimer').resume()
}
}
}
__mapper('xs').c('key').subscribe(controltimerRightArrowAlt, 'rightArrowAlt')
}
if (p.ray && p.ray !== state.ray) {
state.ray = 1
__mapper('xs').c('rayder').control(__mapper('renderSvg').svg())
}
if (p.fps && p.fps !== state.fps) {
state.fps = 1
const fpsdiv = d3.select('body').append('div').attr('id', 'fps')
__mapper('xs').m('fps').init()
}
if (p.stats && p.stats !== state.stats) {
state.stats = 1
let stats = __mapper('xs').m('stats')() // new Stats();
stats.showPanel(-1) // 0: fps, 1: ms, 2: mb, 3+: custom
document.body.appendChild(stats.dom)
function animate () {
stats.begin(); stats.end()
requestAnimationFrame(animate)
}
requestAnimationFrame(animate)
}
}
let enty = function (p) {
setContext(p)
if (__mapper('animation') === undefined) __mapper({'muonAnimation': muonAnimation.muonAnimation(__mapper)})
}
enty.setContext = setContext
return enty
}
exports.muonInit = muonInit
}))
/*************************
* @muonKruskal
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonKruskal = global.muonKruskal || {})))
}(this, function (exports) {
'use strict'
let muonKruskal = function muonKruskal (__mapper = {}) {
/* *************************
* kruskal
*
*/
let kruskal = function (graph, dist) {
// 1 A := ø
const A = []
// 2 pour chaque sommet v de G :
// 3 créerEnsemble(v)
let n = -Infinity
graph.forEach(l => {
if (l.source.index > n) n = l.source.index
if (l.target.index > n) n = l.target.index
})
const uf = new UnionFind(n)
// 4 trier les arêtes de G par poids croissant
graph = graph.map(l => {
l.w = l.length || dist(l.source, l.target)
return l
})
graph.sort((a, b) => d3.ascending(a.w, b.w))
// 5 pour chaque arête (u, v) de G prise par poids croissant :
.forEach(l => {
// 6 si find(u) ≠ find(v) :
if (uf.find(l.source.index) != uf.find(l.target.index)) {
// 7 ajouter l'arête (u, v) à l'ensemble A
A.push(l)
// 8 union(u, v)
uf.link(l.source.index, l.target.index)
}
})
// 9 retourner A
return A
// yield uf;
}
/* *************************
* UnionFind
*
*/
let UnionFind = (function () {
// kruskal.js#
// https://github.com/mikolalysenko/union-find
'use strict'; 'use restrict'
function UnionFind (count) {
this.roots = new Array(count)
this.ranks = new Array(count)
for (let i = 0; i < count; ++i) {
this.roots[i] = i
this.ranks[i] = 0
}
}
let proto = UnionFind.prototype
Object.defineProperty(proto, 'length', {
'get': function () {
return this.roots.length
}
})
proto.makeSet = function () {
let n = this.roots.length
this.roots.push(n)
this.ranks.push(0)
return n
}
proto.find = function (x) {
let x0 = x
let roots = this.roots
while (roots[x] !== x) {
x = roots[x]
}
while (roots[x0] !== x) {
let y = roots[x0]
roots[x0] = x
x0 = y
}
return x
}
proto.link = function (x, y) {
let xr = this.find(x),
yr = this.find(y)
if (xr === yr) {
return
}
let ranks = this.ranks,
roots = this.roots,
xd = ranks[xr],
yd = ranks[yr]
if (xd < yd) {
roots[xr] = yr
} else if (yd < xd) {
roots[yr] = xr
} else {
roots[yr] = xr
++ranks[xr]
}
}
return UnionFind
})()
/* *************************
* enty
*
*/
let enty = function (graph, dist) {
return kruskal(graph, dist)
}
return enty
}
exports.muonKruskal = muonKruskal
}))
/***********
* @muonLacer
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonLacer = global.muonLacer || {})))
}(this, function (exports) {
'use strict'
let muonLacer = function muonLacer (__mapper = {}) {
let f = __mapper('xs').m('props')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let radians = Math.PI / 180,
degrees = 180 / Math.PI
/***********
* @interlace
*/
let interlace = function (streams, t) {
let ww = []
let ses = [] // scale per position
let res = [] // scale per position
let nStreams = streams.length // number of streams
let nDots = streams.reduce((p, q) => Math.max(q.length, p), 0) // max dots
for (let i = 0; i < nStreams; i++) { // scales
let sid = [0, nDots - 1]
let sir = [0, streams[i].length - 1]
let si = d3.scaleLinear() // argument scale
.domain(sid) // from result position
.range(sir) // to strem i position
ses[i] = si // ses scale for i stream
let rid = d3.range(streams[i].length).map((d, i) => i)
let rir = streams[i]
let ri = d3.scaleLinear() // argument scale
.domain(rid) // from result position
.range(rir) // to strem i position
res[i] = ri // ses scale for i stream
}
for (let j = 0; j < nDots; j++) { // each position j
let rr = []
let ss = []
for (let k = 0; k < streams.length; k++) { // each stream
let vk = ses[k](j) // postion on stram
let sk = res[k](vk) // time stream
rr.push(vk) // [0, 0, 0], [0.5, 0.25, 1], [1, 0.5, 2] positions per stream
ss.push(sk) // [2, 33, 5], [2.5, 33.25, 6], [3, 33.5, 7] values j
}
let d = ss.map((item, idx) => idx / (ss.length - 1))
let r = ss
let ws = d3.scaleLinear()
.domain(d)
.range(r)
ww[j] = ws(t)
}
return ww
}
/* **************************
* @slide
*
* [ [a1,a2,a3], [b1,b2] ] [ [a1,b1], [a2,b2x], [a3,b2] ]
* [ {a1,a2,a3}, [b1,b2] ] [ [a1v,b1], [a2v,b2x], [a3v,b2] ]
* [ {a1,a2,a3}, {b1,b2} ] [ [a1v,b1], [a2v,b2x], [a3v,b2] ]
*/
let slide = function (streams = [], compl = 'max') {
let nbr = streams.length
let inpattern = streams.reduce((p, q) => p && f.isNumericArray(q), true)
let lengths = streams.map(d => d.length),
mx = Math.max(...lengths),
mn = Math.min(...lengths)
let streamXYZ = []
if (compl === 'min') {
let pointsHowmany = mn // min length
for (let i = 0; i < pointsHowmany; i++) {
streamXYZ[i] = streams.map(d => d[i])
}
let scales = streams.map(d => d3.scaleLinear().domain([0, pointsHowmany - 1]).range([0, d.length - 1 ]))
} else {
let pointsHowmany = mx // max length
let scales = streams.map(d => d3.scaleLinear().domain([0, pointsHowmany - 1]).range([0, d.length - 1 ]))
for (let j = 0; j < pointsHowmany; j++) {
let w = streams.map((s, k) => streams[k][Math.round(scales[k](j))])
streamXYZ.push(w)
}
}
return streamXYZ
}
/* **************************
* @unslide
*/
let unslide = function (stream = []) {
let lengths = stream.map(d => d.length) // lengths of array elems
let mx = Math.max(...lengths) // 3 if array of 3d coords
let unslide = d3.range(mx).map(mx => [])
for (let i = 0; i < stream.length; i++) {
for (let j = 0; j < mx; j++) {
unslide[j][i] = stream[i][j]
}
}
return unslide
}
/* **************************
* @interadd
*/
let interadd = function (streams) {
let ww = []
let ses = [] // scale per position
let res = [] // scale per position
let nStreams = streams.length // number of streams
let nDots = streams.reduce((p, q) => Math.max(q.length, p), 0) // max dots
for (let i = 0; i < nStreams; i++) { // scales
let sid = [0, nDots - 1]
let sir = [0, streams[i].length - 1]
let si = d3.scaleLinear() // argument scale
.domain(sid) // from result position
.range(sir) // to strem i position
ses[i] = si // ses scale for i stream
let rid = d3.range(streams[i].length).map((d, i) => i)
let rir = streams[i]
let ri = d3.scaleLinear() // argument scale
.domain(rid) // from result position
.range(rir) // to strem i position
res[i] = ri // ses scale for i stream
}
for (let j = 0; j < nDots; j++) { // each position j
let rr = []
let ss = []
for (let k = 0; k < streams.length; k++) { // each stream
let vk = ses[k](j) // postion on stream
let sk = res[k](vk) // time stream
rr.push(vk) // [0, 0, 0], [0.5, 0.25, 1], [1, 0.5, 2] positions per stream
ss.push(sk) // [2, 33, 5], [2.5, 33.25, 6], [3, 33.5, 7] values j
}
ww[j] = ss.reduce((p, q) => q + p, 0)
}
return ww
}
/**********************
* @enty
*/
let enty = function () {}
enty.interlace = interlace
enty.slide = slide
enty.unslide = unslide
enty.interadd = interadd
return enty
}
exports.muonLacer = muonLacer
}))
/***********
* @muonLiner
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonLiner = global.muonLiner || {})))
}(this, function (exports) {
'use strict'
let muonLiner = function muonLiner (__mapper = {}) {
let f = __mapper('xs').m('props'),
mlacer = __mapper('xs').m('lacer'),
manitem = __mapper('xs').m('anitem'),
mstore = __mapper('xs').m('store'),
mstace = __mapper('xs').m('stace'),
mgeoj = __mapper('xs').m('geoj')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let radians = Math.PI / 180,
degrees = 180 / Math.PI
let state = {}
state.rotate = 0
let rotations = 0
/**********************
* @orientate
*/
let orientate = function (anigram) {
let payload = anigram.payload, // payload
uid = payload.uid
let preAnigram = mstore.findAnigramFromUid(uid) // pre-anigram
state.rotate = (preAnigram && preAnigram.payload.rotate)
? preAnigram.payload.rotate
: state.rotate
let refCoords = []
let parentuid = anigram.payload.parentuid
let parent = mstore.findAnigramFromUid(parentuid)
if (parent !== undefined) {
let gj = parent.geofold
refCoords = mgeoj.getCoords(gj)
if (refCoords && refCoords.length > 2) { // two points to set direction
let refCoordsDims = mlacer.unslide(refCoords)
let _posx = mstace.getPosInDim(anigram.payload.proform.translate.x)
let _posy = mstace.getPosInDim(anigram.payload.proform.translate.y)
// let _posz = mstace.getPosInDim(anigram.payload.proform.translate.z)
let posx = f.posInStream(_posx, refCoordsDims[0])
let posy = f.posInStream(_posy, refCoordsDims[1])
// let posz = f.posInStream(_posy, refCoordsDims[2])
if (posx > 1 && posy > 1) {
let x, y // avaform position
let _x, _y // previous avaform position
_x = refCoordsDims[0][posx - 1]
x = refCoordsDims[0][posx]
_y = refCoordsDims[1][posy - 1]
y = refCoordsDims[1][posy]
let _ang = 0, dang = 0, dcos
if (_x && x && _y && y) {
_ang = Math.atan2(-(y - _y), x - _x) * degrees // inverse ang -1
let __x, __y, __ang // two steps before
__x = refCoordsDims[0][posx - 2] // -2 x
__y = refCoordsDims[1][posy - 2] // -2 y
if (__x && __y) { // after second step ....
__ang = Math.atan2(-(_y - __y), _x - __x) * degrees // inverse ang -2
dang = _ang - __ang // delta ang
dcos = Math.cos(dang * radians) // cos of delta ang
if (dcos < -0.66) {
rotations += 1 // rotations
}
}
}
state.rotate = _ang + 180 * rotations
}
}
} else if (preAnigram !== undefined) {
if (preAnigram.geofold && preAnigram.payload.preani) { // two points to set direction
let _c = preAnigram.payload.geonode.geometry.coordinates
let __c = preAnigram.payload.preani.payload.geonode.geometry.coordinates
let refCoordsDims = mlacer.unslide(refCoords)
let x, y // avaform position
let _x, _y // previous avaform position
_x = __c[0]
x = _c[0]
_y = __c[1]
y = _c[1]
let _ang = 0, dang = 0, dcos
if (_x && x && _y && y) {
_ang = Math.atan2(-(y - _y), x - _x) * degrees // inverse ang -1
dang = _ang // delta ang
dcos = Math.cos(dang * radians) // cos of delta ang
}
state.rotate = _ang + 180 * rotations
}
}
return enty
}
/**********************
* @enty
*/
let enty = function () {}
enty.orientate = orientate
enty.rotate = () => state.rotate
return enty
}
exports.muonLiner = muonLiner
}))
/*******************************************
* @muonMapper
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonMapper = global.muonMapper || {})))
}(this, function (exports) {
'use strict'
let muonMapper = function muonMapper () {
let state = {}
let enty = function (_) {
if (arguments.length < 1) return state
if (typeof _ === 'object') return state = Object.assign({}, state, _)
if ((typeof _ === 'string') && (state[_] !== undefined)) return state[_]
}
return enty
}
exports.muonMapper = muonMapper
}))
/***********
* @muonMath
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonMath = global.muonMath || {})))
}(this, function (exports) {
'use strict'
let muonMath = function (__mapper = {}) {
// Newton method from
// https://bl.ocks.org/Fil/1aafd8fa22b62243290674384c364dd0
// Philippe Rivière's Cox Projection
// Released under the The MIT License.
// import {abs, epsilon, halfPi, sqrt} from 'math'
var abs = Math.abs, epsilon = 1e-6, halfPi = Math.PI / 2, sqrt = Math.sqrt
// import {cartesian, cartesianScale, spherical} from 'cartesian'
var asin = Math.asin, atan2 = Math.atan2, cos = Math.cos, sin = Math.sin
function spherical (cartesian) {
return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]
}
function cartesian (spherical) {
var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi)
return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]
}
function cartesianScale (vector, k) {
return [vector[0] * k, vector[1] * k, vector[2] * k]
}
function initial_general (project) {
var n = 50,
step = (halfPi - epsilon) / n,
i,
j,
grid = []
for (i = 0; i <= 4 * n; i++) {
grid[i] = []
for (j = 0; j <= 2 * n; j++) {
var p = [(i - 2 * n) * step, (j - n) * step]
grid[i][j] = project(p[0], p[1])
}
}
return function (x, y) {
// find a start point c "close enough" to x,y
var i, j,
c,
m, min = +Infinity
// d3.scan
for (i = 0; i <= 4 * n; i++) {
for (j = 0; j <= 2 * n; j++) {
m = abs(x - grid[i][j][0]) + abs(y - grid[i][j][1])
if (m < min) {
c = [i, j]
min = m
}
}
}
c = [ step * (c[0] - 2 * n), step * (c[1] - n) ]
return c
}
}
function geoInverse (project, precision, initial) {
let _initial = initial_general(project)
let ___initial = function (x, y) {
if (y > 0.3) return ___initial(x + 0.16, y - 0.035)
if (x > 0) return ___initial(x + 0.16, y + 0.015)
return ___initial(x - 0.1, y)
}
function invert (x, y) {
// find a start point c
var point = [x, y],
c = _initial(x, y)
c[0] *= 0.999
c = cartesian(c)
// solve for x,y
try {
var solution = Newton.Solve(
g => {
var norm = g[0] * g[0] + g[1] * g[1] + g[2] * g[2]
cartesianScale(g, 1 / sqrt(norm))
var s = spherical(g),
p = project(s[0], s[1])
return [p[0], p[1], 1 / norm]
},
[point[0], point[1], 1],
{ start: c, acc: precision, dx: 1e-5, max: 100 }
)
} catch (e) {
console.log(e)
}
if (solution) return spherical(solution)
}
return invert
}
/*
* Newton's method for finding roots
*
* code adapted from D.V. Fedorov,
* “Introduction to Numerical Methods with examples in Javascript”
* http://owww.phys.au.dk/~fedorov/nucltheo/Numeric/11/book.pdf
* (licensed under the GPL)
* by Philippe Riviere <philippe.riviere@illisible.net> March 2014
* modified for compatibility with Chrome/Safari
* added a max iterations parameter
*
* Usage: Newton.Solve(Math.exp, 2)); => ~ log(2)
* Newton.Solve(d3.geo.chamberlin(), [200,240])
*/
var Newton = {version: '1.0.0'} // semver
Newton.Norm = function (v) {
return Math.sqrt(v.reduce(function (s, e) {
return s + e * e
}, 0))
}
Newton.Dot = function (a, b) {
var s = 0
for (var i in a) s += a[i] * b[i]
return s
}
// QR - decomposition A=QR of matrix A
Newton.QRDec = function (A) {
var m = A.length, R = [], i, j, k
for (j in A) {
R[j] = []
for (i in A) R[j][i] = 0
}
var Q = []
for (i in A) {
Q[i] = []
for (j in A[0]) Q[i][j] = A[i][j]
}
// Q is a copy of A
for (i = 0; i < m; i++) {
var e = Q[i],
r = Math.sqrt(Newton.Dot(e, e))
if (r == 0) throw 'Newton.QRDec: singular matrix'
R[i][i] = r
for (k in e) e[k] /= r
// normalization
for (j = i + 1; j < m; j++) {
var q = Q[j],
s = Newton.Dot(e, q)
for (k in q) q[k] -= s * e[k]
// orthogonalization
R[j][i] = s
}
}
return [Q, R]
}
// QR - backsubstitution
// input: matrices Q,R, array b; output: array x such that QRx=b
Newton.QRBack = function (Q, R, b) {
var m = Q.length,
c = new Array(m),
x = new Array(m),
i, k, s
for (i in Q) {
// c = QˆT b
c[i] = 0
for (k in b) c[i] += Q[i][k] * b[k]
}
for (i = m - 1; i >= 0; i--) {
// back substitution
for (s = 0, k = i + 1; k < m; k++) s += R[k][i] * x[k]
x[i] = (c[i] - s) / R[i][i]
}
return x
}
// calculates inverse of matrix A
Newton.Inverse = function (A) {
var t = Newton.QRDec(A),
Q = t[0],
R = t[1]
var m = [], i, k, n
for (i in A) {
n = []
for (k in A) {
n[k] = (k == i ? 1 : 0)
}
m[i] = Newton.QRBack(Q, R, n)
}
return m
}
Newton.Zero = function (fs, x, opts = {} /* acc, dx, max */) {
// Newton's root-finding method
var i, j, k
if (opts.acc == undefined) opts.acc = 1e-6
if (opts.dx == undefined) opts.dx = 1e-3
if (opts.max == undefined) opts.max = 40 // max iterations
var J = []
for (i in x) {
J[i] = []
for (j in x) J[i][j] = 0
}
var minusfx = []
var v = fs(x)
if (v == null) throw 'unable to compute fs at ' + JSON.stringify(x)
for (i in x) minusfx[i] = -v[i]
do {
if (opts.max-- < 0) return x /* bad approximation better that nothing ?? */
for (i in x) {
for (k in x) {
// calculate Jacobian
x[k] += opts.dx
v = fs(x)
if (v == null) throw 'unable to compute fs at ' + JSON.stringify(x)
J[k][i] = (v[i] + minusfx[i]) / opts.dx
x[k] -= opts.dx
}
}
var t = Newton.QRDec(J),
Q = t[0],
R = t[1],
Dx = Newton.QRBack(Q, R, minusfx),
no = Newton.Norm(Dx)
// Newton's step
var s = 2
do {
// simple backtracking line search
s = s / 2
var z = []
for (i in x) {
z[i] = x[i] + s * Dx[i]// * Math.min(no, 1e-2);
}
var minusfz = []
v = fs(z)
if (v == null) throw 'unable to compute fs at ' + JSON.stringify(z)
for (i in x) {
minusfz[i] = -v[i]
}
}
while (Newton.Norm(minusfz) > (1 - s / 2) * Newton.Norm(minusfx) && s > 1.0 / 128)
minusfx = minusfz
x = z
// step done
}
while (Newton.Norm(minusfx) > opts.acc)
return x
}
Newton.Solve = function (fs, res, opts = {}) {
if (typeof res !== 'object') {
res = [ typeof res === 'number'
? +res
: 0
]
}
var _fs = fs
fs = function (x) {
var r = _fs(x)
if (typeof r === 'number') r = [ r ]
for (var i in r) r[i] -= res[i]
return r
}
var start = []
if (opts.start) {
start = opts.start
} else {
for (var i in res) start[i] = 0
}
var n = Newton.Zero(fs, start, opts)
if (n && n.length == 1) n = n[0]
return n
}
// https://d3js.org/d3-geo-projection/ Version 2.4.0. Copyright 2018 Mike Bostock.
// https://github.com/scijs/integrate-adaptive-simpson
// This algorithm adapted from pseudocode in:
// http://www.math.utk.edu/~ccollins/refs/Handouts/rich.pdf
function adsimp (f, a, b, fa, fm, fb, V0, tol, maxdepth, depth, state) {
if (state.nanEncountered) {
return NaN;
}
var h, f1, f2, sl, sr, s2, m, V1, V2, err;
h = b - a;
f1 = f(a + h * 0.25);
f2 = f(b - h * 0.25);
// Simple check for NaN:
if (isNaN(f1)) {
state.nanEncountered = true;
return;
}
// Simple check for NaN:
if (isNaN(f2)) {
state.nanEncountered = true;
return;
}
sl = h * (fa + 4 * f1 + fm) / 12;
sr = h * (fm + 4 * f2 + fb) / 12;
s2 = sl + sr;
err = (s2 - V0) / 15;
if (depth > maxdepth) {
state.maxDepthCount++;
return s2 + err;
} else if (Math.abs(err) < tol) {
return s2 + err;
} else {
m = a + h * 0.5;
V1 = adsimp(f, a, m, fa, f1, fm, sl, tol * 0.5, maxdepth, depth + 1, state);
if (isNaN(V1)) {
state.nanEncountered = true;
return NaN;
}
V2 = adsimp(f, m, b, fm, f2, fb, sr, tol * 0.5, maxdepth, depth + 1, state);
if (isNaN(V2)) {
state.nanEncountered = true;
return NaN;
}
return V1 + V2;
}
}
function integrate (f, a, b, tol, maxdepth) {
var state = {
maxDepthCount: 0,
nanEncountered: false
};
if (tol === undefined) {
tol = 1e-8;
}
if (maxdepth === undefined) {
maxdepth = 20;
}
var fa = f(a);
var fm = f(0.5 * (a + b));
var fb = f(b);
var V0 = (fa + 4 * fm + fb) * (b - a) / 6;
var result = adsimp(f, a, b, fa, fm, fb, V0, tol, maxdepth, 1, state);
/*
if (state.maxDepthCount > 0 && console && console.warn) {
console.warn('integrate-adaptive-simpson: Warning: maximum recursion depth (' + maxdepth + ') reached ' + state.maxDepthCount + ' times');
}
if (state.nanEncountered && console && console.warn) {
console.warn('integrate-adaptive-simpson: Warning: NaN encountered. Halting early.');
}
*/
return result;
}
/**************************
* @enty
*/
let enty = function () {}
/*
var pow = Math.pow;
given alpha, k, gamma
function elliptic (f) {
return alpha + (1 - alpha) * pow(1 - pow(f, k), 1 / k);
}
function z(f) {
return integrate(elliptic, 0, f, 1e-4);
}
var G = 1 / z(1)
*/
enty.integrate = integrate
enty.geoInverse = geoInverse
return enty
}
exports.muonMath = muonMath
}))
/***************************
* @muonNat
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonNat = global.muonNat || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **returns nat mesh**
// md:
// md: ### properties
// md:
// md: ### methods
// md: natFeature
// md: `coordinates = Array.of(__mapper("xs").m("nat").natFeature(p.form))`
// md:
// md: natNform
// md: compleate form for natform
// md:
// md: # license
// md: MIT
// http://adripofjavascript.com/blog/drips/object-equality-in-javascript.html
let isSame = function (a, b) {
let ret = false
if (a !== undefined && b !== undefined) {
var aProps = Object.getOwnPropertyNames(a)
var bProps = Object.getOwnPropertyNames(b)
if (aProps.length != bProps.length) {
return false
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i]
if (a[propName] !== b[propName]) {
return false
}
}
ret = true
}
return ret
}
let muonNat = function muonNat (__mapper = {}) {
let mgraticule = __mapper('xs').m('graticule'),
mprofier = __mapper('xs').m('profier'),
mproj3ct = __mapper('xs').m('proj3ct')
let cache = {} // feature, form
const cos = Math.cos, sin = Math.sin,
neg = x => x < 0 || (x === 0 && (1 / x < 0)),
pos = x => x > 0 || (x === 0 && (1 / x > 0)),
radians = Math.PI / 180,
degrees = 180 / Math.PI,
tau = 2 * Math.PI
// ............................. natNform
let natNform = function (form, nformed = {}) {
let defs = {'v0': 0, 'v1': 1, 'ra2': 120, 'w4': 0, 'seg5': 360, 'pa6': 0, 'pb7': -1} // defs
if (form && typeof form === 'object' && // {nat}
(form.x === undefined && form.y === undefined && form.z === undefined)) {
nformed.x = Object.assign({}, defs, form)
nformed.y = Object.assign({}, defs, form)
} else if (form && typeof form === 'object' && // {x,y}
(form.x !== undefined && form.y !== undefined)) {
nformed.x = Object.assign({}, defs, form.x)
nformed.y = Object.assign({}, defs, form.y)
if (form.z !== undefined && form.r !== undefined) { // {x,y,z,r}
nformed.z = Object.assign({}, defs, form.z)
nformed.r = form.r
} else if (form.z !== undefined && form.r === undefined) { // {x,y,z}
nformed.z = Object.assign({}, defs, form.z)
nformed.r = Object.assign({}, defs)
}
} else if (form && typeof form === 'object' && // form:{x:obj}
(form.x !== undefined && form.y === undefined)) {
nformed.x = Object.assign({}, defs, form.x)
nformed.y = Object.assign({}, defs, (form.y || form.x))
if (form.z !== undefined && form.r !== undefined) { // {x,y,z,r}
nformed.z = form.z
nformed.r = form.r
} else if (form.z !== undefined && form.r === undefined) { // {x,y,z}
nformed.z = Object.assign({}, defs, form.z)
nformed.r = Object.assign({}, defs, form.z)
}
} else if (form && Array.isArray(form)) { // [x,y]
nformed.x = form[0]
nformed.y = form[1] || Object.assign({}, defs, form[0])
if (form[2] !== undefined && form[3] !== undefined) { // [x,y,z,r]
nformed.z = form[2]
nformed.r = form[3]
} else if (form[2] !== undefined && form[3] === undefined) { // [x,y,z]
nformed.z = Object.assign({}, defs, form[2])
nformed.r = Object.assign({}, defs, form[2])
}
}
let formkeys = Object.keys(nformed)
for (let i = 0; i < formkeys.length; i++) {
let key = formkeys[i]
let form = nformed[key]
// dom3 --- axis domain
if (i === 0 && form.dom3 === undefined) form.dom3 = [-180, 180]
if (i === 1 && form.dom3 === undefined) form.dom3 = [-180, 180]
if (i === 2 && form.dom3 === undefined) form.dom3 = [-90, 90]
if (i === 3 && form.dom3 === undefined) form.dom3 = [-90, 90]
// fn0 --- dimension function
if (i === 0 && form.fn0 === undefined) form.fn0 = (q, s, u, v, a, b, c = 1, d = 1) => a * cos(q) * c * cos(u)
if (i === 1 && form.fn0 === undefined) form.fn0 = (q, s, u, v, a, b, c = 1, d = 1) => b * sin(q) * c * cos(u)
if (i === 2 && form.fn0 === undefined) form.fn0 = (q, s, u, v, a, b, c = 1, d = 1) => d * sin(v)
if (i === 3 && form.fn0 === undefined) form.fn0 = (q, s, u, v, a, b, c = 1, d = 1) => c * cos(u)
}
return nformed
}
// ............................. natFeature
let natFeature = function (form) {
let feature
if (isSame(form, cache.form)) {
feature = cache.feature
} else {
let nformed = natNform(form) // NFORM
if (1 && 1) console.log('form', JSON.stringify(form))
if (1 && 1) console.log('nformed', nformed)
let geometry
let dx, dy, sx, sy
// if (Object.keys(nformed).length > 2 ) { // ___ 3d
if (nformed.z !== undefined) { // ___ 3d
dx = 360 / nformed.x.seg5 // x
dy = 360 / nformed.z.seg5 // ____ z ___
sx = dx
sy = dy
let xdomain = form.x.dom3 || [-180, 180]
let ydomain = form.z.dom3 || [-90, 90] // ____ z ___
let graticule = {frame: [ [ [...xdomain, sx, dx], [...ydomain, sy, dy] ] ]} // x, y
geometry = mgraticule.vhMultiLine(graticule).geometry
} else { // ___ 2d
dx = 360 / nformed.x.seg5 // x
dy = 360 / nformed.y.seg5 // y
sx = 360
sy = 360
let xdomain = nformed.x.dom3 || [-180, 180]
let ydomain = nformed.y.dom3 || [-180, 180]
// _e_
let graticule = {frame: [ [ [...xdomain, sx, dx], [...ydomain, sy, dy] ] ]} // x, y
geometry = mgraticule.vhMultiLine(graticule).geometry // geometry.type: MultiLineString
let p = geometry.coordinates[1].slice(0, -1)
// p = [...p, p[0]] // close
geometry.coordinates = Array.of(p)
}
let gj = {
type: 'Feature',
geometry: geometry,
properties: {
doc: 'nat',
geonode: {
type: 'Feature',
geometry: {type: 'Point', coordinates: [0, 0, 0]},
properties: {
orgen: [0, 0, 0], velin: [0, 0, 0], velang: [0, 0, 0], prevous: [0, 0, 0], geodelta: [0, 0, 0]
}
}
}
}
let projection = mprofier.formion({ projection: 'natform', form: nformed })
feature = mproj3ct(gj, projection)
cache.form = form
cache.feature = feature
}
return feature
}
// ............................. closeFeature
let closeFeature = function (feature) {
let newFeature = Object.assign({}, feature)
if (feature.type === 'Feature' && feature.geometry.type === 'MultiLineString') {
newFeature.geometry.type = 'Polygon'
newFeature.geometry.coordinates = newFeature.geometry.coordinates.map(line => [...line, line[0]])
} else if (feature.type === 'Feature' && feature.geometry.type === 'LineString') {
newFeature.geometry.type = 'Polygon'
let line = newFeature.geometry.coordinates
let closedline = [...line, line[0]]
newFeature.geometry.coordinates = Array.of(closedline)
}
return newFeature
}
/* **************************
* @rador : seg5 unit circle rador
* m.snap.snap (dax form => rador)
*/
let rador = function (form) { // polarCoords
let pts = []
let t = 0
let maxRadio = 0
const {m1, m2, n1, n2, n3, a, b, v0, v1, seg5} = form
const bform = {m1, m2, n1, n2, n3, a, b, v0, v1, seg5}
if (isSame(bform, cache.bform)) {
pts = cache.points
} else {
const angUnit = tau / seg5 // dots per period
let angi = (form.angi) ? form.angi : (i, ang) => (i * ang) - Math.PI
let abs = (form.abs) ? form.abs : Math.abs
for (let i = 0; i < seg5; i++) {
let ang = angi(i, angUnit * v1) // [0,360] => [-180,180] // v1
let t1 = m1 * ang / 4
let t2 = m2 * ang / 4
t = Math.pow(
Math.pow(abs(Math.cos(t1) / a), n2) // n2
+
Math.pow(abs(Math.sin(t2) / b), n3), // n3
-1 / n1) // n1
t = t * (1 + v0 * i)
if (t > maxRadio) maxRadio = t
pts.push(t)
}
let radUnit = 1 / maxRadio // Math.SQRT1_2 / maxRadio normalize
pts = pts.map(d => d * radUnit)
cache.bform = bform
cache.points = pts
}
return pts // dots in path: [0,...,seg5] => [0,1]
}
/* **************************
* @radorm
* g.natform
*/
function radorm (form, s1extent = [-1, 1]) { // radorm: [-1,1) => [-1,1]
let radorPts = rador(form) // rador: [-1,1] => [0,seg5)
let s1range = [0, radorPts.length - 1] // [0, seg5]
let s2extent = d3.range(0, radorPts.length - 1) // [0,...,seg5]
let s2range = radorPts // mormed form
let s1 = d3.scaleLinear().domain(s1extent).range(s1range) // [-1,1] => [0,seg5]
let s2 = d3.scaleLinear().domain(s2extent).range(s2range) // [0,..,seg5] => rador
return p => s2(s1(p)) // [0,1) =s1=> [0,seg5) =rador=> [0,1]
}
/* *********************
* @natVertex
* called by g.natVertex.pointStream to build nat conform point stream
* calls m.nat.radorm
*/
// ............................. natVertex
let natVertex = function (form) { // getVertex
let nformed = natNform(form) // natNform
let unfeld = Object.values(nformed)
let dominos = unfeld.map(d => d.dom3) // [ [-180,180], [-180,180], [-90,90], [-90,90] ]
let radions = unfeld.map((d, i) => radorm(d, dominos[i])) // radorm
let rayscale = unfeld.map((d, i) => p => radions[i](p * degrees)) // rayscale on degres
let scale = [1, 1, 1], rotation = [0, 0, 0], location = [0, 0, 0], rad, wr, wd
if (nformed) rad = scale = unfeld.map(dax => dax.ra2)
if (nformed) wd = rotation = unfeld.map(dax => (dax.w4 || 0)) // yfase
let vertex = function (lambdaD, phiD = 0, radio = 1) { // spherical degrees
let ppD = [] // pars in degrees
ppD[0] = lambdaD + wd[0]
ppD[1] = lambdaD + wd[1]
ppD[2] = phiD + (wd[2] || 0)
ppD[3] = phiD + (wd[3] || 0)
let ppR = ppD.map(d => d * radians) // r,s,u,v : pars in radians per dax
let rs = unfeld.map((d, i) => rayscale[i](ppR[i]) || 1) // a,b,c,d : radorn on dax par
// form.fn0 takes radians and radorns
let rr = unfeld.map((d, i) => d.fn0(...ppR, ...rs)) //
// if (1 && 1) console.log('ppR', ppR)
// if (1 && 1) console.log('rs', rs)
// if (1 && 1) console.log('rr', rr)
let point = unfeld.map((d, i) => radio * rad[i] * rr[i])
let projpnt = (point[2] !== undefined)
? [ point[0], point[1], point[2] ] // 3D
: [ point[0], point[1] ] // 2D
return projpnt // [x,y,z]
}
return vertex
}
// ............................. enty
let enty = function () {}
enty.natFeature = natFeature
enty.natNform = natNform
enty.closeFeature = closeFeature
enty.natVertex = natVertex
enty.rador = rador
enty.radorm = radorm
return enty
}
exports.muonNat = muonNat
}))
const d3 = require('./d3.v5.js')
global.d3 = d3
const muonMapper = require('./muon-mapper.js')
let __mapper = muonMapper.muonMapper()
const xs = require('./x-s.js')
__mapper({'xs': xs.xs(__mapper)}) // PROXIES
const muonGraticule = require('./muon-graticule.js')
const muonProfier = require('./muon-profier.js')
const muonProj3ct = require('./muon-proj3ct.js')
const muonNat = require('./muon-nat.js')
let mnat = muonNat.muonNat(__mapper)
test('natNform', () => {
let form = {"m1":4,"m2":4,"n1":4,"n2":2,"n3":2,"a":1,"b":1}
let nformed = {
"x":{
"v0":0,"v1":1,"ra2":120,"w4":0,"seg5":360,"pa6":0,"pb7":-1,"m1":4,"m2":4,"n1":4,"n2":2,"n3":2,"a":1,"b":1,"dom3":[-180,180],
},
"y":{
"v0":0,"v1":1,"ra2":120,"w4":0,"seg5":360,"pa6":0,"pb7":-1,"m1":4,"m2":4,"n1":4,"n2":2,"n3":2,"a":1,"b":1,"dom3":[-180,180],
}
}
nformed.x.fn0 = (q, s, u, v, a, b, c = 1, d = 1) => a * cos(q) * c * cos(u)
nformed.y.fn0 = (q, s, u, v, a, b, c = 1, d = 1) => b * sin(q) * c * cos(u)
let result = mnat.natNform(form)
expect(JSON.stringify(result)).toBe(JSON.stringify(nformed))
})
/**********************
* @muonPacer
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonPacer = global.muonPacer || {})))
}(this, function (exports) {
'use strict'
let muonPacer = function muonPacer (__mapper = {}) {
let f = __mapper('xs').m('props'),
mgeom = __mapper('xs').m('geom'),
mwen = __mapper('xs').m('wen'),
crayder = __mapper('xs').c('rayder'),
cwen = __mapper('xs').c('wen'),
cversor = __mapper('xs').c('versor'),
mstace = __mapper('xs').m('stace'),
manitem = __mapper('xs').m('anitem'),
mric = __mapper('xs').m('ric'),
mstore = __mapper('xs').m('store')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
// ------------------------------- muonPacerHalo_gramm
let pacer = function (payload, newItems = []) {
let boform = payload.boform, // boform
ric = payload.ric, // ric
tim = payload.tim, // tim
proform = payload.proform, // proform
conform = payload.conform, // conform
uid = payload.uid, // uid
parentuid = payload.parentuid, // parentuid
inited = payload.inited, // inited
gelded = payload.gelded // gelded
let pacer = payload.pacer || {}, // pacer
mousesignal = pacer.mousesignal || 0, // mousesignal
span = pacer.span || 0, // span between items
aad = pacer.aad || 0, // aad to previtem
outted = pacer.outted || 0 // outted
let initSitus, eventSitus, autoSitus, fidder, geojsor
/* ****
* count
*/
let count = {} // items in cycle
/* ****
* controls
*/
let mouse = {} // mouse control
mouse.mouseDown = crayder.mouseDown() // down
mouse.mouseUp = crayder.mouseUp() // up
mouse.mouseMove = crayder.mouseMove() // move
mouse.mouseDownShared = crayder.mouseDownShared() // shareddown
mouse.event = crayder.event() // event
if (mouse.event && mouse.event.type === 'mouseup') { // if mouse up then reset
let svg = __mapper('renderSvg').svg()
cwen.reset(svg)
cversor.reset(svg)
}
if (mouse.event !== undefined && mouse.mouseDown === 1) { // on mouse DOWN
if (mousesignal === 0 || mouse.event.type === 'mousedown') { //
count.event = Math.floor(pacer.eventN) // if in state or was event
}
}
if (outted === undefined || outted !== 1) {
count.init = Math.floor(pacer.initN) // count INIT
}
let cycletime = tim.unitPassed - (pacer.outtimed || 0)
if (cycletime >= pacer.autoP &&
tim.unitPassed > (pacer.autoT || 0)
) { // if cycle time above autopath
count.auto = Math.floor(pacer.autoN) // count AUTO
}
newItems = payload.pacer.geojsor(payload, count) // new geoItems
return newItems
}
/**********************
* @enty
*/
let enty = pacer
return enty
}
exports.muonPacer = muonPacer
}))
/***************************
* @muonPolyhedral
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonPolyhedral = global.muonPolyhedral || {})))
}(this, function (exports) {
'use strict'
var muonPolyhedral = function muonPolyhedral (__mapper = {}) {
let f = __mapper('xs').m('props') // props
let renderport = __mapper('renderRenderport'),
width = renderport.width(),
height = renderport.height()
let d3Geo = d3
let pi = Math.PI, degrees = 180 / pi, radians = pi / 180
/***************************
* @enty
*/
var enty = function (proform = {}) {
let {faciaRotation, geoRotation, prjRaw, faces, tree} = proform
let faceProjection = function (face) {
let prj = d3Geo.geoProjection(prjRaw)
let c = d3Geo.geoCentroid({type: 'MultiPoint', coordinates: face})
let rotate = geoRotation(c)
let translate = [0, 0, 0]
let scale = 1 // convention
return prj.scale(scale).translate(translate).rotate(rotate)
}
faces = faces.map(function (face) {
let polygon = face.slice()
face = face.slice(0, -1)
return {
face: face,
contains: function (lambda, phi) {
return d3Geo.geoContains({ type: 'Polygon', coordinates: [ polygon ] },
[lambda * degrees, phi * degrees])
},
project: faceProjection(face)
}
})
tree.forEach(function (d, i) { // tree
let node = faces[d]
node && (node.children || (node.children = [])).push(faces[i])
})
let facefn = function (lambda, phi) {
for (let i = 0; i < faces.length; i++) {
if (faces[i].contains(lambda, phi)) return faces[i]
}
}
let m = d3Geo.geoPolyhedral(
faces[0],
facefn,
faciaRotation, // rotation of the root face in the projected (pixel) space
true // clipPolygon http://blockbuilder.org/Fil/cb7930254c9e7062114678d62d9be5ac
)
return m
}
return enty
}
exports.muonPolyhedral = muonPolyhedral
}))
/****************************
* @muonProfier
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonProfier = global.muonProfier || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: build geo projections
// md: ## functions
// md: * ### getProj
// md:
// md: ## methods
// md: * ### formion
// md: `formion (projdef, anigram)`
// md: **get projection from projdef and apply projection properties**
// md: if `@projdef` or `@projdef.projection` are not defined, assume `p.uniwen` identity
// md: if `@projdef.translate != undefined`
// md: * if pure array, translate to position
// md: * if non-pure array, add translate positions
// md: * if a position, `object` translate to position
// md: * if other `object`, process as `stace.spot`
// md:
// md: if `@projdef.anod == 1` add `geofold.properties.geonode.geometry.coordinates` to translate
// md:
// md: if `@projdef.rotate != undefined`
// md: * if is pure array, apply rotation
// md: * if is 2d, apply z rotation
// md: * if non-pure array, add multi-rotations
// md:
// md: if `@projdef.prerotation [[[ control:wen ]]]` apply wen control rotation
// md: if `@projdef.prerotation [[[ control:versor ]]]` apply versor control rotation
// md: if `@projdef.control:wen` apply wen control rotation
// md: if `@projdef.control:versor` apply versor control rotation
// md:
// md: ### projer
// md: use: `mprofier.projer(prodef, anigram)(gj)
// md: *get formion projector on gj*
// md:
// md: ### conformer
// md: use: `mprofier.conformer (anigram)`
// md: **get formion projector**
// md: assumes `projection != undefined`
// md: ```
// md: projection: {
// md: projection: 'natform',
// md: form: anigram.payload.conform
// md: }
// md: ```
// md:
// md: ### proformion
// md: call `mprofier.proformion (anigram)`
// md: calls `formion(anigram.payload.proform, anigram)`
// md: **get proform projection from projdef**
// md:
// md: ### proformer
// md:
// md:
// md: ### ereformion
// md: ### ereformer
// md:
let muonProfier = function muonProfier (__mapper = {}) {
let f = __mapper('xs').m('props'),
cwen = __mapper('xs').c('wen')(),
cversor = __mapper('xs').c('versor'),
mwen = __mapper('xs').m('wen'),
mstace = __mapper('xs').m('stace'),
mproj3ct = __mapper('xs').m('proj3ct'),
mgeom = __mapper('xs').m('geom'),
guniwen = __mapper('xs').g('uniwen')
// getProj
let getProj = function (projdef) {
let geoproj
if (projdef === undefined) {
if (2 && 2) console.log('** m.profier.formion projdef undefined', projdef)
geoproj = formion({projection: 'uniwen'})
geoproj = guniwen({})
} else if (typeof projdef === 'function') {
geoproj = projdef
} else if (Array.isArray(projdef)) {
for (let i = 0; i < projdef.length; i++) { // projdef is now object
let prop = projdef[i]
if (prop.projection !== undefined) geoproj = getProj(prop.projection)
break
}
} else if (typeof projdef === 'object') {
if (f.isString(projdef.projection)) { // if _projection singular name
geoproj = __mapper('xs').g(projdef.projection)(projdef)
} else if (f.isArray(projdef.projections)) { // if plural select one
geoproj = projdef.projections[ Math.round(projdef.projectidx || 0) ]
if (f.isString(geoproj)) { // if name in array
geoproj = __mapper('xs').g(geoproj)(projdef) // get projection from name
} else {
if (2 && 2) console.log('m.profier.formion index proj not name', projdef)
geoproj = guniwen({})
return geoproj
}
} else if (f.isFunction(projdef.projection)) { // if is projection
geoproj = projdef.projection // props passed to projection
} else {
let projname = 'uniwen' // default to uniwen projection
geoproj = __mapper('xs').g(projdef.projection)(projname) // get projection from name
}
}
return geoproj
}
// ............................. formion
let formion = function (projdef, anigram = {}) {
let projection
let projname
let geofold = anigram.geofold,
payload = anigram.payload
let translation, rotation
if (typeof projdef === 'object') { // projdef is object
projection = getProj(projdef)
if (projdef.translate) { // TRANSLATE proj method
if (f.isPureArray(projdef.translate)) {
translation = projdef.translate
} else if (Array.isArray(projdef.translate)) {
let _trans = []
for (let k = 0; k < projdef.translate.length; k++) {
_trans = mgeom.add(_trans, projdef.translate[k])
}
translation = _trans
} else if (typeof projdef.translate === 'object' && f.isPosition(projdef.translate)) {
translation = Object.values(projdef.translate)
} else if (typeof projdef.translate === 'object') {
translation = mstace.getTranspot(projdef.translate, anigram)
}
if (projdef.anod && geofold.properties && geofold.properties.geonode) {
let geonode = geofold.properties.geonode // geonode
if (geonode.geometry && geonode.geometry.coordinate !== undefined) {
let nodetranslate = geonode.geometry.coordinates // geonode coords
translation = mgeom.add(translation, nodetranslate)
}
}
}
if (projection.rotate !== undefined) { // ROTATE proj method
let rot = [0, 0] // projection.rotate()
let projrot = projdef.rotate || [0, 0, 0] // default to 3d
if (f.isPureArray(projrot)) {
projrot = projrot
} else { // if multi rotates
let _rot = []
for (let k = 0; k < projrot.length; k++) {
_rot = mgeom.add(_rot, projrot[k])
}
projrot = _rot
}
rot = mgeom.add(rot, projrot)
let control = (projdef.control === 'wen') ? cwen
: (projdef.control === 'versor') ? cversor
: undefined
if (control !== undefined) {
let controlRotation = control
.projection(projection) // invert on projection
.rotation() // rotation from control wen
if (controlRotation) rot = mgeom.add(rot, controlRotation)
}
let prerotate = projdef.prerotate
if (prerotate) rot = mgeom.add(rot, prerotate) // ADD prerotate
let dims = projrot.length // planar or spherical geometry
if (dims == 2) rot = mwen.cross([ Math.sqrt(rot[0]), 0, 0], [0, Math.sqrt(rot[1]), 0]) // planar rot
rotation = rot
}
for (let [key, value] of Object.entries(projdef)) { // object
if (key === 'projection') { // bypass projection
} else if (key === 'control') { // bypass control
} else if (key === 'rotate') { // rotate rotation
projection.rotate(rotation)
} else if (key === 'translate') { // translate translation
projection.translate(translation)
} else if (f.isFunction(projection[key]) && value !== null) {
projection[key](value)
}
}
}
return projection
}
// ............................. projer
let projer = (prodef, anigram) => // projer is fenrir if no prodef
json => (prodef) ? mproj3ct(json, formion(prodef)) : json
// ............................. conformer
let conformer = anigram => {
let projion
let projdef = anigram.payload.conform
if (projdef === undefined) {
projion = d => d // identity if conformed undefined
} else {
if (projdef.projection === undefined) {
projdef = { // natform if projection undefined
projection: 'natform', // default to natform
form: projdef // form is conform
}
}
let projection = formion(projdef)
projion = json => mproj3ct(json, projection)
}
return projion
}
// ............................. proformion
let proformion = anigram => formion(anigram.payload.proform, anigram)
let proformer = anitem => json => mproj3ct(json, proformion(anitem))
// ............................. ereformion
let ereformion = anigram => formion(anigram.payload.ereform, anigram)
let ereformer = anitem => json => mproj3ct(json, ereformion(anitem))
// ............................. enty
let enty = function () {}
enty.formion = formion
enty.projer = projer
enty.proformion = proformion
enty.proformer = proformer
enty.ereformion = ereformion
enty.ereformer = ereformer
enty.conformer = conformer
return enty
}
exports.muonProfier = muonProfier
}))
/***************************
* @muonProj3ct
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonProj3ct = global.muonProj3ct || {})))
}(this, function (exports) {
'use strict'
//md: md:{filename}
//md: https://d3js.org/d3-geo-projection/
//md: Copyright 2017 Mike Bostock.
//md: proj3ct(gj, projection)
var muonProj3ct = function (__mapper = {}) {
let f = __mapper('xs').m('props')
let noop = function () {}
let d3Geo = d3
var clockwise = function (ring) {
if ((n = ring.length) < 4) return false
var i = 0,
n,
area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]
while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]
return area <= 0
}
var contains = function (ring, point) {
var x = point[0],
y = point[1],
contains = false
for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {
var pi = ring[i], xi = pi[0], yi = pi[1],
pj = ring[j], xj = pj[0], yj = pj[1]
if (((yi > y) ^ (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi)) contains = !contains
}
return contains
}
var project = function (object, projection) { // index
var stream = projection.stream, project
if (!stream) throw new Error('invalid projection')
switch (object && object.type) {
case 'Feature': project = projectFeature; break
case 'FeatureCollection': project = projectFeatureCollection; break
default: project = projectGeometry; break
}
return project(object, stream)
}
function projectFeatureCollection (o, stream) {
return {
type: 'FeatureCollection',
features: o.features.map(function (f) {
return projectFeature(f, stream)
})
}
}
function projectFeature (o, stream) {
let geometry = projectGeometry(o.geometry, stream)
let ret = {
type: 'Feature',
// id: o.id,
properties: o.properties,
geometry: geometry
}
return ret
}
function projectGeometryCollection (o, stream) {
return {
type: 'GeometryCollection',
geometries: o.geometries.map(function (o) {
return projectGeometry(o, stream)
})
}
}
function projectGeometry (o, stream) {
if (!o) return null
if (o.type === 'GeometryCollection') return projectGeometryCollection(o, stream)
var sink
switch (o.type) {
case 'Point': sink = sinkPoint; break
case 'MultiPoint': sink = sinkPoint; break
case 'LineString': sink = sinkLine; break
case 'MultiLineString': sink = sinkLine; break
case 'Polygon': sink = sinkPolygon; break
case 'MultiPolygon': sink = sinkPolygon; break
case 'Sphere': sink = sinkPolygon; break
default: return null
}
let streamSink = stream(sink)
d3Geo.geoStream(o, streamSink)
// return sink.result()
let ret = sink.result()
return ret
}
var points = []
var lines = []
var sinkPoint = {
point: function (x, y, z) {
let point = (z === undefined) ? [x, y] : [x, y, z]
points.push(point) // ____ z ____
},
result: function () {
var result = !points.length ? null
: points.length < 2 ? {type: 'Point', coordinates: points[0]}
: {type: 'MultiPoint', coordinates: points}
points = []
return result
}
}
var sinkLine = {
lineStart: noop,
point: function (x, y, z) {
let point = (z === undefined) ? [x, y] : [x, y, z]
points.push(point) // ____ z ____
},
lineEnd: function () {
if (points.length) lines.push(points), points = []
},
result: function () {
var result = !lines.length ? null
: lines.length < 2 ? {type: 'LineString', coordinates: lines[0]}
: {type: 'MultiLineString', coordinates: lines}
lines = []
return result
}
}
var sinkPolygon = {
polygonStart: noop,
lineStart: noop,
point: function (x, y, z) {
points.push([x, y, z]) // z
},
lineEnd: function () {
var n = points.length
if (n) {
do points.push(points[0].slice()); while (++n < 4)
lines.push(points), points = []
}
},
polygonEnd: noop,
result: function () {
if (!lines.length) return null
var polygons = [],
holes = []
// https://github.com/d3/d3/issues/1558
lines.forEach(function (ring) {
if (clockwise(ring)) polygons.push([ring])
else holes.push(ring)
})
holes.forEach(function (hole) {
var point = hole[0]
polygons.some(function (polygon) {
if (contains(polygon[0], point)) {
polygon.push(hole)
return true
}
}) || polygons.push([hole])
})
lines = []
return !polygons.length ? null
: polygons.length > 1 ? {type: 'MultiPolygon', coordinates: polygons}
: {type: 'Polygon', coordinates: polygons[0]}
}
}
/***************************
* @enty
*/
let enty = (object, projection) => project(object, projection)
return enty
}
exports.muonProj3ct = muonProj3ct
}))
/***************************
* @muonProps
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonProps = global.muonProps || {})))
}(this, function (exports) {
'use strict'
let muonProps = function muonProps () {
let props = {}
props.tst = (a,b) => a + b
/***************************
* @arrays
*/
props.a = d => (Array.isArray(d)) ? [...d] : [d]
props.cloneArray = function (obj) {
if (Array.isArray(obj)) {
let r = [ ...obj ]
} else {
r = obj
}
return r
}
props.parray = d => (Array.isArray(d)) ? d.slice() : [d]
props.rarray = d => (Array.isArray(d)) ? [ ...d ].reverse() : [d] // reverse array
props.isNumericArray = d => Array.isArray(d) && d.reduce((prev, curr) => prev && typeof curr === 'number', true)
// pure array: no object/funcion elements
props.isPureArray = d => Array.isArray(d) && d.reduce((prev, curr) => prev && typeof curr !== 'object' && typeof curr !== 'function', true)
// functional array
props.isFunctionalArray = d => Array.isArray(d) && d.reduce((prev, curr) => prev && typeof curr === 'function', true)
// pure multiarray: array of pure arrays
props.isPureMultiArray = d => Array.isArray(d) && d.reduce((prev, curr) => prev && props.isPureArray(curr), true)
// quasipure array: arrays, string or number elements
props.isQuasiPureArray = d => Array.isArray(d) && d.reduce((prev, curr) => prev &&
Array.isArray(curr) ||
typeof (curr) === 'string' ||
typeof (curr) === 'number'
, true)
props.isDoubleSingleArray = d => (Array.isArray(d) && // [[_]]
Array.isArray(d[0]) &&
d.length === 1 &&
d[0].length === 1
)
props.isDoubleArray = d => (Array.isArray(d) && // [[_]]
Array.isArray(d[0]) &&
d.length === 1
)
// tripleArray" animas animation, single polygon geojson MultiPolygon
props.isTripleArray = d => (Array.isArray(d) && Array.isArray(d[0]) && Array.isArray(d[0][0]) &&
d.length === 1 && d[0].length === 1 && d[0][0].length === 1) // [[[_]]]
props.interadd = function (arr = []) {
let locations = []
let poses = arr.length // additive positions eg.2
let mx = Math.max(...arr.map(d => d.length)) // num of dims eg. 3
for (let i = 0; i < mx; i++) { // for each dimension
let loc = 0
for (let j = 0; j < poses; j++) {
loc = loc + arr[j][i]
}
location[i] = loc
}
locations.push(location)
return locations
}
/* **************************
* @interlink
* [ [a1,a2,a3], [b1,b2] ] [ [a1,b1], [a2,b2x], [a3,b2] ]
* [ {a1,a2,a3}, [b1,b2] ] [ [a1v,b1], [a2v,b2x], [a3v,b2] ]
* [ {a1,a2,a3}, {b1,b2} ] [ [a1v,b1], [a2v,b2x], [a3v,b2] ]
*/
props.interlink = function (streams = [], compl = 'max') {
let nbr = streams.length
let inpattern = streams.reduce((p, q) => p && props.isNumericArray(q), true)
let lengths = streams.map(d => d.length),
mx = Math.max(...lengths),
mn = Math.min(...lengths)
let streamXYZ = []
if (compl === 'min') {
let pointsHowmany = mn // min length
for (let i = 0; i < pointsHowmany; i++) {
streamXYZ[i] = streams.map(d => d[i])
}
let scales = streams.map(d => d3.scaleLinear().domain([0, pointsHowmany - 1]).range([0, d.length - 1 ]))
} else {
let pointsHowmany = mx // max length
let scales = streams.map(d => d3.scaleLinear().domain([0, pointsHowmany - 1]).range([0, d.length - 1 ]))
for (let j = 0; j < pointsHowmany; j++) {
let w = streams.map((s, k) => streams[k][Math.round(scales[k](j))])
streamXYZ.push(w)
}
}
return streamXYZ
}
props.interlace = props.interlink
props.arywinopen = (x0, x1, dx) => {
let epsilon = 1e-5
let xx = []
let mx = Math.max(Math.abs(x0), Math.abs(x1)) - epsilon
let mt = Math.ceil(mx / dx)
for (let i = -mt; i < mt; i++) { if (x0 < i * dx && i * dx < x1) { xx.push(i * dx) } }
return xx
}
props.arywinclosed = (x0, x1, dx) => [x0, ...props.arywinopen(x0, x1, dx), x1]
/***************************
* @complex
*/
props.zcoef = (rad, ang) => Complex({ re: rad * Math.cos(ang), im: rad * Math.sin(ang) })
/***************************
* @functions
*/
props.v = (d, ...p) => (typeof d === 'function') ? d(...p) : d
props.f = d => (typeof (d) === 'function') ? d : () => d
props.clone = d => {
let clone = {}
if (typeof d === 'object') clone = props.cloneObj(d)
else if (array.isArray(d)) clone = props.cloneArray(d)
return clone
}
/***************************
* @objects
*/
props.isPureObject = d => typeof d === 'object' &&
d.getOwnPropertyNames.reduce((prev, curr) => prev && typeof d.curr !== 'object' && typeof d.curr !== 'function', true)
// https://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object
props.o = obj => {
if (obj == null || typeof obj !== 'object') return obj
let copy = obj.constructor()
for (let attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]
}
return copy
}
// http://heyjavascript.com/4-creative-ways-to-cloneObj-objects/
props.cloneObj = function (obj) {
if (obj === null || typeof obj !== 'object') {
return obj
}
let temp = obj.constructor() // give temp the original obj's constructor
for (let key in obj) {
temp[key] = props.cloneObj(obj[key])
}
return temp
}
// http://adripofjavascript.com/blog/drips/object-equality-in-javascript.html
props.isSame = function (a, b) {
let ret = false
if (a !== undefined && b !== undefined) {
var aProps = Object.getOwnPropertyNames(a)
var bProps = Object.getOwnPropertyNames(b)
if (aProps.length != bProps.length) {
return false
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i]
if (a[propName] !== b[propName]) {
return false
}
}
ret = true
}
return ret
}
/***************************
* @paths
*/
props.diagonalp = function (d, v) { // error: d is undefined
// v < 0: linear link
// 0 < v < 1: curved link
// > 1: curvy link
let s = d.source
let t = d.target
let x0 = s.x // s.stace.stateA // s.x
let y0 = s.y // s.stace.stateB //s.y
let x1 = t.x // t.stace.stateA //t.x
let y1 = t.y // t.stace.stateB //t.y
if ((x0 === undefined) ||
(y0 === undefined) ||
(x1 === undefined) ||
(y1 === undefined)) {
console.log('error in diagonal')
return null
}
let polygon = []
if (v < 0) { // linar
polygon = [ [x0, y0],
[x1, y1]
]
} else if (v > 1) { // (1, ) curvy
let rd = 1 + d3.randomNormal(0, v - 1)() // v
polygon = [ [x0, y0],
[x0 + rd * (x1 - x0), y0],
[x0 + rd * (x1 - x0), y1],
[x1, y1]
]
} else { // (0,1) curve
let rd = 1 + d3.randomNormal(0, v)() // v
let r = -1 // let r = Math.sign((0.5 - Math.random()))
let x0a = x0 + r * rd * (x1 - x0)
let y0a = y0 - r * rd * (y1 - y0)
polygon = [
[x0, y0],
[x0a, y0a],
[x1, y1]
]
}
return polygon
}
props.closerange = (a, b) => [...d3.range(a, b), a]
props.geoscale = extent => d3.scaleLinear().domain(extent[0]).range(extent[1])
props.addarray = (a1, a2) => a1.map((d, i) => d + a2[i])
props.sum = (a, t) => a.reduce((p, c) => c[t] + p, 0)
props.add = (a, t) => a.reduce((p, c) => c + p, 0)
props.summa = (fns) => fns.reduce((fncurr, fnprev) => {
return t => props.lib.functor(fncurr)(t) + props.lib.functor(fnprev)(t)
}, t => 0)
props.fa = d => { // force array
let ret
if (Array.isArray(d)) ret = d
else if (d === null) ret = []
else if (d === undefined) ret = []
else if (typeof d === 'object') ret = Object.values(d)
else ret = d
return props.a(ret)
}
props.norma = function norma (pts = []) {
let m = Math.max(...pts)
let c = 1 / m
let r = pts.map(p => p * c)
return r
}
props.ta = d => (Array.isArray(d)) ? d.map(di => [[ di ]]) : [[ d ]] // to tripleArray
props.posInStream = function (rpos, stream) { // pos from rel-pos in stream
let pos
let unidimLength = stream.length
pos = Math.round(rpos * unidimLength / 100)
pos = (pos >= 0) ? pos % unidimLength : (pos + unidimLength) % unidimLength
return pos
}
props.geoscale = extent => d3.scaleLinear().domain(extent[0]).range(extent[1])
props.closerange = (a, b) => [...d3.range(a, b), a]
props.isPureObject = d => (!Array.isArray(d) &&
typeof d === 'object' &&
Object.keys(d).reduce((p, c) => p && (typeof d[c] !== 'object'), true)
)
props.isObject = d => (typeof d === 'object' && Array.isArray(d) === false)
props.isArray = d => Array.isArray(d)
props.isString = d => typeof (d) === 'string'
props.isNumber = d => typeof (d) === 'number'
props.isFunction = d => typeof (d) === 'function'
props.functor = d => (typeof (d) === 'function') ? d : d => d
props.constant = v => (typeof v === 'function') ? v() : v
props.value = v => (typeof v === 'function') ? v() : v
props.noop = () => {}
/***************************
* @colors
*/
props.colors = {} // colors
props.colors.scales = {
snow: d3.scaleLinear().domain([0, 0.33, 0.66, 1]).range(['#3e2707', '#8e5e0b', '#f8a413', '#E1E7E4']), // brown orange ambar ice
bos: d3.scaleLinear().domain([0, 0.5, 1]).range(['black', '#FF2400', 'Wheat']), // ex 0
wheat: d3.scaleLinear().domain([0, 0.5, 1]).range(['black', 'Wheat', '#FF2400']), // 1
red: d3.scaleLinear().domain([0, 0.5, 1]).range(['#FF2400', 'Yellow']), // 2
ry: d3.scaleLinear().domain([0, 1]).range(['red', 'yellow']), // 3
bar: d3.scaleLinear().domain([0, 0.5, 1]).range(['black', '#FF2400', 'Yellow']), // 4
lab: d3.interpolateLab('#FF2400', 'yellow'), // 5
hsl: d3.interpolateLab('brown', 'steelblue'), // 6
rbl: d3.interpolateLab('red', 'blue'), // 7
plasma: d3.interpolatePlasma, // 8
cool: d3.interpolateCool, // 9
warm: d3.interpolateWarm, // 10
magma: d3.interpolateMagma, // 11
inferno: d3.interpolateInferno, // 12
viridis: d3.interpolateViridis, // 13
cubehelex: d3.interpolateCubehelexDefault, // 14
rainbow: d3.interpolateRainbow, // 15
bluered: d3.scaleLinear().domain([0, 0.5, 1]).range(['blue', 'Wheat', 'red' ]),
blueblack: d3.scaleLinear().domain([0, 0.5, 1]).range(['blue', 'Wheat', 'black' ]) // "red",]) // 0
}
props.colors.color = props.colors.scales.bos
props.colors.array = Object.keys(props.colors.scales).map(key => props.colors.scales[key])
props.color = (d = 0) => {
return props.colors.array[Math.round(d)]
}
props.kolor = (v, d = 0) => {
return props.color(d)(v / 1000)
}
props.polarize = function (point) { // cart to 2d planar
let x = point[0]
let y = point[1]
let ang = Math.atan2(y, x)
let rad = Math.sqrt(x * x + y * y)
return [ang, 0, rad]
}
/***************************
* @numbers
*/
props.grouplinear = d => n => Math.ceil(n / d)
props.groupgeometric = d => n => Math.ceil(n ** (1 / d))
/***************************
* @streams
*/
props.streamRange = function (pts, pa = 0, pb = -1, step = 1, fas = 0) {
// for (let k in params) params[k] = value(params[k])
// + clockwise, - counter-clockwise
// [-0,-1] := [359,0] // [0,360] _e_
// [-300,120] := -[300, 0], -[0,120]
let neg = x => x < 0 || (x === 0 && (1 / x < 0))
let pos = x => x > 0 || (x === 0 && (1 / x > 0))
let ptsLength = pts.length // group order assume positive
let intA = Math.round(pa)
let intB = Math.round(pb)
let posA = Math.abs(intA)
let posB = Math.abs(intB)
let posmodA = Math.floor(posA % ptsLength)
let posmodB = Math.floor(posB % ptsLength)
let modStep = Math.floor(step)
let ret = []
if (intA === intB) {
let p = intA % ptsLength // pt in group
ret.push(pts[p])
} else if (intB < 0) { // neg B is nb. of cycles
for (let i = 1; i <= posB; i++) ret = ret.concat(pts.slice(posA, ptsLength))
ret = ret.concat(pts.slice(posA, Math.floor(ptsLength * (posB % 1)))) // fraction
if (neg(intA)) ret = props.immutableReverse(ret)
} else if (posA < posB) {
if (posmodA < posmodB) {
ret = ret.concat(pts.slice(posmodA, posmodB + 1)) // +1 position
.filter((d, i) => (i % modStep === 0)) // step
} else {
ret = ret.concat(
pts.slice(posmodA, ptsLength),
pts.slice(0, posmodB))
}
if (neg(intA)) ret = props.immutableReverse(ret)
} else if (posA > posB) { // _e_
if (neg(intA)) {
ret = ret.concat(pts.slice(posA, ptsLength))
ret = ret.concat(pts.slice(0, posB))
ret = props.immutableReverse(ret)
} else {
let rpts = props.immutableReverse(pts)
ret = props.streamRange(rpts, pts.length - posA, pts.length - posB)
}
}
return ret
}
/***************************
* @fibonacciSphere
*/
props.cartesian = function (spherical) {
let radians = Math.PI / 180
let lambda = spherical[0] * radians,
phi = spherical[1] * radians,
cosphi = Math.cos(phi)
return [
Math.cos(lambda) * cosphi,
Math.sin(lambda) * cosphi,
Math.sin(phi)
]
}
props.spherical = function (cartesian) {
let radians = Math.PI / 180
let r = Math.sqrt(cartesian[0] * cartesian[0] + cartesian[1] * cartesian[1]),
lat = Math.atan2(cartesian[2], r),
lng = Math.atan2(cartesian[1], cartesian[0])
return [lng / radians, lat / radians]
}
props.mapline = function (Positions, Verts) {
return Verts
.map(function (v) {
return props.spherical(Positions[v])
})
}
props.fibonacciSphere = function fibonacciSphere (samples = 1, randomize = true) {
let rnd = 1.0
if (randomize) {
rnd = Math.random() * samples
}
const offset = 2.0 / samples
const increment = Math.PI * (3.0 - Math.sqrt(5.0))
let r = d3.range(samples)
.map((i) => {
const y = ((i * offset) - 1) + (offset / 2)
const r = Math.sqrt(1 - Math.pow(y, 2))
const phi = ((i + rnd) % samples) * increment
const x = Math.cos(phi) * r
const z = Math.sin(phi) * r
return ([x, y, z])
})
return r
}
/***************************
* @strings
*/
props.d = function (precision) {
return function (value) {
var multiplier = Math.pow(10, precision || 0)
return Math.round(value * multiplier) / multiplier
}
}
props.strToJson = d => JSON.stringify(test.replace(/\n|\r/g, ' ').split(' ').map(d => d.split(',').map(p => Number.parseFloat(p))))
props.format2 = d => d.map(p => p ? +p.toFixed(2) : p)
/***************************
* @obj
* entry from list and index
*/
props.enxs = function (obj, objs, objidx = 0) {
let ret
if (obj !== undefined) { // if obj singular
ret = obj // .map(d => Math.round(d))
} else if (objs !== undefined) { // if plural
if (typeof objidx === 'number') ret = objs[Math.round(objidx)] // get one
else if (Array.isArray(objidx)) ret = objidx.map(d => objs[Math.round(d)]) // get some
}
return ret
}
props.objxx = function (obj, objs, objidx = 0, arr) {
let _obj = arr[obj]
let _objs = arr[objs]
let _objidx = arr[objidx]
return props.enxs(_obj, _objs, _objidx)
}
/***************************
* @positions
*/
props.isPosition = obj => Object.getOwnPropertyNames(obj).reduce((p, q) =>
p &&
(q === 'x' || q === 'y' || q === 'z') &&
typeof obj[q] === 'number'
, true)
props.debug = () => [].join.call(arguments, '\n')
/******************
* reticule
*/
props.reticule = function (ret = []) {
let retAng = ret[0]
let retRad = ret[1]
let ccs =
d3.range(retRad[0], retRad[1], retRad[2]) // range rad
.map(ro =>
d3.range(retAng[0], retAng[1] + epsilon, retAng[2]) // range ang - +epsilon
.map(t => [ro * Math.cos(t * Math.PI / 180), ro * Math.sin(t * Math.PI / 180)]))
let rrs =
d3.range(retAng[0], retAng[1], retAng[2])
.map(fi =>
d3.range(retRad[0], retRad[1], retRad[2])
.map(t => [t * Math.cos(fi * Math.PI / 180), t * Math.sin(fi * Math.PI / 180)]))
return { ccs, rrs }
}
/***************************
* @enty
*/
let enty = props
return enty
}
exports.muonProps = muonProps
}))
const d3 = require('./d3.v5.js')
global.d3 = d3
const requiredprops = require('./muon-props.js')
let mprops = requiredprops.muonProps()
test('test tst', () => {
expect(mprops.tst(2,3)).toBe(5);
})
/***********
* @muonQuad
*/
// http://bl.ocks.org/mbostock/cd52a201d7694eb9d890 Voronoi Topology
// http://bl.ocks.org/mbostock/8027835 Closest Point on Path II
// http://bl.ocks.org/mbostock/d1d81455dc21e10f742f Voronoi Circles
// http://bl.ocks.org/mbostock/6a53ca8427a0bc2d4cf1 Circle in Sector
// http://bl.ocks.org/mbostock/6224050 Mitchell�s Best-Candidate
// http://bl.ocks.org/mbostock/4218871 Circle-Polygon Intersection
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonQuad = global.muonQuad || {})))
}(this, function (exports) {
'use strict'
let muonQuad = function (__mapper) {
let props = __mapper('xs').m('props')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let rdn = () => Math.random()
let x0 = 0, y0 = 0, x1 = width, y1 = height
let extent = [[x0 - 1, y0 - 1], [x1 + 1, y1 + 1]]
let d0 = d => d[0]
let d1 = d => d[1]
let quad = d3.quadtree()
.x(d0)
.y(d1)
.extent(extent)
/****
* @findmanyothers = function(x, y, r=Infinity, thesemany = 1, polygon = null) {
* http://stackoverflow.com/questions/217578/how-can-i-determine-whether-a-2d-point-is-within-a-polygon
*/
let findmanyothers = function (x, y, r = Infinity, thesemany = 1, polygon = null) {
let ret = []
let quadCopy = quad.copy()
let limit = Math.min(thesemany, quadCopy.data().length)
let found = 0
while (found < limit) {
let p = quadCopy.find(x, y, r)
if (p == null) {
break
} else {
let px = p.x
let py = p.y
let dist = (px - x) * (px - x) + (py - y) * (py - y)
if (dist > 1.e-6) {
let isin = true
if (polygon) isin = d3.polygonContains(polygon, [px, py])
if (isin) {
ret.push(p)
++found
}
}
quadCopy.remove(p)
}
}
return ret
}
/****
* @findmany = function(x, y, r=Infinity, thesemany = 1)
*/
let findmany = function (x, y, r = Infinity, thesemany = 1) {
let ret = []
let quadCopy = quad.copy()
let limit = Math.min(thesemany, quadCopy.data().length)
for (let i = 0; i < limit; i++) {
let p = quadCopy.find(x, y, r)
quadCopy.remove(p)
ret.push(p)
}
return ret
}
/* ***
* best free non-overlaping spot in polygon with population
* @candysearch = function(ra2=10, polygon = null, candidates = 10, sample = 10)
* rad: non overlap area
*/
let candysearch = function (rad = 10, ring = null, candidates = 10, sample = 10, goal = 10) {
let mols = []
let extent = quad.extent()
let frame = (ring) ? __mapper('xs').m('geom').polygonExtent(ring) : extent
let x0 = frame[0][0], y0 = frame[0][1], x1 = frame[1][0], y1 = frame[1][1]
let tx = x1 - x0
let ty = y1 - y0
for (let i = 0; i < sample; i++) {
let c = [x0 + rdn() * tx, y0 + rdn() * ty]
let z2 = 0 // current best Distance
let k = null // current better kandidate
let dx = 0, dy = 0, p = null
if (ring === null || d3.polygonContains(ring, c)) {
for (let j = 0; j < candidates; ++j) {
p = c
k = quad.find(p[0], p[1], rad) // find within rad
if (k) { // if there is someting within rad
dx = p[0] - k[0], dy = p[1] - k[1] // vector from candy to seed
let d2 = dx * dx + dy * dy // distance from candidate to closest
if (d2 > z2) {
p = [k[0], k[1]], z2 = d2 // k offers z2
}
} else {
quad.add(p) // add selected point
mols.push(p) // return selected point
break
}
}
}
if (mols.length >= goal) break
}
return mols
}
/****
* @seeds
*/
let seeds = function (polygon, sample = 10, tries = 10, dst = Infinity) {
let extent = __mapper('xs').m('geom').polygonExtent(polygon)
let centroid = __mapper('xs').m('geom').extentCentroid(extent)
let edges = __mapper('xs').m('geom').extentEdges(extent)
let nodes = []
for (let i = 0; i < tries; i++) {
if (nodes.length >= sample) {
break
} else {
let other = d3.range(sample).map(d =>
[extent[0][0] + Math.random() * edges[0], extent[0][1] + Math.random() * edges[1]])
.filter(p => __mapper('xs').m('geom').pointInPolygon(p[0], p[1], polygon))
nodes = nodes.concat(other).slice(0, sample)
}
}
return nodes
}
/***************************
* @enty
*/
let enty = function () {}
enty.findmanyothers = findmanyothers
enty.findmany = findmany
enty.candysearch = candysearch
enty.seeds = seeds
enty.extent = _ => (arguments.length) ? (extent = _, enty) : extent
return enty
}
exports.muonQuad = muonQuad
}))
/***********
* @muonQuaternion
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonQuaternion = global.muonQuaternion || {})))
}(this, function (exports) {
'use strict'
/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/
// md: # md:{filename}
// md: ** **
// md:
// md:
// md: # license
// md: MIT
var muonQuaternion = function (__mapper = {}) {
let f = __mapper('xs').m('props')
let props = {}
props.type = 'Camera'
props.projection = null
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let state = {}
// ............................. enty
let enty = function ( x, y, z, w ) {
state._x = x || 0;
state._y = y || 0;
state._z = z || 0;
state._w = ( w !== undefined ) ? w : 1;
}
enty.prototype = {
x: _ => { return _ !== undefined ? (state.x = _, enty) : state.x },
y: _ => { return _ !== undefined ? (state.y = _, enty) : state.y },
z: _ => { return _ !== undefined ? (state.z = _, enty) : state.z },
w: _ => { return _ !== undefined ? (state.w = _, enty) : state.w },
set: function ( x, y, z, w ) {
this._x = x;
this._y = y;
this._z = z;
this._w = w;
this.onChangeCallback();
return this;
},
clone: function () {
return new this.constructor( this._x, this._y, this._z, this._w );
},
copy: function ( quaternion ) {
this._x = quaternion.x;
this._y = quaternion.y;
this._z = quaternion.z;
this._w = quaternion.w;
this.onChangeCallback();
return this;
},
setFromEuler: function ( euler, update ) {
if ( euler instanceof THREE.Euler === false ) {
throw new Error( 'THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );
}
// http://www.mathworks.com/matlabcentral/fileexchange/
// 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
// content/SpinCalc.m
var c1 = Math.cos( euler._x / 2 );
var c2 = Math.cos( euler._y / 2 );
var c3 = Math.cos( euler._z / 2 );
var s1 = Math.sin( euler._x / 2 );
var s2 = Math.sin( euler._y / 2 );
var s3 = Math.sin( euler._z / 2 );
var order = euler.order;
if ( order === 'XYZ' ) {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if ( order === 'YXZ' ) {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
} else if ( order === 'ZXY' ) {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if ( order === 'ZYX' ) {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
} else if ( order === 'YZX' ) {
this._x = s1 * c2 * c3 + c1 * s2 * s3;
this._y = c1 * s2 * c3 + s1 * c2 * s3;
this._z = c1 * c2 * s3 - s1 * s2 * c3;
this._w = c1 * c2 * c3 - s1 * s2 * s3;
} else if ( order === 'XZY' ) {
this._x = s1 * c2 * c3 - c1 * s2 * s3;
this._y = c1 * s2 * c3 - s1 * c2 * s3;
this._z = c1 * c2 * s3 + s1 * s2 * c3;
this._w = c1 * c2 * c3 + s1 * s2 * s3;
}
if ( update !== false ) this.onChangeCallback();
return this;
},
setFromAxisAngle: function ( axis, angle ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
// assumes axis is normalized
var halfAngle = angle / 2, s = Math.sin( halfAngle );
this._x = axis.x * s;
this._y = axis.y * s;
this._z = axis.z * s;
this._w = Math.cos( halfAngle );
this.onChangeCallback();
return this;
},
setFromRotationMatrix: function ( m ) {
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var te = m.elements,
m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],
m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],
m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],
trace = m11 + m22 + m33,
s;
if ( trace > 0 ) {
s = 0.5 / Math.sqrt( trace + 1.0 );
this._w = 0.25 / s;
this._x = ( m32 - m23 ) * s;
this._y = ( m13 - m31 ) * s;
this._z = ( m21 - m12 ) * s;
} else if ( m11 > m22 && m11 > m33 ) {
s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
this._w = ( m32 - m23 ) / s;
this._x = 0.25 * s;
this._y = ( m12 + m21 ) / s;
this._z = ( m13 + m31 ) / s;
} else if ( m22 > m33 ) {
s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
this._w = ( m13 - m31 ) / s;
this._x = ( m12 + m21 ) / s;
this._y = 0.25 * s;
this._z = ( m23 + m32 ) / s;
} else {
s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
this._w = ( m21 - m12 ) / s;
this._x = ( m13 + m31 ) / s;
this._y = ( m23 + m32 ) / s;
this._z = 0.25 * s;
}
this.onChangeCallback();
return this;
},
setFromUnitVectors: function () {
// http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final
// assumes direction vectors vFrom and vTo are normalized
var v1, r;
var EPS = 0.000001;
return function ( vFrom, vTo ) {
if ( v1 === undefined ) v1 = new THREE.Vector3();
r = vFrom.dot( vTo ) + 1;
if ( r < EPS ) {
r = 0;
if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {
v1.set( - vFrom.y, vFrom.x, 0 );
} else {
v1.set( 0, - vFrom.z, vFrom.y );
}
} else {
v1.crossVectors( vFrom, vTo );
}
this._x = v1.x;
this._y = v1.y;
this._z = v1.z;
this._w = r;
this.normalize();
return this;
};
}(),
inverse: function () {
this.conjugate().normalize();
return this;
},
conjugate: function () {
this._x *= - 1;
this._y *= - 1;
this._z *= - 1;
this.onChangeCallback();
return this;
},
dot: function ( v ) {
return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
},
lengthSq: function () {
return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
},
length: function () {
return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
},
normalize: function () {
var l = this.length();
if ( l === 0 ) {
this._x = 0;
this._y = 0;
this._z = 0;
this._w = 1;
} else {
l = 1 / l;
this._x = this._x * l;
this._y = this._y * l;
this._z = this._z * l;
this._w = this._w * l;
}
this.onChangeCallback();
return this;
},
multiply: function ( q, p ) {
if ( p !== undefined ) {
console.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );
return this.multiplyQuaternions( q, p );
}
return this.multiplyQuaternions( this, q );
},
multiplyQuaternions: function ( a, b ) {
// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
var qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;
var qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;
this._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;
this._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;
this._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;
this._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;
this.onChangeCallback();
return this;
},
slerp: function ( qb, t ) {
if ( t === 0 ) return this;
if ( t === 1 ) return this.copy( qb );
var x = this._x, y = this._y, z = this._z, w = this._w;
// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
var cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;
if ( cosHalfTheta < 0 ) {
this._w = - qb._w;
this._x = - qb._x;
this._y = - qb._y;
this._z = - qb._z;
cosHalfTheta = - cosHalfTheta;
} else {
this.copy( qb );
}
if ( cosHalfTheta >= 1.0 ) {
this._w = w;
this._x = x;
this._y = y;
this._z = z;
return this;
}
var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );
if ( Math.abs( sinHalfTheta ) < 0.001 ) {
this._w = 0.5 * ( w + this._w );
this._x = 0.5 * ( x + this._x );
this._y = 0.5 * ( y + this._y );
this._z = 0.5 * ( z + this._z );
return this;
}
var halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );
var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,
ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;
this._w = ( w * ratioA + this._w * ratioB );
this._x = ( x * ratioA + this._x * ratioB );
this._y = ( y * ratioA + this._y * ratioB );
this._z = ( z * ratioA + this._z * ratioB );
this.onChangeCallback();
return this;
},
equals: function ( quaternion ) {
return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
},
fromArray: function ( array, offset ) {
if ( offset === undefined ) offset = 0;
this._x = array[ offset ];
this._y = array[ offset + 1 ];
this._z = array[ offset + 2 ];
this._w = array[ offset + 3 ];
this.onChangeCallback();
return this;
},
toArray: function ( array, offset ) {
if ( array === undefined ) array = [];
if ( offset === undefined ) offset = 0;
array[ offset ] = this._x;
array[ offset + 1 ] = this._y;
array[ offset + 2 ] = this._z;
array[ offset + 3 ] = this._w;
return array;
},
onChange: function ( callback ) {
this.onChangeCallback = callback;
return this;
},
onChangeCallback: function () {}
}
return enty
}
exports.muonQuaternion = muonQuaternion
}))
/**********************
* @muonRic
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonRic = global.muonRic || {})))
}(this, function (exports) {
'use strict'
let muonRic = function muonRic (__mapper = {}) {
let props = __mapper('xs').m('props')
// ric.halo: anima type
// ric.gid: group id
// ric.cid: class id
// ric.fid: form id
// aid: anima id
// nid: number id
// uid: unique id
// delled: is deleted {0,1}
// inited: is inited {0,1}
// gelded: is gelded {0,1} - no further replication
// sort: render sort
/***************************
* @getAnigramRic
*/
let getAnigramRic = function getAnigramRic (anigram, idx = 0) {
// single item in subgroup manged by position
// 0 gid, cid, fid
// 1 gid, fid
// 2 cid, fid
let parent = anigram.payload.parent
let ric = anigram.payload.ric
ric.halo = anigram.payload.ric.halo
if (anigram.payload.ric.gid === undefined) { // no gid in anigram
ric.gid = (parent.ric.gid || 'gid') + '_' + idx // set gid by position
} else {
ric.gid = anigram.payload.ric.gid // gid defined in anigram
}
if (anigram.payload.ric.cid === undefined) { // no cid in anigram
ric.cid = parent.ric.cid + '_' + '_' + idx // cid from parent and index - larms
} else {
ric.cid = anigram.payload.ric.cid // cid set in anigram
}
let itemsInClass = __mapper('muonStore').anigrams().filter(d => d.ric.gid === ric.gid && d.ric.cid === ric.cid).length
if (anigram.payload.ric.fid === undefined) { // no fid in anigram
ric.fid = ric.cid + '_' + idx + itemsInClass
} else if (typeof anigram.payload.ric.fid === 'function') {
ric.fid = anigram.payload.ric.fid() // fid - allow for random
} else if (idx > 0) { // fid defined but multiple subanigrams in form
ric.fid = anigram.payload.ric.fid + '_' + '_' + idx // fid for multi position
} else {
ric.fid = anigram.payload.ric.fid // fid - diff by pos
}
return ric
}
/* **************************
* @enric
* ani.ric => ani.feature.pros.ric => feature.id => ani.uid
*/
let enric = function (ric = {}, anigram, json) {
if (json.type === undefined) {
console.log('type undefined')
} else if (typeof ric !== 'object') {
console.log('ric is not an object')
} else if (json.type === 'Feature') {
let _ric = JSON.parse(JSON.stringify(ric))
_ric.gid = ric.gid // ric from param ric
_ric.cid = ric.cid
_ric.fid = ric.fid
let feature = json
let properties = feature.properties || {}
if (ric.fid === undefined) _ric.fid = ric.cid // inherit cid
else if (typeof ric.fid === 'function') _ric.fid = ric.fid(i, ric, anigram)
else _ric.fid = ric.fid
properties.ric = {gid:_ric.gid
, cid:_ric.cid
, fid:_ric.fid
}
properties.uid = getuid(properties.ric)
// feature.id = properties.uid
feature.properties = properties
json = feature
} else if (json.type === 'FeatureCollection') {
let features = json.features // feature in FeatureCollection
for (let i = 0; i < features.length; i++) {
let feature = features[i] // this feature
let properties = feature.properties || {}
let _ric = JSON.parse(JSON.stringify(ric))
_ric.gid = ric.gid // ric from param ric
_ric.cid = ric.cid
_ric.fid = ric.fid
if (ric.fid === undefined) _ric.fid = ric.cid + (i || '')
else if (typeof ric.fid === 'function') _ric.fid = ric.fid(i, ric, anigram)
else _ric.fid = ric.fid + (i || '')
feature.properties.ric = _ric
feature.properties.uid = getuid(feature.properties.ric)
// feature.id = feature.properties.uid
feature.properties.nid = i
}
json.features = features
} else {
console.log('m.boform.boformer nothing done')
}
return json
}
/* **************************
* @getuid
* ani.ric => ani.feature.pros.ric => feature.id => ani.uid
*/
let getuid = function (params) {
let uid
if (typeof(params) === 'object') {
if (params.fid !== undefined) {
let ric = params
uid = ric.gid + '_' + ric.cid + '_' + ric.fid
} else if (params.ric !== undefined ) {
uid = getuid(params.ric)
} else if (params.payload !== undefined && params.payload.ric !== undefined ) {
uid = getuid(params.payload.ric)
} else if (params.properties !== undefined && params.properties.ric !== undefined ) {
uid = getuid(params.properties.ric)
}
} else if (Array.isArray(params)) {
uid = params[0] + '_' + params[1] + '_' + params[2]
} else {
console.log('uid container not supported', params)
}
return uid
}
/**********************
* @enty
*/
let enty = function enty () {}
enty.getAnigramRic = getAnigramRic // build ric from anigram, i
enty.getuid = getuid
enty.enric = enric
return enty
}
exports.muonRic = muonRic
}))
/***************************
* @muonSim
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonSim = global.muonSim || {})))
}(this, function (exports) {
'use strict'
//md: m.sim
let muonSim = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
msnap = __mapper('xs').m('snap'),
mstore = __mapper('xs').m('store'),
mgeonode = __mapper('xs').m('geonode')
let _geonode = {
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [0, 0, 0]
},
properties: {
orgen: [0, 0, 0],
velin: [0, 0, 0],
prevous: [0, 0, 0],
geodelta: [0, 0, 0]
}
}
let d3_force = d3
let sim = d3_force.forceSimulation() //
let dim = 3
// simulate
// https://bl.ocks.org/frogcat/a06132f64b7164c1b1993c49dcd9178f
// https://www.nist.gov/sites/default/files/documents/2017/05/09/d3rave_poster.pdf
// ------------------------- simConstants
function simConstants (sim, fieldProps = {}) {
let cttes = {}
cttes.alpha = (fieldProps.alpha !== undefined) ? fieldProps.alpha : sim.alpha()
cttes.alphaMin = (fieldProps.alphaMin !== undefined) ? fieldProps.alphaMin : sim.alphaMin()
cttes.alphaDecay = (fieldProps.alphaDecay !== undefined) ? fieldProps.alphaDecay : sim.alphaDecay()
cttes.alphaTarget = (fieldProps.alphaTarget !== undefined) ? fieldProps.alphaTarget : sim.alphaTarget()
cttes.velocityDecay = (fieldProps.velocityDecay !== undefined) ? fieldProps.velocityDecay : sim.velocityDecay()
return cttes
}
/* **************************
* //md: initNodes
* //md: @aniItems
* //md: @nMim
*/
function initNodes (aniItems, nDim) {
let simNodes = []
for (let i = 0, n = aniItems.length; i < n; ++i) {
let aniItem = aniItems[i]
let payload = aniItem.payload
// the geonode ports info of the simnode
let geonode
if (aniItem && aniItem.geofold && aniItem.geofold.properties) geonode = aniItem.geofold.properties.geonode
geonode = mgeonode.init(geonode)
// the simnode location is in the geonode geometry
let nodeGeometry = geonode.geometry
let simNode = {}
simNode.x = nodeGeometry.coordinates[0] // geonode location to simnode
simNode.y = nodeGeometry.coordinates[1]
simNode.z = nodeGeometry.coordinates[2]
if (simNode.x === undefined || isNaN(simNode.x)) simNode.x = 0 // location defs
if ((simNode.y === undefined || isNaN(simNode.y)) && nDim > 1) simNode.y = 0
if ((simNode.z === undefined || isNaN(simNode.z)) && nDim > 2) simNode.z = 0
// the simnode status is in the geonode properties
let properties = geonode.properties
if (properties.anchor) { // fix situs
simNode.fx = simNode.x
simNode.fy = simNode.y
simNode.fz = simNode.z
}
// the simnode velocity is in the geonode properties velin
simNode.vx = properties.velin[0] // geonode velocity to simnode
simNode.vy = properties.velin[1]
simNode.vz = properties.velin[2]
if (isNaN(simNode.vx)) simNode.vx = 0 // velocity defs
if (nDim > 1 && isNaN(simNode.vy)) simNode.vy = 0
if (nDim > 2 && isNaN(simNode.vz)) simNode.vz = 0
simNode.payload = payload // anitem payload to simnode
if (payload.id !== undefined) {
simNode.id = payload.id // simnode id from geofold.payload.id
} else {
simNode.id = payload.uid
}
if (payload.link) {
simNode.source = payload.link.source
simNode.target = payload.link.target
}
simNodes.push(simNode)
}
//md: simnodes: {x,y,z}, {vx,vy,vz}, payload, index
return simNodes
}
/***************************
* @restoreNodes
*/
function restoreNodes (simNodes, aniItems) {
let updItems = []
if (simNodes.length > 0) {
for (let i = 0; i < simNodes.length; ++i) {
let simNode = simNodes[i]
let updItem = aniItems[i] // each anitem
// make sure updItem has a geonode to get feedback from ani
if (updItem.geofold === undefined) updItem.geofold = {}
if (updItem.geofold.properties === undefined) updItem.geofold.properties = {}
if (updItem.geofold.properties.geonode === undefined) updItem.geofold.properties.geonode = {}
let geonode = updItem.geofold.properties.geonode
geonode = mgeonode.init(geonode)
geonode.properties.geodelta[0] = simNode.x - geonode.geometry.coordinates[0]
geonode.properties.geodelta[1] = simNode.y - geonode.geometry.coordinates[1]
geonode.properties.geodelta[2] = simNode.z - geonode.geometry.coordinates[2]
geonode.properties.velin[0] = simNode.vx // linear velocities
geonode.properties.velin[1] = simNode.vy
geonode.properties.velin[2] = simNode.vz
geonode.properties.prevous[0] = geonode.geometry.coordinates[0] // previous location
geonode.properties.prevous[1] = geonode.geometry.coordinates[1]
geonode.properties.prevous[2] = geonode.geometry.coordinates[2]
geonode.geometry.coordinates[0] = simNode.x // after sim location
geonode.geometry.coordinates[1] = simNode.y
geonode.geometry.coordinates[2] = simNode.z
updItem.geofold.properties.geonode = geonode
updItems.push(updItem)
}
}
//md: aftersim geofold.properties.geonode (s)
//md: coordinates
//md: properties.{geodelta, prevous, velin}
return updItems
}
/***************************
* @simulate
*/
let simulate = function (sim, aniItems = [], elapsed = 0, dim = 3) {
let aniSims = []
let numDims = 3
let aniNodes = initNodes(aniItems, dim) // < aniNodes
sim
.stop()
.numDimensions(numDims)
.nodes(aniNodes)
for (let i = 0; i < aniItems.length; i++) {
let aniItem = aniItems[i] // each anima or anigram
if (aniItem.payload.forces !== undefined) { // forces in aniItem
let forces = f.fa(aniItem.payload.forces)
for (let j = 0; j < forces.length; j++) { // for each force in aniItem
let aniForce = forces[j] // aniForce in anima.payload.forces eg. force_gravity
let cttes = simConstants(sim, aniForce.properties)
sim
.alpha(cttes.alpha)
.alphaMin(cttes.alphaMin)
.alphaDecay(cttes.alphaDecay)
.alphaTarget(cttes.alphaTarget)
.velocityDecay(cttes.velocityDecay)
.on('tick', () => {
if (aniForce.ticked !== undefined) aniForce.ticked
aniSims = restoreNodes(aniNodes, aniItems) // > aniNodes
mstore.apply({type: 'UPDATEANIMAS', caller: 'simulation', animas: aniSims})
})
if (aniForce.field !== undefined) { // field forces
let aniCompForces = aniForce.field({ // mamy to share properties
'elapsed': elapsed, // elapsed
'nodes': aniNodes, // aniNodes
'properties': aniForce.properties // snapped properties
})
for (let k = 0; k < aniCompForces.length; k++) {
let forceName = aniCompForces[k].key
let forceFunction = aniCompForces[k].force
sim.force(forceName, forceFunction) // muon or builtin force
}
}
}
}
}
sim.restart()
return aniSims
}
/***************************
* @enty
*/
let enty = function () {}
enty.sim = (_) => { if (_ === undefined) return sim; else { sim = _; return enty } }
enty.dim = (_) => { if (_ === undefined) return dim; else { dim = _; return enty } }
enty.simulate = simulate
return enty
}
exports.muonSim = muonSim
}))
/***********
* @muonSnap
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonSnap = global.muonSnap || {})))
}(this, function (exports) {
'use strict'
let muonSnap = function muonSnap (__mapper = {}) {
let f = __mapper('xs').m('props'),
mnat = __mapper('xs').m('nat'),
mlacer = __mapper('xs').m('lacer'),
mgeoj = __mapper('xs').m('geoj')
/* **********
* @snap
* value (anima), t (unit time), snap flag, parent
*/
let snap = function (v, t = 0, g = 0, p = undefined) {
// ____________________________________________________ un-tagged
if (v === null) return null // 00 _____ o
else if (typeof (v) === 'number') return v // 02 _____ num
else if (typeof (v) === 'string') return v // 03 _____ str
else if (f.isArray(v) && v.length === 0) return v // 04 _____ []
else if (typeof (v) === 'function' &&
g !== 1) {
return v // 01 _____ fn v(t)
} else if (f.isArray(v) && // 05 ____ [[ [ pure ] ]] intra array interpolation
f.isDoubleSingleArray(v) && // double array with single elem
f.isPureArray(v[0][0]) && // single elem in double array is pure
g !== 1
) {
let ws = snap(v[0][0], t, 1)
return ws
} else if (f.isObject(v) && // 06 ___ v :: {}
g !== 1) {
let r = {}
for (let y of Reflect.ownKeys(v)) {
r[y] = snap(v[y], t, g, v) // reenter object
}
return r
} else if (f.isDoubleArray(v) && // 07 [[ [ [], [] ] ]] inter arrays interpolation
f.isQuasiPureArray(v[0][0]) && // double array with array of arrays elem
v[0][0].length === 1 &&
g !== 1
) {
let na = []
for (let i = 0; i < v[0][0].length; i++) {
let comp = v[0][0][i]
let intra = snap(comp, t, 1)
na.push(intra)
}
let ws = snap(na, t, 1) // scales of internal array
return ws
} else if (f.isArray(v) && // 08a ____ [[[ fn() ]]]
f.isTripleArray(v) &&
typeof v[0][0][0] === 'function' &&
g !== 1
) {
let fn = v[0][0][0]
let ws
if (typeof p === 'object') { // if method, call as object.method
p.fn = fn
ws = snap(p.fn(t), t, 0)
} else {
ws = snap(fn, t, 1) // snap function value
}
return ws
} else if (f.isArray(v) && // 08 ____ [ [[ [ ], {} ]] ]
f.isTripleArray(v) &&
g !== 1
) {
let ws = snap(v[0][0][0], t, 1) // scales of internal array
return ws
} else if (f.isArray(v) && // 09 ____ [[[ ], {}]] // last chance for the array
g !== 1
) {
let ws = v.map(d => snap(d, t, 0))
return ws
}
// ____________________________________________________ tagged
else if (typeof (v) === 'function' && // 01 _____ fn snappable time function
g === 1) {
return snap(v(t), t, 0)
} else if (f.isObject(v) && // 10 ___ v :: {b, c, d ...}*
g === 1) { // assume nat on object
let ws
let feature = mnat.natFeature(v)
if (!mgeoj.isValid(feature)) {
console.error('gj not valid', v, feature)
}
let geometry = feature.geometry
let natRing
if (geometry.type === 'LineString') {
natRing = geometry.coordinates
} else if (geometry.type === 'MultiLineString') {
natRing = geometry.coordinates[0] // first line
} else if (geometry.type === 'Polygon') {
natRing = geometry.coordinates[0] // outer ring
} else if (geometry.type === 'MultiPolygon') {
natRing = geometry.coordinates[0][0] // outer ring of first polygon
} else {
console.error('g type not supported')
}
ws = snap(natRing, t, 1) // (13) snap [[x1,y1,z1],...,[xn,yn,zn]]
return ws
} else if (f.isArray(v) && // 11_____ [v]*
f.isPureArray(v) &&
v.length === 1 &&
g === 1) {
let d = [0, 1], r = [v[0], v[0]]
let w = d3.scaleLinear().domain(d).range(r)
return w(t)
} else if (f.isArray(v) && // 12 _____ [v1,v2,v3]*
f.isPureArray(v) &&
v.length > 1 &&
g === 1) {
let d = v.map((item, idx) => idx / (v.length - 1))
let r = v
let w = d3.scaleLinear()
.domain(d)
.range(r)
return w(t)
} else if (f.isArray(v) && // 13 _____ [[a1,a2,a3],[b1,b2]]*
f.isQuasiPureArray(v) && // => [[a1,b1],[a2,b1'],[a3,b2]]
g === 1) { // [][] dosnap qualifier
let ws = mlacer.unslide(v).filter(d => d.length > 0).map(d => snap(d, t, 1))
return ws
} else {
return v
}
}
/***********
* @enty
*/
let enty = function (v, t = 0, g = 0) {
return snap(v, t, g)
}
return enty
}
exports.muonSnap = muonSnap
}))
/***********
* @muonStace
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonStace = global.muonStace || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **manage location of aniItems**
// md:
// md: ## methods
// md: getPosInDim getPosesInDim m.liner _e_
// md:
// md: ### getSiti
// md:
// md: ### getSitus , or ani geonode
// md: ani position in the coords system
// md: in geofold.properties.geonode.geometry
// md: sim forces act on the ani geonodes
// md:
// md: ### getLoci
// md:
// md: ### getLocus , locus and transpots
// md:
// md: ### getLocifion
// md: get the uniwen projection with translate to anigram location
// md: getLocus
// md:
// md: ### getLocifier
// md: locifier(p): [x, y, z] => [x+p[0], y+p[1], z+p[2]]
// md:
// md: ### getTranspot
// md:
// md: ### getTranspots
// md: `getTranspots(stace, payload)`
// md: **get stace locations in @payload.ric**
// md: ##### parameters
// md: **stace** , may be passed as param or as payload attribute
// md: * `{x:0, y:0, z:0}`, position object
// md: * `[300,200,0]`, pure array
// md: * `[a1,a2,a3], [b1,b2]]`, pure multi array, add by dax
// md: * `[[[ {nat} ]]]`, nat form
// md: * `[{gen,ere,pro}]`, parent node position, nodeGeoformed, nodeEreformed or nodeProformed
// md: * `[{pos:0}, a2]`, if pos, parent form position
// md:
// md: if stace.<dax>.pos and no transformation property
// md: get spot from `parentani.geofold.geometry.coordinates`
// md: **payload**, to get parent coords if spot is relative to parent geometry
// md:
let muonStace = function (__mapper = {}) {
let f = __mapper('xs').m('props'),
mstore = __mapper('xs').m('store'),
mlacer = __mapper('xs').m('lacer'),
manitem = __mapper('xs').m('anitem'),
mgeoj = __mapper('xs').m('geoj')
// ..................... isValidStace
let getTranspots = function (s, ani) {
let stace = s
let payload = ani.payload
let locations = []
let valid = 0
if (stace && typeof stace === 'object') {
if (stace.x !== undefined) { // if .x then position object
stace = [ stace.x, stace.y || 0, stace.z || 0 ]
}
}
if (Array.isArray(stace)) { // stace :: [x,y,z]
stace = stace.map(d => typeof d === 'function' ? d() : d) // eval
if (f.isPureArray(stace)) { // [x,y,z] numbers
valid = 1
locations = Array.of(stace)
} else if (f.isPureMultiArray(stace)) { // sum by dim [[a1,a2,a3],[b1,b2]]
valid = 1
locations = f.interadd(stace)
} else {
let parentuid = payload.parentuid
if (2 && 2 && !parentuid) console.log(` * error: mstace.getTranspots:parentuid ${parentuid} in payload `, payload)
let parentani = mstore.findAnigramFromUid(parentuid)
if (2 && 2 && !parentani) console.log(`** error: mstace.getTranspots:parentani of ${parentuid}: ${parentani}`)
let formGeoformed = parentani.geofold.properties.formGeoformed
let formEreformed = parentani.geofold.properties.formEreformed
let formProformed = parentani.geofold.properties.formProformed
let nodeGeoformed = parentani.geofold.properties.nodeGeoformed || {geometry: {}}
let nodeEreformed = parentani.geofold.properties.nodeEreformed || {geometry: {}}
let nodeProformed = parentani.geofold.properties.nodeProformed || {geometry: {}}
let locationsPerDax = []
for (let i = 0; i < stace.length; i++) {
let staceDax = stace[i]
let v1 = staceDax
if (!v1.hasOwnProperty('pos')) { // in node
let coords = []
if (v1.hasOwnProperty('geo')) { // GEO
coords = nodeGeoformed.geometry.coordinates
} else if (v1.hasOwnProperty('ere')) { // ERE
coords = nodeEreformed.geometry.coordinates
} else if (v1.hasOwnProperty('pro')) { // PRO
coords = nodeProformed.geometry.coordinates
} else { // if pos look into geometry
coords = nodeGeoformed.geometry.coordinates
}
locationsPerDax[i] = Array.of(coords[i])
} else { // search on form
let idx = Math.floor(v1.pos)
let coords = []
if (v1.hasOwnProperty('geo')) {
coords = mgeoj.getCoords(formGeoformed.geometry)
} else if (v1.hasOwnProperty('ere')) {
coords = mgeoj.getCoords(formEreformed.geometry)
} else if (v1.hasOwnProperty('pro')) {
coords = mgeoj.getCoords(formProformed.geometry)
} else { // if pos look into geometry
coords = mgeoj.getCoords(parentani.geofold.geometry)
}
idx = (idx + coords.length) % coords.length
locationsPerDax[i] = Array.of(coords[idx][i])
}
}
if (locationsPerDax.length > 0) {
locations = mlacer.slide(locationsPerDax) // [300, 200]
}
}
}
return locations
}
// ........................ getTranspot
let getTranspot = (stace, ani) => getTranspots(stace, ani)[0]
// ........................ getSiti situs: Arary.of(ani.x, .y, .z)
let getSiti = function (anima, siti = []) {
if (anima && anima.geofold && anima.geofold.properties.geonode) {
siti = Array.of(anima.geofold.properties.geonode.geometry.coordinates)
}
return siti
}
// ........................ getSitus
let getSitus = anima => getSiti(anima)[0]
// ........................ getPosInDim
let getPosInDim = function (staceDim) {
let poses = getPosesInDim(staceDim)
return poses[0]
}
// ........................ getPosesInDim
let getPosesInDim = function (staceDim) {
let poses = null
if (typeof staceDim === 'number') {
//
} else if (typeof staceDim === 'object' && staceDim.pos !== undefined) { // staceDim pos
if (typeof staceDim.pos === 'number') { // number
poses = Array.of(staceDim.pos)
} else if (Array.isArray(staceDim.pos)) {
let dist = staceDim.dist || 0 // distance to position
let fas = staceDim.fas || 0 // phase in positions
let c0 = staceDim.pos[0] // * staceDim.length / 100 // _e_
let c1 = staceDim.pos[1] // * staceDim.length / 100 // _e_
let step = 1
let pos0 = Math.floor(c0) // first of positions array
let pos1 = Math.floor(c1) // last of positions array
if (pos0 <= pos1) {
poses = d3.range(pos0, pos1, step) // d3 create positional array
} else {
poses = d3.range(pos1, pos0, step) // d3 create positional array
}
}
}
return poses
}
// ........................ getLocsInDim
let getLocsInDim = function (staceDim, parentCoordsDim = []) {
let locations
if (typeof staceDim === 'number') {
locations = []
locations.push(staceDim)
} else if (typeof staceDim === 'object' && staceDim.pos !== undefined) { // staceDim pos
if (parentCoordsDim.length > 0) {
locations = []
if (typeof staceDim.pos === 'number') { // number
let pos = f.posInStream(staceDim.pos, parentCoordsDim)
let idx = Math.floor(pos)
let v = parentCoordsDim[idx]
locations = Array.of(v)
} else if (Array.isArray(staceDim.pos)) {
let dist = staceDim.dist || 0 // distance to position
let fas = staceDim.fas || 0 // phase in positions
let c0 = staceDim.pos[0] // * staceDim.length / 100 // _e_
let c1 = staceDim.pos[1] // * staceDim.length / 100 // _e_
let pos0 = Math.floor(c0) // first of positions array
let pos1 = Math.floor(c1) // last of positions array
let step = Math.round(staceDim.step) || 1 // step between positions
if (pos0 <= pos1) {
locations = d3.range(pos0, pos1, step) // d3 create positional array
.map(d => d + fas) // displace positions by phase
.map(d => d % parentCoordsDim.length) // mod (-1)
.map(d => Math.floor(d)) // integer position
.map(d => parentCoordsDim[d]) // location from parent coords
.map(d => d + dist) // sum dist to dim location
} else {
locations = d3.range(pos1, pos0, step) // d3 create positional array
.map(d => d + fas) // displace positions by phase
.map(d => d % parentCoordsDim.length) // mod
.map(d => Math.floor(d))
.map(d => parentCoordsDim[d])
.map(d => d + dist)
}
}
}
}
return locations
}
// ........................ getLoci
let getLoci = function (stace, ani) {
let locations = [] // default locations _e_
let situs = getSitus(ani) // anima .x,.y,.z - root and sim
let spots = getTranspots(stace, ani) // ani stace x || x.pos || x.ref
if (situs && spots && spots.length > 0) { // if situs and spots
locations = spots.map(spot => spot.map((d, i) => d + situs[i])) // transpose spots by situs
} else if (situs) { // if situs
locations = Array.of(situs) // siti
} else if (spots && spots.length > 0) { // if spots
locations = spots // locations
}
return locations
}
// ........................ getLocus
let getLocus = (stace, ani) => getLoci(stace, ani)[0]
// ........................ getLocifion
let getLocifion = function (stace, ani) {
let locus = getLocus(stace, ani)
let projection = {
'projection': 'uniwen',
'translate': [ locus[0], locus[1], locus[2] ]
}
return __mapper('xs').m('profier').formion(projection)
}
// ........................ getLocifier
let getLocifier = function (stace, ani = {}) {
let locifion = getLocifion(stace, ani)
return g => __mapper('xs').m('proj3ct')(g, locifion)
}
// ........................ enty
function enty () { return enty }
enty.getPosInDim = getPosInDim // getPosInDim
enty.getSiti = getSiti //
enty.getSitus = getSitus //
enty.getLoci = getLoci // locations
enty.getLocus = getLocus // location
enty.getLocifion = getLocifion // projection
enty.getLocifier = getLocifier // projector
enty.getTranspot = getTranspot // getTranspot
enty.getTranspots = getTranspots // getTranspots
return enty
}
exports.muonStace = muonStace
}))
/***************************
* @muonStats
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonStats = global.muonStats || {})))
}(this, function (exports) {
'use strict'
/**
* @author mrdoob / http://mrdoob.com/
* https://github.com/mrdoob/stats.js/
*/
/*******************************************
* @muonStats
*/
var muonStats = function muonStats (__mapper = {}) {
let props = __mapper('xs').m('props')
let local = {}
let width = __mapper('renderRenderport').width()
let height = __mapper('renderRenderport').height()
var enty = function () {
var mode = 0
var container = document.createElement('div')
container.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000'
container.addEventListener('click', function (event) {
event.preventDefault()
showPanel(++mode % container.children.length)
}, false)
//
function addPanel (panel) {
container.appendChild(panel.dom)
return panel
}
function showPanel (id) {
for (var i = 0; i < container.children.length; i++) {
container.children[ i ].style.display = i === id ? 'block' : 'none'
}
mode = id
}
//
var beginTime = (performance || Date).now(), prevTime = beginTime, frames = 0
var fpsPanel = addPanel(new enty.Panel('FPS', '#0ff', '#002'))
var msPanel = addPanel(new enty.Panel('MS', '#0f0', '#020'))
if (self.performance && self.performance.memory) {
var memPanel = addPanel(new enty.Panel('MB', '#f08', '#201'))
}
showPanel(0)
return {
REVISION: 16,
dom: container,
addPanel: addPanel,
showPanel: showPanel,
begin: function () {
beginTime = (performance || Date).now()
},
end: function () {
frames++
var time = (performance || Date).now()
msPanel.update(time - beginTime, 200)
if (time >= prevTime + 1000) {
fpsPanel.update((frames * 1000) / (time - prevTime), 100)
prevTime = time
frames = 0
if (memPanel) {
var memory = performance.memory
memPanel.update(memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576)
}
}
return time
},
update: function () {
beginTime = this.end()
},
// Backwards Compatibility
domElement: container,
setMode: showPanel
}
}
enty.Panel = function (name, fg, bg) {
var min = Infinity, max = 0, round = Math.round
var PR = round(window.devicePixelRatio || 1)
var WIDTH = 80 * PR, HEIGHT = 48 * PR,
TEXT_X = 3 * PR, TEXT_Y = 2 * PR,
GRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,
GRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR
var canvas = document.createElement('canvas')
canvas.width = WIDTH
canvas.height = HEIGHT
canvas.style.cssText = 'width:80px;height:48px'
var context = canvas.getContext('2d')
context.font = 'bold ' + (9 * PR) + 'px Helvetica,Arial,sans-serif'
context.textBaseline = 'top'
context.fillStyle = bg
context.fillRect(0, 0, WIDTH, HEIGHT)
context.fillStyle = fg
context.fillText(name, TEXT_X, TEXT_Y)
context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT)
context.fillStyle = bg
context.globalAlpha = 0.9
context.fillRect(GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT)
return {
dom: canvas,
update: function (value, maxValue) {
min = Math.min(min, value)
max = Math.max(max, value)
context.fillStyle = bg
context.globalAlpha = 1
context.fillRect(0, 0, WIDTH, GRAPH_Y)
context.fillStyle = fg
context.fillText(round(value) + ' ' + name + ' (' + round(min) + '-' + round(max) + ')', TEXT_X, TEXT_Y)
context.drawImage(canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT)
context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT)
context.fillStyle = bg
context.globalAlpha = 0.9
context.fillRect(GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round((1 - (value / maxValue)) * GRAPH_HEIGHT))
}
}
}
return enty
}
exports.muonStats = muonStats
}))
/***********
* @muonStore
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonStore = global.muonStore || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **manage anitems store**
// md: ## refs
// md: * `https://bl.ocks.org/mbostock/6081914 transitions`
// md: * `https://github.com/d3/d3-ease#easeElasticOut`
// md:
// md:
// md: ## methods
// md: * [apply](#apply) - adds, replace, delete anitems
// md: @action: {UPDANIMA, UPDANIGRAM}
// md: * [ween](#ween) - process anitem through halo.ween
// md: @anitem
// md: * [gramm](#gramm) - process anitem through halo.gramm
// md: manage anitem's time
// md: process anitem with anitem's halo.gramm
// md: process anitem.avatars
// md: * animasInGroupHowMany
// md: @anima
// md: return live animas in group `anima.payload.rid.gid`
// md: * animasInClassHowMany
// md: @anima
// md: return live animas in class `anima.payload.rid.cid`
// md: * findIndexFromRic
// md: @ric
// md: @list
// md: get anitem in @list by @ric {gid, cid, fid}
// md: * findIndex
// md: @anitem
// md: @list
// md: get anitem in @list by @anitem.ric {gid, cid, fid}
// md: * findByUid
// md: @anitem
// md: @list
// md: get anitem in @list by mric.getuid(@anitem)
// md: * findFromUid
// md: @uid
// md: @list
// md: get anitem in @list by @uid
// md: * findIndexAnigramFromUid
// md: * findAnigramFromUid
// md: * findAnimaFromUid
// md: * born
// md: * unborn
// md: * getAnimaByUID
// md: * animas
// md: * anigrams
// md: * animasAll
// md: * animasLive
// md: * token
// md: * getNid
// md: * getAnigramIdx
// md: * getAnigram
// md: * getAnimaIdx
// md: * getAnima
// md:
// md:
// md: # license
// md: MIT
let muonStore = function muonStore (__mapper) {
let f = __mapper('xs').m('props'),
mtim = __mapper('xs').m('tim'),
manitem = __mapper('xs').m('anitem'),
mric = __mapper('xs').m('ric')
let state = {
animas: [], // animas array
aniset: {}, // animas by uid
anigrams: [] // behavior - anigrams may have avatars
}
// .................. apply
let apply = function apply (action = {}) {
// .................. UPDANIMA
if (action.type === 'UPDANIMA') {
let updAnimas = f.fa(action.animas) // get new animas as array
let elapsed = action.elapsed || 0
for (let i = 0; i < updAnimas.length; i++) {
let updAnima = f.o(updAnimas[i]) // each new anima
let uid = (updAnima.payload.uid !== undefined) // uid
? updAnima.payload.uid
: __mapper('xs').m('ric').getuid(updAnima)
let index = enty.findFromUid(uid, state.animas)
if (index !== -1) { // anima exists
if (updAnima.payload.delled === 1) {
state.animas.splice(index, 1) // delete anima
} else {
state.animas[index] = updAnima // replace
}
} else { // new anima
updAnima.payload.tim = __mapper('xs').m('tim')(updAnima.payload.tim, elapsed) // set tim elapsed
updAnima.payload.uid = uid // set uid if new anima
updAnima.payload.nid = __mapper('xs').m('store').getNid() // node id in animas collection
state.aniset[updAnima.payload.uid] = updAnima // set new anima by uid
state.animas[state.animas.length] = updAnima // register new anima
}
}
return state.animas
}
// .................. UPDANIGRAM
if (action.type === 'UPDANIGRAM') {
let newAnigrams = f.fa(action.anigrams)
for (let i = 0; i < newAnigrams.length; i++) {
if (newAnigrams[i] !== undefined) {
let newItem = newAnigrams[i] // new anigram
let uid = newItem.payload.uid
let index = enty.findFromUid(uid, state.anigrams) // find index from d.payload.uid
if (index === -1) index = state.anigrams.length // add holder if new
state.anigrams[index] = newItem // replace anigram
}
}
return state.anigrams
}
}
// .................. ween
let ween = function (anima, newItems = []) {
let anigram = __mapper('xs').m('anitem').anigram(anima)
if (anigram.halo === undefined) console.error('halo is undefined')
if (anigram.halo === null) console.error('halo is null')
let halo = (anigram.halo !== undefined && typeof anigram.halo === 'object')
? anigram.halo // halo in anima
: __mapper('xs').h(anigram.halo) // halo in store
if (halo === null) console.log('halo ', anigram.halo, ' not found')
let weened = halo.ween(anima) // ANIMA HALO.WEEN
weened.forEach(d => { // qualify each ween
d.payload.uid = __mapper('xs').m('ric').getuid(d) // uid for children
newItems.push(d)
})
return newItems
}
// .................. gramm
let gramm = function (anima, newItems = []) {
let anigram = __mapper('xs').m('anitem').anigram(anima)
let tim = anigram.payload.tim,
elapsed = tim.elapsed,
wait = tim.wait
let newAnigrams = []
let halo // anigram halo
if (anima && (elapsed && elapsed >= wait)) { // if anima in time
halo = (anigram.halo !== undefined &&
(typeof anigram.halo === 'function' || typeof anigram.halo === 'object'))
? anigram.halo // halo in anima
: __mapper('xs').h(anigram.halo) // or halo in store
if (halo) {
newAnigrams = halo.gramm(anima) // ANIMA HALO.GRAMM
if (newAnigrams !== null && newAnigrams.length > 0) {
__mapper('xs').m('store').apply({'type': 'UPDANIGRAM', 'caller': 'm.store', 'anigrams': newAnigrams})
newItems = newItems.concat(f.a(newAnigrams))
} else {
}
} else {
console.log('halo', anigram.halo, ' not defined')
}
}
if (newItems !== undefined && newItems.length > 0) { // check if avatars in NEW animas
for (let i = 0; i < newItems.length; i++) {
let newItem = newItems[i] // each new item
if (newItem.avatars !== undefined && newItem.avatars !== null) { // AVATARS
let avatars = (typeof newItem.avatars === 'object') ? Object.values(newItem.avatars) : newItem.avatars
for (let j = 0; j < avatars.length; j++) {
let newSubItems = []
let avatar = avatars[j]
avatar.payload.uid = __mapper('xs').m('ric').getuid(avatar) // uid for children
avatar.payload.tim = anigram.payload.tim // time from anima
avatar.payload.parentuid = newItem.payload.uid // parentuid from newItem
newSubItems = enty.gramm(avatar) // AVATAR GRAMM halogram
__mapper('xs').m('store').apply({'type': 'UPDANIGRAM', 'caller': 'm.store', 'anigrams': newSubItems})
}
}
}
}
return newItems
}
// .................. enty
function enty () {}
enty.apply = apply
enty.gramm = gramm
enty.ween = ween
enty.animasInGroupHowMany = anima =>
(anima === undefined)
? 0
: enty.animasLive()
.filter(d => d.payload.ric.gid === anima.payload.ric.gid).length
enty.animasInClassHowMany = anima =>
(anima === undefined)
? 0
: enty.animasLive()
.filter(d => (d.payload.ric.gid === anima.payload.ric.gid &&
d.payload.ric.cid === anima.payload.ric.cid)).length
enty.findIndexFromRic = (ric, list) =>
list.findIndex(d =>
d.payload.ric.gid === ric.gid &&
d.payload.ric.cid === ric.cid &&
d.payload.ric.fid === ric.fid
)
enty.findIndex = (item, list) =>
enty.findIndexFromRic(item.ric, list)
enty.findByUid = (item, list) => enty.findFromUid(mric.getuid(item), list)
enty.findFromUid = (uid, list) => list.findIndex(d => d.payload.uid === uid)
enty.findIndexAnigramFromUid = uid => enty.anigrams().findIndex(d => d.payload.uid === uid)
enty.findAnigramFromUid = uid => state.anigrams.find(d => d.payload.uid === uid)
enty.findAnimaFromUid = uid => state.animas.find(d => d.payload.uid === uid)
enty.born = d => d.payload.tim !== undefined && d.payload.tim.unitElapsed !== undefined && d.payload.tim.unitElapsed > f.epsilon
enty.unborn = d => d.payload.tim === undefined && d.payload.tim.elapsed === undefined && d.payload.tim.unitElapsed === undefined && d.payload.tim.unitElapsed < f.epsilon
enty.getAnimaByUID = uid => state.animas.find(d => d.payload.uid === uid)
enty.animas = () => state.animas
enty.anigrams = () => state.anigrams
enty.animasAll = () => state.animas // animas including delled
enty.animasLive = () => state.animas.filter(d => d.delled !== 1 && d.delled !== true)
enty.token = () => state.animas.length + 1
enty.getNid = () => state.animas.length + 1
enty.getAnigramIdx = ric => enty.findIndexFromRic(ric, state.anigrams)
enty.getAnigram = ric => state.anigrams[enty.getAnigramIdx(ric)] || null
enty.getAnimaIdx = ric => enty.findIndexFromRic(ric, state.animas)
enty.getAnima = ric => state.animas[enty.getAnimaIdx(ric)] || null
return enty
}
exports.muonStore = muonStore
}))
/*******************************************
* @muonSvg
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonSvg = global.muonSvg || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: ## muons:
// md: ### m.bezierjs
// md: ## function:
// md: ### rarray
// md: ### d3range
// md: ## methods:
// md: ### castels:
// md: `msvg.castels(svgdata, frame={start:0, stop:0.90, step:0.33} )`
// md: svgdata: cubic beziers: MC...CZ
// md: frame.start: bezier interaval beginning
// md: frame.stop: bezier interval end
// md: frame.step: space between points
// md: eg: castels(svg, {start:0, stop:0.90, step:0.33}) returns 3 curve points in bezier
// md: ### castel
var muonSvg = function muonSvg (__mapper = {}) {
let mbezierjs = __mapper('xs').m('bezierjs')
let rarray = d => (Array.isArray(d)) ? [ ...d ].reverse() : [d]
// source: https://github.com/d3/d3-array/blob/master/src/range.js
// license: https://github.com/d3/d3-array/blob/master/LICENSE
let d3range = function (start, stop, step) {
start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
var i = -1,
n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
range = new Array(n);
while (++i < n) {
range[i] = start + i * step;
}
return range;
}
// ........................... castels
let castels = function(svgdata, frame={start:0, stop:0.90, step:0.33} ) {
let gj = {
type: 'Feature',
geometry: { type: 'MultiLineString', coordinates: [] },
properties: {}
}
let pathdata = []
let range = d3range(frame.start, frame.stop, frame.step)
let str = svgdata.path.d
let svgRings = str.trim().split('M').slice(1) // M C Z
let ncas = [], ringCases = []
for (let i=0; i<svgRings.length; i++) {
let svgRing = svgRings[i]
let c0 = svgRing.substring(svgRing.lastIndexOf("M")+1,svgRing.lastIndexOf("C")).split(',').map(Number)
let cn = svgRing.substring(svgRing.lastIndexOf("C")+1,svgRing.lastIndexOf("Z"))
if (cn.charAt(0) === 'i') {
cn = cn
.substring(1).trim()
.split(/\r?\n/)
.reverse()
.map(d => d.trim())
.map(d => d.split(' ').reverse())
.map(d => d.map(c => c.split(',').map(Number)))
.map( d => d.reduce( (p,q) => [...p, ...q] ,[])) //
} else {
cn = cn
.split(/\r?\n/)
.map(d => d.trim())
.map(d => d.split(' '))
.map(d => d.map(c => c.split(',').map(Number)))
.map( d => d.reduce( (p,q) => [...p, ...q] ,[])) //
}
let cas = []
cas[0] = [...c0, ...cn[0]]
if (cn.length > 1) {
for (let i=0; i<cn.length-1; i++) {
cas[i+1] = [ ...cn[i].slice(-2), ...cn[i+1] ]
}
// let m = cn.length-2
// cas[m] = [ ...cn[m].slice(-2), ...cn[m+1] ] // close
// cas[m] = [ ...cn[m].slice(-2) ] // close
}
gj.geometry.coordinates.push(cas)
ringCases[i] = cas
}
for (let j=0; j< ringCases.length; j++) { // rings of knots
let ringCas = ringCases[j]
let ring = []
for (let k=0; k<ringCas.length; k++) {
let cas = ringCas[k]
let curve = new mbezierjs.Bezier(cas)
let points = []
for (let j=0; j<range.length; j++) {
let point = Object.values(curve.compute(range[j])) // each point in cast
points.push(point)
}
ring = [...ring, ...points]
}
gj.geometry.coordinates[j] = ring
}
return gj
}
// ........................... castel
let castel = function(svgdata, pathdata) {
return castels (svgdata, pathdata)[0]
}
// ........................... enty
var enty = function () {}
enty.castels = castels
enty.castel = castel
return enty
}
exports.muonSvg = muonSvg
}))
/**********************
* @muonTim
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonTim = global.muonTim || {})))
}(this, function (exports) {
'use strict'
let muonTim = function muonTim (__mapper = {}) {
let epsilon = 1e-5
/**********************
* @timing
*/
let timing = function timing (pTim, pElapsed) {
let tim = Object.assign({}, pTim)
let _tim = Object.assign({}, pTim)
if (pElapsed < 0) tim.msStart = undefined // reset
let timeunits = tim.tu || 1000 // tim.tu: time unit
let duration = tim.td // tim.td: time duration
let t0 = tim.t0 // tim.t0: time init/wait
let t1 = tim.t1 // tim.t1: time limit
let step = Math.abs(tim.t2) || 1 // tim.t2: time step
let period = Math.abs(tim.t3) || 1 // tim.t3: time period
let window = !!(tim.tw) // tim.tw: time window
let timeinverse = tim.inverse || false // tim.inverse: time direction
let common = tim.common // tim.common: shared time
let msDelta = (tim.msDelta !== undefined) ? tim.msDelta : 0 // time (ms) between ticks
let elapsed = tim.elapsed = pElapsed // abs msPassed time (ms)
let msElapsed = tim.elapsed // abs msPassed time - life (ms)
let msStart = tim.msStart // abs start time (ms)
let msPassed = tim.msPassed // rel time msPassed - life (ms)
let stopped = tim.stopped // is time stopped
let unitElapsed = tim.unitElapsed // common time elapsed (units)
let unitPassed = tim.unitPassed // rel time msPassed - life (units)
let unitStart = tim.unitStart // ref time start (common or relative) (units)
let unitTime = tim.unitTime // ref time msPassed (common or relative) (units)
let unitDelta = (tim.unitDelta !== undefined) ? tim.unitDelta : 0 // time (units) between ticks
let tp = (tim.tp !== undefined) ? tim.tp : t=>t
let tick = tim.tick // time msPassed (ticks)
let timefactor = duration / timeunits // time factor
let wait = tim.wait = Math.abs(timefactor * t0) // t0 wait
let limit = tim.limit = Math.abs(timefactor * t1) // t1 limit
let slots = tim.slots = [] // slots
let d = (window === false) ? [tim.wait, tim.limit] : [0, duration] // time window
if ((Math.sign(t0) === -1) || (Math.sign(t1) === -1)) timeinverse = true // inverse
let r = (timeinverse === false) ? [0, 1] : [1, 0] // time inversion
let timescale = d3.scaleLinear().domain(d).range(r) // timescale: scale of life
tim.msStart = tim.msStart || elapsed // -- start time (abs, ms)
tim.msElapsed = tim.elapsed // -- abs time elapsed (abs, ms)
tim.msPassed = tim.elapsed - tim.msStart // -- relative time msPassed (abs, ms)
tim.msDelta = tim.elapsed - _tim.elapsed // -- time msPassed (abs, ms) between ticks
tim.stopped = 1 // -- time is stopped
let elapsedInPeriod = (period > epsilon) ? ((tim.elapsed % (duration / period)) * period) : elapsed
let unitTimeElapsedInPeriod = timescale(elapsedInPeriod) // abs elapsed time in period (units)
let elapsedstep = Math.round(elapsed / step) // elapsedstep
if ((wait <= elapsed) && (elapsed <= limit) && (slots.indexOf(elapsedstep) !== null)) {
slots.push(elapsedstep)
tim.unitElapsed = unitTimeElapsedInPeriod // TimeElapsedInPeriod (units)
}
let passedInPeriod = (period > epsilon) ? ((tim.msPassed % (duration / period)) * period) : tim.msPassed
let unitTimePassedInPeriod = timescale(passedInPeriod) // rel msPassed time in period (units)
let passedstep = Math.round(tim.msPassed / step) // passedstep
if ((wait <= tim.msPassed) && (tim.msPassed <= limit) && (slots.indexOf(passedstep) !== null)) {
slots.push(passedstep)
tim.unitPassed = unitTimePassedInPeriod // TimePassedInPeriod (units)
}
tim.unitDelta = tim.unitPassed - _tim.unitPassed // -- time units between ticks
tim.unitTime = (common !== undefined) ? tim.unitElapsed : tim.unitPassed // time (units)
tim.unitTime = tp(tim.unitTime)
tim.msTime = (common !== undefined) ? tim.msElapsed : tim.msPassed // time (ms)
if (tim.unitTime !== null) { // do not start yet if no unitTime
tim.stopped = 0 // -- time unstopped
tim.unitStart = tim.unitStart || tim.unitTime // -- time started (units)
tim.tick = (tim.tick === undefined) ? 0 : tim.tick + 1 // -- time tick
}
return tim
}
/**********************
* @enty
*/
let enty = (pTim, pElapsed) => timing(pTim, pElapsed)
return enty
}
exports.muonTim = muonTim
}))
/***************************
* @muonTimer
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonTimer = global.muonTimer || {})))
}(this, function (exports) {
'use strict'
// copyright mbostock
// https://github.com/d3/d3-timer/blob/master/src/timer.js
let muonTimer = function muonTimer (__mapper = {}) {
let props = __mapper('xs').m('props')
let frame = 0, // is an animation frame pending?
timeout = 0, // is a timeout pending?
interval = 0, // are any timers active?
pokeDelay = 1000, // how frequently we check for clock skew
taskHead,
taskTail,
clockLast = 0,
clockNow = 0,
clockSkew = 0,
clock = typeof performance === 'object' && performance.now ? performance : Date,
setFrame = typeof window === 'object' && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (f) { setTimeout(f, 17) }
let now = function now () {
return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew)
}
function clearNow () {
clockNow = 0
}
let timer = function timer (callback, delay, time) {
let t = new Timer()
t.restart(callback, delay, time)
return t
}
let timerFlush = function timerFlush () {
now() // Get the current time, if not already set.
++frame // Pretend we’ve set an alarm, if we haven’t already.
let t = taskHead, e
while (t) {
if ((e = clockNow - t._time) >= 0) t._call.call(null, e)
t = t._next
}
--frame
}
let Timer = function Timer () {
this._call =
this._time =
this._next = null
}
Timer.prototype = timer.prototype = {
constructor: Timer,
restart: function (callback, delay, time) {
if (typeof callback !== 'function') throw new TypeError('callback is not a function')
time = (time == null ? now() : +time) + (delay == null ? 0 : +delay)
if (!this._next && taskTail !== this) {
if (taskTail) taskTail._next = this
else taskHead = this
taskTail = this
}
this._call = callback
this._time = time
sleep()
},
stop: function () {
if (this._call) {
this._call = null
this._time = Infinity
sleep()
}
},
resume: function (callback, delay, time) { // _e_
// _e_ move delay :: restartTime back on rist resume
if (typeof callback !== 'function') throw new TypeError('callback is not a function')
time = (time == null ? now() : time) + (delay == null ? 0 : +delay)
if (!this._next && taskTail !== this) {
if (taskTail) taskTail._next = this
else taskHead = this
taskTail = this
}
this._call = callback
this._time = time
sleep()
}
}
function wake () {
clockNow = (clockLast = clock.now()) + clockSkew
frame = timeout = 0
try {
timerFlush()
} finally {
frame = 0
nap()
clockNow = 0
}
}
function poke () {
let now = clock.now(), delay = now - clockLast
if (delay > pokeDelay) clockSkew -= delay, clockLast = now
}
function nap () {
let t0, t1 = taskHead, t2, time = Infinity
while (t1) {
if (t1._call) {
if (time > t1._time) time = t1._time
t0 = t1, t1 = t1._next
} else {
t2 = t1._next, t1._next = null
t1 = t0 ? t0._next = t2 : taskHead = t2
}
}
taskTail = t0
sleep(time)
}
function sleep (time) {
if (frame) return // Soonest alarm already set, or will be.
if (timeout) timeout = clearTimeout(timeout)
let delay = time - clockNow
if (delay > 24) {
if (time < Infinity) timeout = setTimeout(wake, delay)
if (interval) interval = clearInterval(interval)
} else {
if (!interval) clockLast = clockNow, interval = setInterval(poke, pokeDelay)
frame = 1, setFrame(wake)
}
}
/***************************
* @enty
*/
let enty = function enty () {}
enty.now = now
enty.Timer = Timer
enty.timer = timer
enty.timerFlush = timerFlush
return enty
}
exports.muonTimer = muonTimer
}))
/*******************************************
* @muonVersor
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonVersor = global.muonVersor || {})))
}(this, function (exports) {
'use strict'
// https://github.com/Fil/versor Version 0.0.3. Copyright 2017 Mike Bostock.
// ref: http://codepen.io/jorin/pen/YNajXZ
var muonVersor = function (__mapper = {}) {
let props = __mapper('xs').m('props')
var stace = Object.assign({})
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 [λ, φ, γ].
var versor = function(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, cp = cos(p);
return [cp * cos(l), cp * 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.
// alpha for tweening [0,1]
versor.delta = function(v0, v1, alpha) {
if (arguments.length == 2) alpha = 1;
var w = cross(v0, v1), l = sqrt(dot(w, w));
if (!l) return [1, 0, 0, 0];
var t = alpha * 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[0] * q1[1] + q0[1] * q1[0] + 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];
}
/*******************************************
* @add
*
*/
versor.add = function (v0, v1) {
return [v0[0] + v1[0],
v0[1] + v1[1],
v0[2] + v1[2]]
}
/*******************************************
* @enty
*
*/
var enty = () => versor
return enty
}
exports.muonVersor = muonVersor
}))
/***********
* @muonVoro
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonVoro = global.muonVoro || {})))
}(this, function (exports) {
'use strict'
// (c) 2016 Philippe Riviere
//
// https://github.com/Fil/
// https://bl.ocks.org/Fil/955da86d6a935b26d3599ca5e344fb38
//
// This software is distributed under the terms of the MIT License
// ref: https://visionscarto.net/the-state-of-d3-voronoi
let x = function (d) {
if (typeof d === 'object' && 'type' in d) {
return d3.geoCentroid(d)[0]
}
if (0 in d) return d[0]
}
let y = function (d) {
if (typeof d === 'object' && 'type' in d) {
return d3.geoCentroid(d)[1]
}
if (0 in d) return d[1]
}
var muonVoro = function muonVoro (__mapper = {}) {
let f = __mapper('xs').m('props')
let voronoi = d3.voronoi
let FindDelaunayTriangulation = __mapper('pluginDelaunay').FindDelaunayTriangulation
var enty = function () {} // enty
enty.data = function (data) {
enty._hull = enty._polygons = enty._links = enty._triangles = null
if (typeof data === 'object' && data.type == 'FeatureCollection') {
data = data.features
}
let sites = data.map(function (site, i) {
site.index = i
return site
})
let pos = data.map(function (site) {
return [x(site), y(site)]
})
enty.pos = pos
enty.sites = sites
enty.DelaunayTriang = FindDelaunayTriangulation(pos.map(f.cartesian))
return enty
}
enty.links = function (s) {
if (s) enty(s)
if (enty._links) return enty._links
var _index = map()
var features = DelaunayTriang.edges.map(function (i, n) {
_index.set(extent(i.verts), n)
var properties = {
source: enty.sites[i.verts[0]],
target: enty.sites[i.verts[1]],
urquhart: true, // will be changed to false later
length: geoDistance(pos[i.verts[0]], pos[i.verts[1]])
}
// add left and right sites (?)
// make geojson
return {
type: 'LineString',
coordinates: [ spherical(DelaunayTriang.positions[i.verts[0]]), spherical(DelaunayTriang.positions[i.verts[1]]) ],
properties: properties
}
})
// Urquhart Graph? tag longer link from each triangle
DelaunayTriang.triangles.forEach(function (t) {
var l = 0,
length = 0,
remove, v
for (var j = 0; j < 3; j++) {
v = extent([t.verts[j], t.verts[(j + 1) % 3]])
var n = _index.get(v)
length = features[n].properties.length
if (length > l) {
l = length
remove = n
}
}
features[remove].properties.urquhart = false
})
return enty._links = {
type: 'FeatureCollection',
features: features
}
}
enty.triangles = function (s) {
if (s) enty.data(s)
if (enty._triangles) return enty._triangles
var features = enty.DelaunayTriang.triangles
.map(function (t) {
t.spherical = t.verts.map(function (v) {
return enty.DelaunayTriang.positions[v]
})
.map(f.spherical)
// correct winding order
if (t.ccdsq < 0) {
t.spherical = t.spherical.reverse()
t.ccdsq *= -1
}
return t
})
// make geojson
.map(function (t) {
return {
type: 'Polygon',
coordinates: [t.spherical.concat([ t.spherical[0] ]) ],
properties: {
sites: t.verts.map(function (i) {
return enty.sites[i]
}),
area: t.vol, // steradians
circumcenter: f.spherical(t.ccdir)
// ccdsq is *not* the geodesic distance
/* circumradius: (2-t.ccdsq) * 53 */
}
}
})
return enty._triangles = {
type: 'FeatureCollection',
features: features
}
}
enty.polygons = function (s) {
if (s) enty(s)
if (enty._polygons) return enty._polygons
var features = DelaunayTriang.indices.map(function (i, n) {
var geojson = {}
var vor_poly = DelaunayTriang.vor_polygons[DelaunayTriang.indices[i]]
if (vor_poly == undefined) {
geojson.type = 'Sphere'
} else {
var line = mapline(DelaunayTriang.vor_positions,
vor_poly.boundary.concat([ vor_poly.boundary[0] ])
)
// correct winding order
var b = {
type: 'Polygon',
coordinates: [[ pos[i], line[0], line[1], pos[i] ]]
}
if (geoArea(b) > 2 * Math.PI + 1e-10) {
line = d3.line.reverse()
}
geojson.type = 'Polygon'
geojson.coordinates = [ line ]
}
geojson.properties = {
site: enty.sites[i],
sitecoordinates: pos[i],
neighbours: vor_poly.edges.map(function (e) {
return e.verts.filter(function (j) {
return j !== i
})[0]
})
}
return geojson
})
return enty._polygons = {
type: 'FeatureCollection',
features: features
}
}
enty.hull = function (s) {
if (s) enty(s)
if (enty._hull) return enty._hull
if (!DelaunayTriang.hull.length) {
return null // What is a null geojson?
}
// seems that DelaunayTriang.hull is always clockwise
var hull = DelaunayTriang.hull.reverse()
// make geojson
return enty._hull = {
type: 'Polygon',
coordinates: [ hull.concat([ hull[0] ]).map(function (i) {
return pos[i]
}) ],
properties: {
sites: hull.map(function (i) {
return enty.sites[i]
})
}
}
}
enty.x = function (f) {
if (!f) return x
x = f
return enty
}
enty.y = function (f) {
if (!f) return y
y = f
return enty
}
enty.extent = function (f) {
if (!f) return null
return enty
}
enty.size = function (f) {
if (!f) return null
return enty
}
return enty
}
exports.muonVoro = muonVoro
}))
/*******************************************
* @muonWen
*
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.muonWen = global.muonWen || {})))
}(this, function (exports) {
'use strict'
// https://github.com/wenliang-developer
// https://codepen.io/wenliang-developer/pen/gMwvXR
// https://github.com/wenliang-developer/web-developer-site
let muonWen = function muonWen (__mapper = {}) {
function clip (n, m, M) { return n < M ? n > m ? n : m : M }
function comeCloser (n, goal, factor, limit) {
return (limit && Math.abs(goal - n) < limit) ? goal : n + (goal - n) / (factor || 10)
}
function dist (a, b) {
let dx = b[0] - a[0], dy = b[1] - a[1], dz = b[2] - a[2]
return Math.sqrt(dx * dx + dy * dy + dz * dz)
}
function normalize (v) {
let l = Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2])
return [v[0] / l, v[1] / l, v[2] / l]
}
function projection (p, d, s) { // distance, focale, scale
// let f = (s || 1) / (1 - p[2] / d);
// return [p[0]*f, p[1]*f, p[2]];
let h = Array.isArray(s) ? s : Array.of(s)
let f0 = (h[0] || 1) / (1 - p[2] / d)
let f1 = (h[1] || h[0]) / (1 - p[2] / d)
return [p[0] * f0, p[1] * f1, p[2]]
}
function rotateX (p, a) {
let d = Math.sqrt(p[2] * p[2] + p[1] * p[1]),
na = Math.atan2(p[2], p[1]) + a
return [p[0], d * Math.cos(na), d * Math.sin(na)]
}
function rotateY (p, a) {
let d = Math.sqrt(p[2] * p[2] + p[0] * p[0]),
na = Math.atan2(p[0], p[2]) + a
return [d * Math.sin(na), p[1], d * Math.cos(na)]
}
function rotateZ (p, a) {
let d = Math.sqrt(p[1] * p[1] + p[0] * p[0]),
na = Math.atan2(p[1], p[0]) + a
return [d * Math.cos(na), d * Math.sin(na), p[2]]
}
function rotateMatrix (p, m) {
return [
p[0] * m[0] + p[1] * m[3] + p[2] * m[6],
p[0] * m[1] + p[1] * m[4] + p[2] * m[7],
p[0] * m[2] + p[1] * m[5] + p[2] * m[8]
]
}
function transpose33 (m) { // invert rotation
return [
m[0], m[3], m[6],
m[1], m[4], m[7],
m[2], m[5], m[8]
]
}
function rotate3dMatrix (x, y, z, a) {
let c = 1 - Math.cos(a), s = Math.sin(a)
return [
1 + c * (x * x - 1), x * y * c + z * s, x * z * c - y * s,
x * y * c - z * s, 1 + c * (y * y - 1), y * z * c + x * s,
x * z * c + y * s, y * z * c - x * s, 1 + c * (z * z - 1)
]
}
function mul33 (m, n) {
let m1 = m[0], m2 = m[1], m3 = m[2],
m4 = m[3], m5 = m[4], m6 = m[5],
m7 = m[6], m8 = m[7], m9 = m[8]
let n1 = n[0], n2 = n[1], n3 = n[2],
n4 = n[3], n5 = n[4], n6 = n[5],
n7 = n[6], n8 = n[7], n9 = n[8]
return [
m1 * n1 + m4 * n2 + m7 * n3, m2 * n1 + m5 * n2 + m8 * n3, m3 * n1 + m6 * n2 + m9 * n3,
m1 * n4 + m4 * n5 + m7 * n6, m2 * n4 + m5 * n5 + m8 * n6, m3 * n4 + m6 * n5 + m9 * n6,
m1 * n7 + m4 * n8 + m7 * n9, m2 * n7 + m5 * n8 + m8 * n9, m3 * n7 + m6 * n8 + m9 * n9
]
}
function chainMul33 (base) {
for (let i = 1, l = arguments.length; i < l; i++) { base = mul33(base, arguments[i]) }
return base
}
function dot (a, b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
}
function cross (a, b) {
return [
a[1] * b[2] - a[2] * b[1],
a[2] * b[0] - a[0] * b[2],
a[0] * b[1] - a[1] * b[0]
]
}
function sub (a, b) {
return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]
}
function add (a, b) {
return a.map((d, i) => d + b[i])
}
function matrix (rotate, rotBase = [1, 0, 0, 0, 1, 0, 0, 0, 1]) {
let mx = rotate3dMatrix(1, 0, 0, rotate[0]),
my = rotate3dMatrix(0, 1, 0, rotate[1]),
mz = rotate3dMatrix(0, 0, 1, rotate[2])
let rotMatrix = chainMul33(mx, my, mz, rotBase)
return rotMatrix
}
/* *************************
* enty
*
*/
let enty = function enty () {}
enty.clip = clip
enty.comeCloser = comeCloser
enty.dist = dist
enty.normalize = normalize
enty.projection = projection
enty.rotateX = rotateX
enty.rotateY = rotateY
enty.rotateZ = rotateZ
enty.rotateMatrix = rotateMatrix
enty.transpose33 = transpose33
enty.rotate3dMatrix = rotate3dMatrix
enty.mul33 = mul33
enty.chainMul33 = chainMul33
enty.dot = dot
enty.cross = cross
enty.sub = sub
enty.add = add
enty.matrix = matrix
return enty
}
exports.muonWen = muonWen
}))
{
"name": "d3animas",
"version": "0.0.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"acorn": {
"version": "5.5.3",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz",
"integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ=="
},
"acorn-jsx": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
"integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
"requires": {
"acorn": "3.3.0"
},
"dependencies": {
"acorn": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
"integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
}
}
},
"ajv": {
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"requires": {
"co": "4.6.0",
"fast-deep-equal": "1.1.0",
"fast-json-stable-stringify": "2.0.0",
"json-schema-traverse": "0.3.1"
}
},
"ajv-keywords": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
"integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I="
},
"ansi-escapes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
"integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
},
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
},
"ansi-styles": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
},
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"requires": {
"sprintf-js": "1.0.3"
}
},
"array-union": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
"integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
"requires": {
"array-uniq": "1.0.3"
}
},
"array-uniq": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
"integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
},
"arrify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
"integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
},
"babel-code-frame": {
"version": "6.26.0",
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
"requires": {
"chalk": "1.1.3",
"esutils": "2.0.2",
"js-tokens": "3.0.2"
},
"dependencies": {
"chalk": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"requires": {
"ansi-styles": "2.2.1",
"escape-string-regexp": "1.0.5",
"has-ansi": "2.0.0",
"strip-ansi": "3.0.1",
"supports-color": "2.0.0"
}
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"requires": {
"ansi-regex": "2.1.1"
}
}
}
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": {
"balanced-match": "1.0.0",
"concat-map": "0.0.1"
}
},
"buffer-from": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
"integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA=="
},
"caller-path": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
"integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
"requires": {
"callsites": "0.2.0"
}
},
"callsites": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
"integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
},
"chalk": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
"integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
"requires": {
"ansi-styles": "3.2.1",
"escape-string-regexp": "1.0.5",
"supports-color": "5.4.0"
},
"dependencies": {
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"requires": {
"color-convert": "1.9.1"
}
},
"supports-color": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
"integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
"requires": {
"has-flag": "3.0.0"
}
}
}
},
"chardet": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
"integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
},
"circular-json": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
"integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
},
"cli-cursor": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
"integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
"requires": {
"restore-cursor": "2.0.0"
}
},
"cli-width": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
"integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
},
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
},
"color-convert": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
"integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"concat-stream": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"requires": {
"buffer-from": "1.0.0",
"inherits": "2.0.3",
"readable-stream": "2.3.6",
"typedarray": "0.0.6"
}
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"cross-spawn": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
"integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
"requires": {
"lru-cache": "4.1.2",
"shebang-command": "1.2.0",
"which": "1.3.0"
}
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
},
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
},
"del": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
"integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
"requires": {
"globby": "5.0.0",
"is-path-cwd": "1.0.0",
"is-path-in-cwd": "1.0.1",
"object-assign": "4.1.1",
"pify": "2.3.0",
"pinkie-promise": "2.0.1",
"rimraf": "2.6.2"
}
},
"doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
"integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
"requires": {
"esutils": "2.0.2"
}
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"eslint": {
"version": "4.19.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz",
"integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==",
"requires": {
"ajv": "5.5.2",
"babel-code-frame": "6.26.0",
"chalk": "2.4.1",
"concat-stream": "1.6.2",
"cross-spawn": "5.1.0",
"debug": "3.1.0",
"doctrine": "2.1.0",
"eslint-scope": "3.7.1",
"eslint-visitor-keys": "1.0.0",
"espree": "3.5.4",
"esquery": "1.0.1",
"esutils": "2.0.2",
"file-entry-cache": "2.0.0",
"functional-red-black-tree": "1.0.1",
"glob": "7.1.2",
"globals": "11.5.0",
"ignore": "3.3.8",
"imurmurhash": "0.1.4",
"inquirer": "3.3.0",
"is-resolvable": "1.1.0",
"js-yaml": "3.11.0",
"json-stable-stringify-without-jsonify": "1.0.1",
"levn": "0.3.0",
"lodash": "4.17.10",
"minimatch": "3.0.4",
"mkdirp": "0.5.1",
"natural-compare": "1.4.0",
"optionator": "0.8.2",
"path-is-inside": "1.0.2",
"pluralize": "7.0.0",
"progress": "2.0.0",
"regexpp": "1.1.0",
"require-uncached": "1.0.3",
"semver": "5.5.0",
"strip-ansi": "4.0.0",
"strip-json-comments": "2.0.1",
"table": "4.0.2",
"text-table": "0.2.0"
}
},
"eslint-scope": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
"integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=",
"requires": {
"esrecurse": "4.2.1",
"estraverse": "4.2.0"
}
},
"eslint-visitor-keys": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
"integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
},
"espree": {
"version": "3.5.4",
"resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz",
"integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==",
"requires": {
"acorn": "5.5.3",
"acorn-jsx": "3.0.1"
}
},
"esprima": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
"integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
},
"esquery": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
"integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
"requires": {
"estraverse": "4.2.0"
}
},
"esrecurse": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
"integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
"requires": {
"estraverse": "4.2.0"
}
},
"estraverse": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
"integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
},
"esutils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
"integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
},
"external-editor": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
"integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
"requires": {
"chardet": "0.4.2",
"iconv-lite": "0.4.21",
"tmp": "0.0.33"
}
},
"fast-deep-equal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
"integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
},
"fast-json-stable-stringify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
},
"fast-levenshtein": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
},
"figures": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
"integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
"requires": {
"escape-string-regexp": "1.0.5"
}
},
"file-entry-cache": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
"integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
"requires": {
"flat-cache": "1.3.0",
"object-assign": "4.1.1"
}
},
"flat-cache": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
"integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
"requires": {
"circular-json": "0.3.3",
"del": "2.2.2",
"graceful-fs": "4.1.11",
"write": "0.2.1"
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"functional-red-black-tree": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
},
"glob": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"requires": {
"fs.realpath": "1.0.0",
"inflight": "1.0.6",
"inherits": "2.0.3",
"minimatch": "3.0.4",
"once": "1.4.0",
"path-is-absolute": "1.0.1"
}
},
"globals": {
"version": "11.5.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
"integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ=="
},
"globby": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
"integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
"requires": {
"array-union": "1.0.2",
"arrify": "1.0.1",
"glob": "7.1.2",
"object-assign": "4.1.1",
"pify": "2.3.0",
"pinkie-promise": "2.0.1"
}
},
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
"has-ansi": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
"requires": {
"ansi-regex": "2.1.1"
}
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
"iconv-lite": {
"version": "0.4.21",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
"integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
"requires": {
"safer-buffer": "2.1.2"
}
},
"ignore": {
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz",
"integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg=="
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"requires": {
"once": "1.4.0",
"wrappy": "1.0.2"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"inquirer": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
"integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
"requires": {
"ansi-escapes": "3.1.0",
"chalk": "2.4.1",
"cli-cursor": "2.1.0",
"cli-width": "2.2.0",
"external-editor": "2.2.0",
"figures": "2.0.0",
"lodash": "4.17.10",
"mute-stream": "0.0.7",
"run-async": "2.3.0",
"rx-lite": "4.0.8",
"rx-lite-aggregates": "4.0.8",
"string-width": "2.1.1",
"strip-ansi": "4.0.0",
"through": "2.3.8"
}
},
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
},
"is-path-cwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
"integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
},
"is-path-in-cwd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
"integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
"requires": {
"is-path-inside": "1.0.1"
}
},
"is-path-inside": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
"integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
"requires": {
"path-is-inside": "1.0.2"
}
},
"is-promise": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
"integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
},
"is-resolvable": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
"integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
},
"js-tokens": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
},
"js-yaml": {
"version": "3.11.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz",
"integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==",
"requires": {
"argparse": "1.0.10",
"esprima": "4.0.0"
}
},
"json-schema-traverse": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
},
"json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
},
"levn": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
"integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
"requires": {
"prelude-ls": "1.1.2",
"type-check": "0.3.2"
}
},
"lodash": {
"version": "4.17.10",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
},
"lru-cache": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
"integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
"requires": {
"pseudomap": "1.0.2",
"yallist": "2.1.2"
}
},
"mimic-fn": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": {
"brace-expansion": "1.1.11"
}
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"requires": {
"minimist": "0.0.8"
},
"dependencies": {
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
}
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"mute-stream": {
"version": "0.0.7",
"resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
"integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
},
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
"integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"requires": {
"wrappy": "1.0.2"
}
},
"onetime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
"integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
"requires": {
"mimic-fn": "1.2.0"
}
},
"optionator": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
"integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
"requires": {
"deep-is": "0.1.3",
"fast-levenshtein": "2.0.6",
"levn": "0.3.0",
"prelude-ls": "1.1.2",
"type-check": "0.3.2",
"wordwrap": "1.0.0"
}
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"path-is-inside": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
"integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
},
"pify": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
},
"pinkie": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
"integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
},
"pinkie-promise": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
"requires": {
"pinkie": "2.0.4"
}
},
"pluralize": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
},
"prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
},
"process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
},
"progress": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
"integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": {
"core-util-is": "1.0.2",
"inherits": "2.0.3",
"isarray": "1.0.0",
"process-nextick-args": "2.0.0",
"safe-buffer": "5.1.2",
"string_decoder": "1.1.1",
"util-deprecate": "1.0.2"
}
},
"regexpp": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz",
"integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw=="
},
"require-uncached": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
"integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
"requires": {
"caller-path": "0.1.0",
"resolve-from": "1.0.1"
}
},
"resolve-from": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
"integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
},
"restore-cursor": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
"integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
"requires": {
"onetime": "2.0.1",
"signal-exit": "3.0.2"
}
},
"rimraf": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"requires": {
"glob": "7.1.2"
}
},
"run-async": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
"integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
"requires": {
"is-promise": "2.1.0"
}
},
"rx-lite": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
"integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
},
"rx-lite-aggregates": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
"integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
"requires": {
"rx-lite": "4.0.8"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"semver": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
"integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
},
"shebang-command": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
"integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
"requires": {
"shebang-regex": "1.0.0"
}
},
"shebang-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"slice-ansi": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
"integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
"requires": {
"is-fullwidth-code-point": "2.0.0"
}
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"requires": {
"is-fullwidth-code-point": "2.0.0",
"strip-ansi": "4.0.0"
}
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "5.1.2"
}
},
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
"requires": {
"ansi-regex": "3.0.0"
},
"dependencies": {
"ansi-regex": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
}
}
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
},
"supports-color": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
},
"table": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz",
"integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==",
"requires": {
"ajv": "5.5.2",
"ajv-keywords": "2.1.1",
"chalk": "2.4.1",
"lodash": "4.17.10",
"slice-ansi": "1.0.0",
"string-width": "2.1.1"
}
},
"text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
},
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"requires": {
"os-tmpdir": "1.0.2"
}
},
"type-check": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
"integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
"requires": {
"prelude-ls": "1.1.2"
}
},
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"which": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
"integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
"requires": {
"isexe": "2.0.0"
}
},
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"write": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
"integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
"requires": {
"mkdirp": "0.5.1"
}
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
}
}
}
{
"name": "d3animas",
"version": "0.0.1",
"description": "space-time manyfolds",
"main": "./script-main.js",
"directories": {
"lib": ".",
"test": "."
},
"bin": {
"d3animas": "."
},
"dependencies": {
"eslint": "^4.19.1"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/sifbuilder/d3animas.git"
},
"keywords": [
"d3.js",
"three.js",
"animation"
],
"author": "sifbuilder",
"license": "MIT",
"bugs": {
"url": "https://github.com/sifbuilder/d3animas/issues"
},
"homepage": "https://github.com/sifbuilder/d3animas#readme"
}
/***********
* @renderCanvas
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.renderCanvas = global.renderCanvas || {})))
}(this, function (exports) {
'use strict'
let renderCanvas = function (__mapper = {}) {
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let state = {
width: width,
height: height
}
let canvas = d3.select('.viewframe')
.append('canvas')
.attr('id', 'canvas')
.attr('class', 'canvas')
.attr('width', width)
.attr('height', height)
.style('position', 'absolute')
.style('top', 0)
.style('left', 0)
.style('border', '1px solid lightgray')
.style('position', 'absolute; top:0px; left:0px; z-index:1')
.attr('pointer-events', 'none')
.attr('overflow', 'visible')
let context = canvas.node().getContext('2d')
// ............................. render
let render = function (elapsed, featurecollection, maxlimit) {
let features = featurecollection.features
.filter(
d => d.properties !== undefined && // req properties
d.properties.ric !== undefined // req ric
)
context.clearRect(0, 0, width, height) // clear canvas
let gitems = d3.nest() // items in scene
.key(function (d) { return d.properties.ric.gid })
.key(function (d) { return d.properties.ric.cid })
.entries(features)
for (let i in gitems) { // DOTS (seg5===0) each group gid
let gid = gitems[i].key,
citems = gitems[i].values
for (let j in citems) { // each class cid
let cid = citems[j].key // cid
let fitems = citems[j].values // fitems
let now = fitems.slice(-1)[0]
/* ................. GEOJSON FEATURE ................. */
let features = fitems
.filter(d => d.properties.sort === 'feature' || d.properties.sort === undefined) // default
if (features.length > 0) {
for (let k in features) { // DOTS (seg5===0) each group gid
let item = features[k] // feature
let feature = item // .feature
let style = item.properties.style
let geometry = feature.geometry // rings in MultiPolygon, MultiLineString
if (geometry.type === 'Point') {
} else if (geometry.type === 'MultiPolygon') {
} else if (geometry.type === 'MultiLineString') {
let coordinates = geometry.coordinates
let fillStyle = feature.properties.style.fill
let strokeStyle = feature.properties.style.stroke
let lineWidth = feature.properties.style['stroke-width']
context.beginPath()
let now = performance.now()
path(coordinates)
context.lineWidth = lineWidth
context.strokeStyle = strokeStyle
context.stroke()
context.fillStyle = fillStyle
context.fill()
context.closePath()
} else if (geometry.type === 'LineString') {
let coordinates = Array.of(geometry.coordinates)
let fillStyle = feature.properties.style.fill
let strokeStyle = feature.properties.style.stroke
let lineWidth = feature.properties.style['stroke-width']
context.beginPath()
let now = performance.now()
path(coordinates)
context.lineWidth = lineWidth
context.strokeStyle = strokeStyle
context.stroke()
context.fillStyle = fillStyle
context.fill()
context.closePath()
}
}
}
} // citems
} // gitems
} // render
// ............................. enty
let enty = function enty () {}
enty.render = render
return enty
}
exports.renderCanvas = renderCanvas
}))
/***************************
* @renderRenderport
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.renderRenderport = global.renderRenderport || {})))
}(this, function (exports) {
'use strict'
let renderRenderport = function renderRenderport (__mapper = {}) {
let f = __mapper('xs').m('props')
let margin = {top: 0, right: 0, bottom: 0, left: 0},
viewWidth = f.viewWidth || 600,
viewHeight = f.viewHeight || 400,
scaleView = Math.min(viewWidth / 2, viewHeight) / Math.PI,
width = viewWidth - margin.left - margin.right,
height = viewHeight - margin.top - margin.bottom
let prjdef = {
projection: 'uniwen',
prerotate: [0, 0, 0],
translate: [width / 2, height / 2, 0],
rotate: [0, 0, 0],
scale: [1, -1, 1],
lens: [0, 1, Infinity]
}
// ............................. enty
let enty = function () {}
enty.width = _ => (_ === undefined) ? width : (width = _, enty)
enty.height = _ => (_ === undefined) ? height : (height = _, enty)
enty.margin = _ => (_ === undefined) ? margin : (margin = _, enty)
enty.scaleView = () => scaleView
// ............................. cameraProjer
enty.cameraProjer = _ => (_ != undefined) ? __mapper('xs').g(_.projection)(_) : __mapper('xs').g(prjdef.projection)(prjdef)
// ............................. xydirs
enty.xydirs = function () {
let orig = enty.cameraProjer().invert([0, 0])
let xyvector = enty.cameraProjer().invert([1, 1])
let dirs = []
dirs[0] = Math.sign(xyvector[0] - orig[0])
dirs[1] = Math.sign(xyvector[1] - orig[1])
return dirs
}
// ............................. getPos
enty.getPos = function (signal) {
let pos
if (Array.isArray(signal)) { // coordinates
pos = [signal[0], signal[1]]
pos = enty.cameraProjer().invert(pos)
} else if (typeof signal === 'object') { // event
if (signal.touches && signal.touches.length) {
signal = signal.touches[0]
pos = [signal.x, signal.y]
pos = enty.cameraProjer().invert(pos)
} else {
pos = [signal.x, signal.y]
pos = enty.cameraProjer().invert(pos)
}
}
pos = [ pos[0], pos[1] ]
return pos
}
// ............................. projection
enty.projection = _ => _ !== undefined ? (projection = _, enty) : projection
return enty
}
exports.renderRenderport = renderRenderport
}))
/***********
* @renderSvg
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.renderSvg = global.renderSvg || {})))
}(this, function (exports) {
'use strict'
// md: # md:{filename}
// md: **render svg**
// md:
// md: The viewport is the visible area of the SVG image
// md: Default units are pixels
// md: `<svg width="600" height="400"></svg>`
// md: The svg [viewBox](http://tutorials.jenkov.com/svg/svg-viewport-view-box.html) attribute is used to redefine the viewport coordinates
// md: two first coordinates define user coordinates of upper left corner
// md: two last coordinates define user coordinates of lower right corner
// md: `<svg width="600" height="400" viewBox="0 0 50 20" >`
// md: ref: [Margin Convention](https://bl.ocks.org/mbostock/3019563)
// md: ## methods
// md: * ### svg
// md: * ### elems
// md: call `elems(payload, data, idfn)`
// md: * ### render
// md: call `render(elapsed, featurecollection, maxlimit)`
// md: gets anima.geofold's from m.animation
// md: @elapsed
// md: @featurecollection
// md: @maxlimit
let renderSvg = function (__mapper = {}) {
let f = __mapper('xs').m('props')
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height(),
background = 'black'
let state = {
width: width,
height: height,
background: background,
} // Viewport
let svglayer = d3.select('.viewframe')
.append('svg')
.attr('id', 'svglayer')
.attr('class', 'svglayer')
.style('position', 'absolute')
.attr('width', state.width)
.attr('height', state.height)
.style('top', 0)
.style('left', 0)
.style('background-color', state.background)
let svgElem = svglayer.append('rect')
.attr('id', 'svg')
.attr('class', 'svg')
.style('fill', 'transparent')
.attr('pointer-events', 'none')
.attr('overflow', 'visible')
// ............................. svg
let svg = () => d3.select('#viewframe')
// ............................. elems
let elems = function (idfyer, data = ['data'], idfn = null) {
if (d3.select('.muon-style-block').empty()) {
d3.select('head').append('style').attr('class', 'muon-style-block')
.html('')
}
if (idfyer == null) { // if null return the layer
let svgLayer = d3.select('body').selectAll('svg').data(['svg'])
.enter()
.append('svg')
.attr('class', 'svg')
.attr('id', 'svg')
.attr('width', state.width)
.attr('height', state.height)
.style('border', '1px solid lightgray')
return svgLayer
}
else if (idfyer == 'image') { // if image insert image
if (d3.select('.image').empty()) {
let img = svg.selectAll('image').data([0])
.enter()
.insert('svg:image')
.attr('xlink:href', './image.jpg')
.attr('x', '0')
.attr('y', '0')
.attr('width', state.width)
.attr('height', state.height)
return img
}
}
// manage the dom elements
else if (typeof (idfyer) === 'string') { // 'svg:g.links/path.link', data, idfn}
let parts = idfyer.split('/')
let layerpart = (parts[0]) ? parts[0] : 'svg'
let elemspart = (parts[1]) ? parts[1] : null
let layerparts = layerpart.split(':')
let parentcls = (layerparts[0]) ? layerparts[0] : 'svg'
let group = (layerparts[1]) ? layerparts[1] : 'group'
let groupparts = group.split('.')
let groupref = (groupparts[0]) ? groupparts[0] : 'g'
let layercls = (groupparts[1]) ? groupparts[1] : 'layer'
let elemsparts = (elemspart) ? elemspart.split('.') : null
let elemtype = (elemsparts && elemsparts[0]) ? elemsparts[0] : 'circle'
let elemcls = (elemsparts && elemsparts[1]) ? elemsparts[1] : 'elems'
let layerMark = d3.select(parentcls).selectAll('.' + layercls).data([layercls])
let layer = layerMark.enter().append('g')
.merge(layerMark)
.attr('class', layercls)
if (elemspart === null) {
return layer
} else {
if (!Array.isArray(data)) console.log('data is not an array')
let elemsupd = layer.selectAll('.' + elemcls)
.data(data)
let elems = elemsupd
.enter().append(elemtype)
.merge(elemsupd)
.attr('class', elemcls)
let elemsExit = elemsupd.exit().remove()
return elems
}
}
}
// ............................. render
let render = function (elapsed, featurecollection, maxlimit) {
let features = featurecollection.features
.filter(
d => d.properties !== undefined && // req properties
d.properties.ric !== undefined // req ric
)
let svg = __mapper('renderSvg').svg()
let gitems = d3.nest() // let framesByGid = f.groupBy(frames, "gid")
.key(function (d) { return d.properties.ric.gid })
.key(function (d) { return d.properties.ric.cid })
.entries(features) // features
for (let i in gitems) { // DOTS (seg5===0) each group gid
let gid = gitems[i].key, citems = gitems[i].values
for (let j in citems) { // each class cid
let cid = citems[j].key // cid
let fitems = citems[j].values // fitems
let current = fitems.slice(-1)[0]
/* ................. TEXTS ................. */
let texts = fitems
.filter(d => d.properties.sort === 'text')
if (texts.length > 0) {
__mapper('renderSvg').elems('svg:g.' + gid + '/text.' + cid, texts, d => d.uid)
.text(d => d.properties.string)
.attr('x', 0) // translate instead
.attr('y', 0) //
.attr('transform', d => // eg. "translate(21,20) rotate(15)")
'translate(' +
d.geometry.coordinates[0] +
',' +
d.geometry.coordinates[1] +
')' +
' rotate(' +
(d.properties.style['rotate'] || 0) +
' )'
)
.style('dx', d => d.properties.style['dx'])
.style('dy', d => d.properties.style['dx'])
.style('textLength', d => d.properties.style['textLength'])
.style('lengthAdjust', d => d.properties.style['lengthAdjust'])
.style('font-size', d => d.properties.style['font-size'])
.style('font-family', d => d.properties.style['font-family'])
.style('fill', d => d.properties.style.fill)
.style('stroke', d => d.properties.style.stroke)
.style('fill-opacity', d => d.properties.style['fill-opacity'])
.style('stroke-opacity', d => d.properties.style['stroke-opacity'])
.style('stroke-width', d => d.properties.style['stroke-width'])
.style('text-anchor', d => d.properties.style['text-anchor'])
}
/* ................. IMG ................. */
let imgs = fitems
.filter(d => d.properties.sort === 'img') // __ imgs __
.filter((d, i) => (d.properties.delled !== 1)) // not delled
if (imgs.length > 0) {
if (1 && 1) console.log('imgs', imgs)
__mapper('renderSvg').elems('svg:g.' + gid + '/image.' + cid, imgs, d => d.id)
.data(() => imgs)
.attr('transform', d => { // eg. "translate(21,20) rotate(15)")
return 'translate(' +
d.geometry.coordinates[0] +
',' +
d.geometry.coordinates[1] +
')' +
' rotate(' +
(d.properties.attr.rotate || 0) +
' )'
})
.attr('xlink:href', d => d.properties.attr['xlink:href'])
.attr('width', d => d.properties.attr.width)
.attr('height', d => d.properties.attr.height)
}
/* ................. AXES ................. */
let axes = fitems
.filter(d => d.properties.sort === 'axis') // __ axis __
.filter((d, i) => (d.properties.delled !== 1)) // not delled
.filter((d, i) => (d.properties.ric.delled !== 1)) // not delled
if (axes.length > 0) {
for (let k = 0; k<axes.length; k++) {
let axis = axes[k]
__mapper('renderSvg').elems('svg:g.' + gid + '/g.' + cid, Array.of(axis), d => d.properties.uid)
.data(() => Array.of(axis))
.call(axis.properties.axis.d3Axis)
.attr('transform', d => // eg. "translate(21,20) rotate(15)")
'translate(' +
d.geometry.coordinates[0] +
',' +
d.geometry.coordinates[1] +
')' +
' rotate(' +
(d.properties.axis.rotate || 0) +
' )'
)
.style('font-size', d => d.properties.axis.style['font-size'])
.style('text-anchor', d => d.properties.axis.style['text-anchor'])
.style('font-family', d => d.properties.axis.style['font-family'])
.style('fill', d => d.properties.style.fill)
.style('stroke', d => d.properties.style.stroke)
.style('fill-opacity', d => d.properties.style['fill-opacity'])
.style('stroke-opacity', d => d.properties.style['stroke-opacity'])
.style('stroke-width', d => d.properties.style['stroke-width'])
}
}
/* ................. GEOJSON FEATURE ................. */
let features = fitems
.filter(d => d.properties.sort === 'feature'
)
.filter((d, i) => (d.properties.delled !== 1)) // not delled
.filter((d, i) => (d.properties.ric.delled !== 1)) // not delled
if (features.length > 0) { // _e_
__mapper('renderSvg').elems('svg:g.' + gid + '/path.' + cid, features, d => d.uid) // elems
.data(() => features)
.attr('d', d => {
if (2 && 2 && d.properties.style === undefined) console.log('** style is undefined', d)
let geoitem = d // geojson feature
let properties = geoitem.properties || {} // properties
let pointRadius = properties.pointRadius || 2.5 // def pointRadius
let cameraProjer = r.cameraProjer()
let geoPath = d3.geoPath(cameraProjer) // path on view projection
let path = (pointRadius !== undefined) // geoPath
? geoPath.pointRadius(pointRadius)
: geoPath
let ret = path(geoitem)
return ret
})
.style('fill', d => d.properties.style.fill)
.style('stroke', d => d.properties.style.stroke)
.style('fill-opacity', d => d.properties.style['fill-opacity'])
.style('stroke-opacity', d => d.properties.style['stroke-opacity'])
.style('stroke-width', d => d.properties.style['stroke-width'])
}
/* ................. END SVG FORMS ................. */
}
}
}
// ............................. enty
let enty = function enty () {}
enty.svg = svg
enty.elems = elems
enty.render = render
return enty
}
exports.renderSvg = renderSvg
}))
/***************************
* @renderWebgl
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.renderWebgl = global.renderWebgl || {})))
}(this, function (exports) {
'use strict'
let renderWebgl = function (__mapper = {}) {
// md: # md:{filename}
// md: ** **
// md: renderer.domElement
// md: body div#viewframe canvas#canvas
// md: ```
// md: <canvas width="600" height="400" style="display: block; width: 600px; height: 400px;"></canvas>
// md: ```
// md: canvas
// md: ```
// md: Selection {_groups: [canvas#canvas.overlay], _parents: [html] }
// md: ```
// md: Camera extent is viewport in pixels
// md: ```
// md: [[-300, 300, 200, -200]
// md: ```
// md: # license
// md: MIT
const radians = Math.PI / 180
let _denser = point => {
if (!Array.isArray(point)) console.log('point ', point, ' is not cartesian')
return new THREE.Vector3(...point)
}
let r = __mapper('xs').r('renderport'),
width = r.width(),
height = r.height()
let craycaster = __mapper('xs').c('raycaster')
let renderer = new THREE.WebGLRenderer({antialias: true})
renderer.setClearColor(0x000000)
let domElem = renderer.domElement // canvas
domElem.innerHTML = '' // empty DOM
domElem.style.display = 'block'
let canvas = d3.select('.viewframe') // canvas
.append(() => d3.select(domElem)
.attr('id', 'canvas')
.attr('class', 'overlay')
.style('position', 'absolute; top:0px; left:0px; z-index:1')
.node()
)
let context = domElem.getContext('webgl')
let navInfo = document.createElement('div') // Add nav info section
navInfo.classList.add('graph-nav-info')
navInfo.innerHTML = 'if key ALT/right to switch animation'
document.body.appendChild(navInfo) // state.domElem.appendChild(navInfo);
let mouse = craycaster.mouse() // control.RAYCASTER
craycaster.control(domElem) // control on elem
let raycaster = new THREE.Raycaster() // intersect
let toolTipElem = document.createElement('div') // TOOLTIP
toolTipElem.classList.add('graph-tooltip')
toolTipElem.style.top = (mouse.y - 40) + 'px' // Move tooltip - on mouse
toolTipElem.style.left = (mouse.x - 20) + 'px'
document.body.appendChild(toolTipElem) // state.domElem.appendChild(state.toolTipElem);
let scene = new THREE.Scene() // SCENE
.add(new THREE.AmbientLight(0x333333))
let light = new THREE.DirectionalLight(0xe4eef9, 0.7) // LIGHT
.position.set(12, 12, 8)
let extent = [ -width / 2, width / 2, height / 2, -height / 2 ] // EXTENT
let camera = new THREE.OrthographicCamera( ...extent, 0.1, 9000) // CAMERA
camera.position.x = 0
camera.position.y = 0
camera.position.z = 900
camera.rotation.x = 0
camera.rotation.y = 0
camera.rotation.z = 0
camera.distance2nodesFactor = 300
camera.lookAt(new THREE.Vector3(0, 0, 0))
let controls = new TrackballControls(camera, domElem) // TRACK CONTROLS
controls.rotateSpeed = 1.0
controls.zoomSpeed = 1.2
controls.panSpeed = 0.8
controls.noZoom = false
controls.noPan = false
controls.staticMoving = true
controls.dynamicDampingFactor = 0.3
controls.keys = [ 65, 83, 68 ]
// ............................. resizeRenderer
let resizeRenderer = function (renderer, props) {
let width = props.width
let height = props.height
if (width && height) {
renderer.setSize(width, height)
}
return renderer
}
// ............................. resizeCamera
let resizeCamera = function (camera, props) {
let width = props.width
let height = props.height
if (width && height) {
camera.aspect = width / height
camera.updateProjectionMatrix()
}
return camera
}
// ............................. cameraPropsSet
let cameraPropsSet = (camera, cameraProps) => { /* cameraPropsSet */
if (cameraProps !== undefined) {
if (cameraProps.rotate !== undefined) {
if (cameraProps.rotate[0] !== undefined) camera.rotation.x = cameraProps.rotate[0] * radians
if (cameraProps.rotate[1] !== undefined) camera.rotation.y = cameraProps.rotate[1] * radians
if (cameraProps.rotate[2] !== undefined) camera.rotation.z = cameraProps.rotate[2] * radians
}
if (cameraProps.position !== undefined) {
if (cameraProps.position[0] !== undefined) camera.position.x = cameraProps.position[0]
if (cameraProps.position[1] !== undefined) camera.position.y = cameraProps.position[1]
if (cameraProps.position[2] !== undefined) camera.position.z = cameraProps.position[2]
}
}
return camera
}
let state = {}
state.width = width
state.height = height
state.renderer = renderer
state.domElem = domElem
state.navInfo = navInfo
state.toolTipElem = toolTipElem
state.mouse = mouse
state.camera = camera
state.scene = scene
state.light = light
state.raycaster = raycaster
state.controls = controls
state.renderer = resizeRenderer(renderer, state) // force update at start
state.camera = resizeCamera(camera, state) // force update at start
// ............................. render
let render = function (elapsed, featurecollection, maxlimit) {
let features = featurecollection.features
.filter(
d => d.properties !== undefined && // req properties
d.properties.ric !== undefined // req ric
)
while (state.scene.children.length > 0) { // clean canvas
state.scene.remove(state.scene.children[0]) // clear the scene
}
let gitems = d3.nest() // items in scene
.key(function (d) { return d.properties.ric.gid })
.key(function (d) { return d.properties.ric.cid })
.entries(features)
for (let i in gitems) { // DOTS (seg5===0) each group gid
let gid = gitems[i].key,
citems = gitems[i].values
for (let j in citems) { // each class cid
let cid = citems[j].key // cid
let fitems = citems[j].values // fitems
let now = fitems.slice(-1)[0]
/* ................. GEOJSON FEATURE ................. */
let features = fitems
.filter(d => d.properties.sort === 'feature' || d.properties.sort === undefined) // default
if (features.length > 0) {
for (let k in features) { // DOTS (seg5===0) each group gid
let item = features[k] // feature
let feature = item // .feature
let style = item.properties.style
let geometry = feature.geometry // rings in MultiPolygon, MultiLineString
if (geometry !== undefined && geometry !== null) { // geometry may be null
if (geometry.type === 'Point') { // Point
let node = item
state.material_color = style.fill
state.geometry = new THREE.SphereGeometry(5, 32, 32)
state.wireframe = new THREE.WireframeGeometry(state.geometry)
state.material = new THREE.MeshBasicMaterial({
color: state.material_color,
transparent: true,
opacity: 0.75
})
let sphere = new THREE.Mesh(
state.wireframe,
state.material
)
sphere.position.x = node.x || node.geometry.coordinates[0]
sphere.position.y = node.y || node.geometry.coordinates[1] || 0
sphere.position.z = node.z || node.geometry.coordinates[2] || 0
state.scene.add(sphere)
} else if (geometry.type === 'MultiPolygon') { // MultiPolygon
let threeMaterial = new THREE.LineBasicMaterial({
color: style.stroke,
opacity: style['stroke-opacity']
})
for (let i = 0; i < geometry.coordinates.length; i++) {
let coordinates = geometry.coordinates[i]
let threeGeometry = new THREE.Geometry()
coordinates.forEach(function (line) {
d3.pairs(line.map(_denser), function (a, b) {
threeGeometry.vertices.push(a, b)
})
let object = new THREE.LineSegments(threeGeometry, threeMaterial)
if (object) state.scene.add(object)
})
}
} else if (geometry.type === 'LineString') { // LineString
let threeMaterial = new THREE.LineBasicMaterial({
color: style.stroke,
opacity: style['stroke-opacity']
})
let coordinates = Array.of(geometry.coordinates)
let threeGeometry = new THREE.Geometry()
coordinates.forEach(function (line) {
d3.pairs(line.map(_denser), function (a, b) {
threeGeometry.vertices.push(a, b)
})
let object = new THREE.LineSegments(threeGeometry, threeMaterial)
if (object) state.scene.add(object)
})
} else { // other gj
let threeMaterial = new THREE.LineBasicMaterial({
color: style.stroke,
opacity: style['stroke-opacity']
})
let coordinates = geometry.coordinates
let threeGeometry = new THREE.Geometry()
coordinates.forEach(function (line) {
d3.pairs(line.map(_denser), function (a, b) {
threeGeometry.vertices.push(a, b)
})
let object = new THREE.LineSegments(threeGeometry, threeMaterial)
if (object) state.scene.add(object)
})
}
}
}
}
/* ................. IMG ................. */
let imgs = fitems.filter(d => d.properties.sort === 'img')
if (imgs.length > 0) {
for (let k in imgs) {
let img = imgs[k]
let href = img.properties['xlink:href']
let map = new THREE.TextureLoader().load(href)
let material = new THREE.SpriteMaterial({
map: map,
color: 0xffffff,
fog: true
})
let threeMaterial = new THREE.Sprite(material)
threeMaterial.scale.set(200, 200, 1)
state.scene.add(threeMaterial)
}
}
/* ................. 3LINK ................. */
let threelinks = fitems.filter(d => d.properties.sort === 'threelink')
if (threelinks.length > 0) {
for (let k in threelinks) {
let link = threelinks[k]
state.scene.add(link._line = link.line)
}
}
} // citems
} // gitems
if (state.mouse !== undefined) {
state.raycaster.setFromCamera(state.mouse, state.camera) // Update tooltip
const intersects = state.raycaster.intersectObjects(state.scene.children)
if (1 && 1 && intersects.length > 0) console.log('r.webgl.raycaster intersects', intersects)
state.toolTipElem.innerHTML = intersects.length ? intersects[0].object.index || '_e_' : '_e_'
}
state.controls.update() // TrackballControls of camera and domeElem
state.renderer.render(state.scene, state.camera) // RENDER scene on camera
}
// ............................. enty
let enty = function enty () {}
enty.render = render
return enty
}
exports.renderWebgl = renderWebgl
}))
/* d3*/
/* topojson*/
/* three*/
/* tfjs*/
/* control*/
document.write("<script src='control-wen.js'><\/script>")
document.write("<script src='control-versor.js'><\/script>")
document.write("<script src='control-touchMove.js'><\/script>")
document.write("<script src='control-touchEnd.js'><\/script>")
document.write("<script src='control-timer.js'><\/script>")
document.write("<script src='control-rayder.js'><\/script>")
document.write("<script src='control-raycaster.js'><\/script>")
document.write("<script src='control-pos.js'><\/script>")
document.write("<script src='control-key.js'><\/script>")
/* data*/
/* force*/
document.write("<script src='force-z.js'><\/script>")
document.write("<script src='force-y.js'><\/script>")
document.write("<script src='force-x.js'><\/script>")
document.write("<script src='force-manybody.js'><\/script>")
document.write("<script src='force-magnetic.js'><\/script>")
document.write("<script src='force-link.js'><\/script>")
document.write("<script src='force-energy.js'><\/script>")
document.write("<script src='force-curb.js'><\/script>")
document.write("<script src='force-crop.js'><\/script>")
document.write("<script src='force-crash.js'><\/script>")
document.write("<script src='force-collide.js'><\/script>")
document.write("<script src='force-center.js'><\/script>")
document.write("<script src='force-box.js'><\/script>")
document.write("<script src='force-bowl.js'><\/script>")
/* geo*/
document.write("<script src='geo-uniwen.js'><\/script>")
document.write("<script src='geo-unimercator.js'><\/script>")
document.write("<script src='geo-tetra.js'><\/script>")
document.write("<script src='geo-natform.js'><\/script>")
document.write("<script src='geo-myriad.js'><\/script>")
document.write("<script src='geo-hedrals.js'><\/script>")
document.write("<script src='geo-futuri.js'><\/script>")
document.write("<script src='geo-cox.js'><\/script>")
/* lib*/
/* muon*/
document.write("<script src='muon-wen.js'><\/script>")
document.write("<script src='muon-voro.js'><\/script>")
document.write("<script src='muon-versor.js'><\/script>")
document.write("<script src='muon-timer.js'><\/script>")
document.write("<script src='muon-tim.js'><\/script>")
document.write("<script src='muon-svg.js'><\/script>")
document.write("<script src='muon-store.js'><\/script>")
document.write("<script src='muon-stats.js'><\/script>")
document.write("<script src='muon-stace.js'><\/script>")
document.write("<script src='muon-snap.js'><\/script>")
document.write("<script src='muon-sim.js'><\/script>")
document.write("<script src='muon-ric.js'><\/script>")
document.write("<script src='muon-quaternion.js'><\/script>")
document.write("<script src='muon-quad.js'><\/script>")
document.write("<script src='muon-props.js'><\/script>")
document.write("<script src='muon-proj3ct.js'><\/script>")
document.write("<script src='muon-profier.js'><\/script>")
document.write("<script src='muon-polyhedral.js'><\/script>")
document.write("<script src='muon-pacer.js'><\/script>")
document.write("<script src='muon-nat.js'><\/script>")
document.write("<script src='muon-math.js'><\/script>")
document.write("<script src='muon-mapper.js'><\/script>")
document.write("<script src='muon-liner.js'><\/script>")
document.write("<script src='muon-lacer.js'><\/script>")
document.write("<script src='muon-kruskal.js'><\/script>")
document.write("<script src='muon-init.js'><\/script>")
document.write("<script src='muon-inertia.js'><\/script>")
document.write("<script src='muon-image.js'><\/script>")
document.write("<script src='muon-graticule.js'><\/script>")
document.write("<script src='muon-geonode.js'><\/script>")
document.write("<script src='muon-geom.js'><\/script>")
document.write("<script src='muon-geoj.js'><\/script>")
document.write("<script src='muon-fourier.js'><\/script>")
document.write("<script src='muon-forces.js'><\/script>")
document.write("<script src='muon-fibonat.js'><\/script>")
document.write("<script src='muon-eventDispatcher.js'><\/script>")
document.write("<script src='muon-delaunay.js'><\/script>")
document.write("<script src='muon-delaunator.js'><\/script>")
document.write("<script src='muon-clone.js'><\/script>")
document.write("<script src='muon-boform.js'><\/script>")
document.write("<script src='muon-bezierjs.js'><\/script>")
document.write("<script src='muon-audio.js'><\/script>")
document.write("<script src='muon-anitem.js'><\/script>")
document.write("<script src='muon-animation.js'><\/script>")
document.write("<script src='muon-animas.js'><\/script>")
/* halo*/
document.write("<script src='halo-tiles.js'><\/script>")
document.write("<script src='halo-textform.js'><\/script>")
document.write("<script src='halo-scene.js'><\/script>")
document.write("<script src='halo-quadric.js'><\/script>")
document.write("<script src='halo-pacer.js'><\/script>")
document.write("<script src='halo-numform.js'><\/script>")
document.write("<script src='halo-nat.js'><\/script>")
document.write("<script src='halo-img.js'><\/script>")
document.write("<script src='halo-fuel.js'><\/script>")
document.write("<script src='halo-fractal.js'><\/script>")
document.write("<script src='halo-fourier.js'><\/script>")
document.write("<script src='halo-formed.js'><\/script>")
document.write("<script src='halo-ent.js'><\/script>")
document.write("<script src='halo-core.js'><\/script>")
document.write("<script src='halo-camera.js'><\/script>")
document.write("<script src='halo-axis.js'><\/script>")
/* x*/
document.write("<script src='x-s.js'><\/script>")
/* render*/
document.write("<script src='render-webgl.js'><\/script>")
document.write("<script src='render-SVG.js'><\/script>")
document.write("<script src='render-renderport.js'><\/script>")
document.write("<script src='render-canvas.js'><\/script>")
<!-- d3 -->
<script src='https://d3js.org/d3.v5.min.js'></script>
<script src='https://unpkg.com/d3-require@1.0.3/dist/d3-require.min.js'></script>
<script src="https://unpkg.com/d3-octree/build/d3-octree.min.js"></script>
<script src="https://unpkg.com/versor"></script> <!-- for inertia -->
<script src="https://unpkg.com/d3-inertia"></script>
<script src='https://d3js.org/d3-geo.v1.min.js'></script>
<script src='https://unpkg.com/d3-geo-voronoi@0.0.6/build/d3-geo-voronoi.min.js'></script>
<script src='https://d3js.org/d3-geo-projection.v2.min.js'></script>
<!-- <script src='https://unpkg.com/d3-geo-polygon@1.4.2/build/d3-geo-projection-clip-polyhedral.js'></script> -->
<script src='https://unpkg.com/d3-geo-polygon@1.4.2/build/d3-geo-polygon.min.js'></script>
<!-- <script src='https:////unpkg.com/d3-force-3d@1.0/build/d3-force-3d.bundle.min.js'></script> -->
<script src='https://unpkg.com/3d-force-graph@1.22.0/dist/3d-force-graph.min.js'></script>
<script src='https://unpkg.com/d3-force-3d@1.1.0/build/d3-force-3d.min.js'></script>
<script src="https://unpkg.com/d3-force-surface/dist/d3-force-surface.min.js"></script>
<script src="https://unpkg.com/d3-force-magnetic@0.8.0/dist/d3-force-magnetic.min.js"></script>
<script src="https://unpkg.com/d3-force-bounce/dist/d3-force-bounce.min.js"></script>
<script src="https://unpkg.com/d3-force-pod/dist/d3-force-pod.min.js"></script>
<!-- topojson.js -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/topojson/3.0.0/topojson.min.js'></script>
<!-- three.js -->
<script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/84/three.min.js'></script>
<script src='https://unpkg.com/three-trackballcontrols-web@0.0.2/dist/three-trackballcontrols.min.js'></script>
<script src='https://unpkg.com/mathjs@4.0.1/dist/math.min.js'></script>
<script src='https://cdn.jsdelivr.net/npm/@turf/turf@5/turf.min.js'></script>
<!-- tensorflowjs -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.8.0"></script>
/*******************************************
* @xs
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports)
: typeof define === 'function' && define.amd ? define(['exports'], factory)
: (factory((global.xs = global.xs || {})))
}(this, function (exports) {
'use strict'
let xs = function (__mapper = {}) {
// __mapper('xs').m('props')
let item = function (params, pres = ['control', 'force', 'muon', 'render', 'shade'], ret = null) {
let cap = s => (s == null) ? '' : s.charAt(0).toUpperCase() + s.slice(1) // capitalize string
let nome = null
if (typeof (params) === 'object') nome = params.nome
else if (typeof (params) === 'string') nome = params
let itemNames = pres.reduce((p, q) => [...p, q + nome, q + cap(nome) ], []) // item syn names
for (let i = 0; i < itemNames.length; i++) {
let itemName = itemNames[i]
if (__mapper(itemName) !== undefined) { // item in mapper
ret = __mapper(itemName)
break
} else if (enty[nome] !== undefined) {
ret = enty[nome]()
break
} else {
let item
try {
item = eval(itemName) // eval
} catch (e) {
//
}
if (typeof item === 'object') {
ret = __mapper({ // register in mapper
[itemName]: item[itemName](__mapper)
})[itemName] // item
break
} else if (typeof item === 'function') {
ret = item
break
} else {
//
}
}
}
return ret
}
/*******************************************
* @enty
*/
let enty = function enty () {}
enty.item = enty.i = item
enty.boson = enty.b = function (params, pres = ['boson'], ret = null) {
return enty.item(params, pres = ['boson'], ret = null)
}
enty.control = enty.c = function (params, pres = ['control'], ret = null) {
return enty.item(params, pres = ['control'], ret = null)
}
enty.data = enty.d = function (params, pres = ['data'], ret = null) {
return enty.item(params, pres = ['data'], ret = null)
}
enty.force = enty.f = function (params, pres = ['force', 'field'], ret = null) {
return enty.item(params, pres = ['force', 'force', 'field'], ret = null)
}
enty.geo = enty.g = function (params, pres = ['geojson', 'proj'], ret = null) {
return enty.item(params, pres = ['geojson', 'geo', 'proj', 'd3.geo'], ret = null)
}
enty.muon = enty.m = function (params, pres = ['muon', 'mod', 'plugin'], ret = null) {
return enty.item(params, pres = ['muon', 'mod', 'plugin'], ret = null)
}
enty.render = enty.r = function (params, pres = ['render'], ret = null) {
return enty.item(params, pres = ['render'], ret = null)
}
enty.halo = enty.h = function (params, pres = ['halo'], ret = null) {
return enty.item(params, pres = ['halo'], ret = null)
}
return enty
}
exports.xs = xs
}))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment