{
const svg = div.append('svg')
.attr("viewBox", [0, 0, 1500, 1500])
.style("background-color", svgBackgroundColor),
container = svg.append("g")
.attr("id", "container")
.attr("transform", `translate(${400}, ${400})`),
lipsDrawing = svg.append("defs")
.append("g")
.attr("id","iconCustom")
.append("path")
.attr("id", "lipsPath")
.attr("d", lipsPath)
yield div.node();
let data = getLipsPointsData();
let puckerScale = d3.scaleLog()
.domain(d3.extent(data, d => d.centerDist))
.range([0,1])
let updateLines = (data2) =>{
let t = d3.transition()
.duration(1350)
let ddataJoin = d3.select("#container").selectAll('line')
.data(data2)
ddataJoin.join(
enter => enter
.append('line')
.attr("stroke", d => `#${colors[getRandomInteger(1,colors.length-1)]}`)
.attr("stroke-width", (d,i) => getRandomInteger(2,5))
.style("opacity", (d,i) => getRandomInteger(2,9)/10)
.attr('x1', (d,i) => {
let dist = d.centerDist < idealDist ? d.centerDist : d.centerDist;
let x1 = d.x + ((puckerScale(dist)/4 * (dist)) * Math.cos(d.theta));
return x1
})
.attr('y1', (d,i) =>{
let dist = d.centerDist < idealDist ? d.centerDist : d.centerDist;
let y1 = d.y + ((dist * noise.noise(i*count)) * Math.sin(d.theta));
return y1
})
.attr('x2', (d,i) =>{
let dist = d.centerDist < idealDist ? d.centerDist : d.centerDist;
let x2 = (d.x - (((dist*.90)+ noise.noise(i*count)*20) * Math.cos(d.theta)));
return x2;
})
.attr('y2', (d,i) =>{
let dist = d.centerDist < idealDist ? d.centerDist : d.centerDist;
let y2 = d.y - (((dist*.90)+ noise.noise(i*count)*20) * Math.sin(d.theta));
return y2;
}
),
update => update.call(e => e.transition(t)
.attr("stroke", d => `#${colors[getRandomInteger(1,colors.length-1)]}`)
.attr("stroke-width", (d,i) => {
return getRandomInteger(2,5)})
.style("opacity", (d,i) => getRandomInteger(5,9)/10)
.attrTween("x1", (d,i) => {
let dist = d.centerDist < idealDist ? d.centerDist : d.centerDist;
let x1 = d.x + ((puckerScale(dist)/4 * (dist)) * Math.cos(d.theta));
//let x1 = d.x + (dist * Math.cos(d.theta));
let x11 = d.x + ((dist* noise.noise(i*count)) * Math.cos(d.theta));
let intp = d3.interpolate(x1,x11);
return t => {
return intp(t);
}
})
.attrTween("y1", (d,i) => {
let dist = d.centerDist < idealDist ? d.centerDist : d.centerDist;
let y1 = d.y + ((dist * noise.noise(i*count)) * Math.sin(d.theta));
let y11 = d.y + (((dist)*(noise.noise(i*count))) * Math.sin(d.theta));
let intp = d3.interpolate(y1,y11);
return t => {
return intp(t);
}
})
.attrTween("x2", (d,i) => {
let dist = d.centerDist < idealDist ? d.centerDist : d.centerDist;
let x2 = (d.x - (((dist*.90)+ noise.noise(i*count)*20) * Math.cos(d.theta)));
let x22 = d.x - (((dist/getRandomInteger(2,5) + noise.noise(i*count)*20)) * Math.cos(d.theta));
let intp = d3.interpolate(x2,x22);
return t => {
return intp(t);
}
})
.attrTween("y2", (d,i) => {
let dist = d.centerDist < idealDist ? d.centerDist : d.centerDist;
let y2 = (d.y - (((dist*.90)+ noise.noise(i*count)*20) * Math.sin(d.theta)));
let y22 = d.y - (((dist/getRandomInteger(2,5)) + noise.noise(i*count)*20)) * Math.sin(d.theta);
let intp = d3.interpolate(y2,y22);
return t => {
return intp(t);
}
})
)
)
.attr("stroke-linecap", "round")
}
let count = 1
d3.interval(function() {
updateLines(data,count);
count++;
}, 1400);
}