chart = {
const width=900, height=500
const viewBoxWidth=500, viewBoxHeight=500
const svg = d3.create("svg")
.attr("width", width)
.attr("height", height)
.attr('viewBox', `${-viewBoxWidth/2} ${-viewBoxHeight/2} ${viewBoxWidth} ${viewBoxHeight}`)
.attr('style', 'background: #1E1225')
let rand = makeRandomGenerator(inputSeed);
let points = (new Array(lineCount)).fill(0).map(p => {
let x = (rand.random()-.5)*512
let y = (rand.random()-.5)*512
let z = (rand.random()-.5)*512
let source = new THREE.Vector3(x, y, z);
let path = d3.path();
let d, norm, diff, target = source.clone();
let visible = false, visiblePrev;
for(let i = 0; i < stepsNumber; ) {
d = distance(target);
visiblePrev = visible
if(Math.abs(d)<1e-10){
i++
let visibility = target.clone()
visibility.add(new THREE.Vector3(0,0,-9))
let visibilityD = d
for(let j = 0; j < 50; j++){
//if(visibility.z < -9999) break
visibility.add(new THREE.Vector3(0,0,-visibilityD))
visibilityD = distance(visibility)
console.log('visibility.z', visibility.z, 'visibilityD', visibilityD)
}
// Если за N реймарш-шагов мы не дошли до плоскости z = -9999 пикселей, точка не видна.
visible = visibility.z < -9999? true : false
// лайнту надо рисовать только если предыдущая точка была видна и эта тоже.
// мувту — во всех остаальных случаях.
// То есть, если хотя бы одна из точек (прошлая или текущая) не была видна
//
if(flags.includes('visibleSide')) {
console.log('step', i, ' visible ', visible, 'visiblePrev ', visiblePrev)
if(visible && visiblePrev) {
path.lineTo(target.x, target.y);
console.log('visible')
}
else {
path.moveTo(target.x, target.y);
console.log('not visible')
}
}
else {
if(path['_'].length == 0)
path.moveTo(target.x, target.y);
else
path.lineTo(target.x, target.y);
}
let slide = new THREE.Vector3(0,0,0)
slide.x = new noise('001').noise3D(target.x/noiseDetails, target.y/noiseDetails, target.z/noiseDetails)
slide.y = new noise('002').noise3D(target.x/noiseDetails, target.y/noiseDetails, target.z/noiseDetails)
slide.z = new noise('003').noise3D(target.x/noiseDetails, target.y/noiseDetails, target.z/noiseDetails)
slide.normalize().multiplyScalar(minSlide)
target.add(slide);
}
norm = normal(target).multiplyScalar(-1);
diff = norm.clone().multiplyScalar(d);
source = target.clone();
target.add(diff);
}
// the last point is to be traced yet
// path.lineTo(target.x, target.y);
console.log(path)
return path;
})
// drawing traces
if (flags.includes('l')) {
svg.selectAll('path')
.data( points )
.enter()
.append('path')
.attr('d', p => p.toString())
.attr('stroke', '#FCE000')
.attr('fill', 'none')
.attr('stroke-width', 1.4);
}
// drawing points
if (flags.includes('d')) {
svg.selectAll('circle')
.data( points )
.enter()
.append('circle')
.attr('cx', p => p['_x0'])
.attr('cy', p => p['_y0'])
.attr('r', p => 2)
.attr('fill', p => '#FCE000');
}
return svg.node()
}