/* -------------------------- */ /* forcetickPlugin */ /* -------------------------- */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global.forcetickPlugin = global.forcetickPlugin || {}))); }(this, function (exports) { 'use strict'; var forcetickPlugin = function forcetickPlugin() { function forcetickPlugin() { var nodeItems = __mapper("nodes").items() var linkItems = __mapper("links").items() let quad = d3c.quad() .x(function(d) {return d.x}) .y(function(d) {return d.y}) .addAll(__mapper("preys").remain(nodeItems)) // preys: planets let predators = __mapper("config").predator.remain(nodeItems) // predators: solars for (let i = 0; i < predators.length; i++) { // for each solar let s = predators[i] let ps = quad.findmanyothers(s.x, s.y, // planets __mapper("config").predator.searchRange(s), // howfaraway from solar __mapper("config").predator.armsFactor) // howmany let ls = [] let hs = [] for (let j = 0; j < ps.length; j++) { // for each planet let p = ps[j] // this planet ls.push({source: s, target: p, idx: __mapper("links").linkIdFn(s, p)}) // links from solar hs.push({source: p, target: s, idx: __mapper("links").linkIdFn(s, p)}) // links to planet let angleRadians = Math.atan2(p.y - s.y, p.x - s.x) // angle - determines range let rotation_radius_x = p.rotrx * (1 + p.solarbit ) let rotation_radius_y = p.rotry * (1 + p.solarbit) let t_x = rotation_radius_x * Math.cos(angleRadians) let t_y = rotation_radius_y * Math.sin(angleRadians) let rng = __mapper("config").distance({"x":t_x, "y":t_y}, {"x":0, "y":0}) let dst = __mapper("config").distance(s, p) // current distance sol, planet let range = rng // __mapper("config").predator.absorbfn(s) // range for absorbtion if (dst < range && // planet withing solar range ( p.solarid === null || // planet is not bound predators[s.idx].energy < predators[p.solarid].energy) // new solar is less energy ) { // *********** absorbed // console.log("p", p) // console.log("angle degrees", angleRadians * 180 / Math.PI) p.toffset = angleRadians * p.periodtime / (2 * Math.PI) // p.elapsed = - p.periodtime / 2 p.starttime = undefined // reset phase timer // p.starttime = p.elapsed // s.radius = __mapper("config").predator.RadiusPostAbsorb(s, p) // s.color = __mapper("config").raptor.ColorPostAbsorb(s, p) // p.radius = __mapper("config").epsilon // prey // p.solarid = (p.solarid) ? null : s.idx // ********** get got // if (p.solarid === null) { // p.solarid = null // } else { // console.log("bind " + p.solarid + " to " + s.idx) p.solarid = s.idx // ********** get got // } // p.isvoid = true } p.saugs = hs } s.links = ls // add link to solar } let remainingPredators = predators.reduce(function(p, c, i, a) { return p.concat(c.links) }, []) __mapper("links").items(remainingPredators) __mapper("links").render() __mapper("solars").render() __mapper("planets").render() } return forcetickPlugin } exports.forcetickPlugin = forcetickPlugin }));