sine pacing graticules
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 | |
})) |
/* -------------------------- */ | |
/* forceLink */ | |
/* -------------------------- */ | |
(function (global, factory) { | |
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) | |
: typeof define === 'function' && define.amd ? define(['exports'], factory) | |
: (factory((global.forceLink = global.forceLink || {}))) | |
}(this, function (exports) { | |
'use strict' | |
var forceLink = function forceLink (__mapper = {}) { | |
let props = __mapper('xs').m('props') | |
// -------------------------------------// | |
// force // | |
// -------------------------------------// | |
let force = function (params) { | |
let nodes = params.nodes || [] | |
let links = params.links || [] | |
let id = params.id || (d => d.index) | |
let distance = params.distance || 30 | |
let strength = params.strength || (() => 0.1) | |
let iterations = params.iterations || 1 | |
let d3src = (params.src !== undefined) ? params.src : d3 // d3_force | |
let d3force = d3src.forceLink(nodes) | |
.id(id) | |
.distance(distance) | |
.links(links) | |
.strength(strength) | |
.iterations(iterations) | |
return d3force | |
} | |
/* -------------------------- */ | |
/* muonApi */ | |
/* -------------------------- */ | |
var muonApi = function muonApi () {} | |
muonApi.force = force | |
return muonApi | |
} | |
exports.forceLink = forceLink | |
})) |
/* -------------------------- */ | |
/* 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/[email protected]/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/[email protected]/build/d3-geo-voronoi.min.js'></script> | |
<script src='https://d3js.org/d3-geo-projection.v2.min.js'></script> | |
<!-- <script src='https://unpkg.com/[email protected]/build/d3-geo-projection-clip-polyhedral.js'></script> --> | |
<script src='https://unpkg.com/[email protected]/build/d3-geo-polygon.min.js'></script> | |
<!-- <script src='https:////unpkg.com/[email protected]/build/d3-force-3d.bundle.min.js'></script> --> | |
<script src='https://unpkg.com/[email protected]/dist/3d-force-graph.min.js'></script> | |
<script src='https://unpkg.com/[email protected]/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/[email protected]/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/[email protected]/dist/three-trackballcontrols.min.js'></script> | |
<script src='https://unpkg.com/[email protected]/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/[email protected]"></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 <[email protected]> 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/[email protected]/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/[email protected]/build/d3-geo-voronoi.min.js'></script> | |
<script src='https://d3js.org/d3-geo-projection.v2.min.js'></script> | |
<!-- <script src='https://unpkg.com/[email protected]/build/d3-geo-projection-clip-polyhedral.js'></script> --> | |
<script src='https://unpkg.com/[email protected]/build/d3-geo-polygon.min.js'></script> | |
<!-- <script src='https:////unpkg.com/[email protected]/build/d3-force-3d.bundle.min.js'></script> --> | |
<script src='https://unpkg.com/[email protected]/dist/3d-force-graph.min.js'></script> | |
<script src='https://unpkg.com/[email protected]/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/[email protected]/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/[email protected]/dist/three-trackballcontrols.min.js'></script> | |
<script src='https://unpkg.com/[email protected]/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/[email protected]"></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 | |
})) |