application de respiration animée circulaire d3 js voyageant sur un chemin circulaire
d3 js application de respiration animée
Je veux pouvoir créer une animation d'un cercle qui tourne autour d'un chemin à un intervalle de temps spécifique, et pouvoir contrôler cet intervalle pour accélérer/ralentir.
Mon code ressemble actuellement à ceci. Comment définir un cercle pour qu'il se déplace le long d'un chemin circulaire - et même demander au cercle parent lui-même de "respirer" et d'expirer
27 juillet 2023 - Base actuelle
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>
<html>
<head>
<title>multibar d3</title>
<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<style>
</style>
</head>
<body>
<script>
var width = 960;
var height = 600;
var margin = {top: 20, right: 5, bottom: 30, left: 20};
var svg = d3.select("body")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr('class', 'circleorbits')
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var originX = 200;
var originY = 200;
var innerCircleRadius = 40;
var outerCircleRadius = 60;
/*
var table = svg.append("circle").attr({
cx: originX,
cy: originY,
r: 40,
fill: "white",
stroke: "black"
});
*/
var group = svg.append("g");
var outerCircle = svg.append("circle")
.attr("cx", originX)
.attr("cy", originY)
.attr("opacity", 0)
.attr("r", outerCircleRadius)
.attr("fill", "none")
.attr("stroke", "black");
//console.log("outerCircle", outerCircle);
var chairOriginX = originX + ((60) * Math.sin(0));
var chairOriginY = originY - ((60) * Math.cos(0));
var pointOnOuterCircle = svg.append("circle")
.attr("cx", chairOriginX)
.attr("cy", chairOriginY)
.attr("opacity", 0)
.attr("r", 5)
.attr("fill", "black");
//console.log("pointOnOuterCircle", pointOnOuterCircle);
/*
var chairWidth = 20;
var chair = svg.append("rect").attr({
x: chairOriginX - (chairWidth / 2),
y: chairOriginY - (chairWidth / 2),
width: chairWidth,
opacity: 0,
height: 20,
fill: "none",
stroke: "blue"
});
*/
// ANIMATIONS
// drawing outer circle
outerCircle.transition().delay(500).duration(500).style("opacity", 1);
// drawing point on outer circle
pointOnOuterCircle.transition().delay(1000).duration(500).style("opacity", 1);
// drawing chair on the point
//chair.transition().delay(1500).duration(500).style("opacity", 1);
// rotating the chair
var tween = function (d, i, a) {
return d3.interpolateString("rotate(0, 200, 200)", "rotate(360, 200, 200)");
}
var duration = 5000;
//chair.transition().delay(2000).duration(500).attrTween("transform", tween);
pointOnOuterCircle.transition().delay(2000).duration(duration).attrTween("transform", tween);
// fading out the intermediate objects
//pointOnOuterCircle.transition().delay(4000).duration(500).style("opacity", 0);
//outerCircle.transition().delay(4000).duration(500).style("opacity", 0);
function newLoop(){
pointOnOuterCircle.transition().delay(2000).duration(5000).attrTween("transform", tween);
}
setInterval(newLoop, duration);
</script>
</body>
</html>
svg = d3.create("svg");
var circle = svg
.append("circle")
.attr("cx", 150)
.attr("cy", 75)
.attr("r", 50);
circle
.transition()
.duration(2000)
.attr('r', 75);
d3
.select("#container")
.append(() => svg.node());
var circle = svg
.append("circle")
.attr("cx", 150)
.attr("cy", 75)
.attr("r", 50);
<!DOCTYPE html>
<meta charset="utf-8">
<body>
<style>
path {
fill: none;
stroke: #000;
stroke-width: 3px;
}
circle {
fill: steelblue;
stroke: #fff;
stroke-width: 3px;
}
</style>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
var points = [
[480, 200],
[580, 400],
[680, 100],
[780, 300],
[180, 300],
[280, 100],
[380, 400]
];
var svg = d3.select("body").append("svg")
.attr("width", 960)
.attr("height", 500);
var path = svg.append("path")
.data([points])
.attr("d", d3.svg.line()
.tension(0) // Catmull–Rom
.interpolate("cardinal-closed"));
svg.selectAll(".point")
.data(points)
.enter().append("circle")
.attr("r", 4)
.attr("transform", function(d) { return "translate(" + d + ")"; });
var circle = svg.append("circle")
.attr("r", 13)
.attr("transform", "translate(" + points[0] + ")");
transition();
function transition() {
circle.transition()
.duration(10000)
.attrTween("transform", translateAlong(path.node()))
.each("end", transition);
}
// Returns an attrTween for translating along the specified path element.
function translateAlong(path) {
var l = path.getTotalLength();
return function(d, i, a) {
return function(t) {
var p = path.getPointAtLength(t * l);
return "translate(" + p.x + "," + p.y + ")";
};
};
}
</script>
1 réponse
Capable de créer cette application en utilisant ce code - mais il faudra peut-être en faire un composant de réaction pour l'afficher/masquer lorsque l'utilisateur clique sur le bouton de lecture.
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>
<html>
<head>
<title>multibar d3</title>
<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<style>
</style>
</head>
<body>
<script>
var width = 960;
var height = 600;
var margin = {top: 20, right: 5, bottom: 30, left: 20};
var svg = d3.select("body")
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr('class', 'circleorbits')
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var originX = 200;
var originY = 200;
var innerCircleRadius = 40;
var outerCircleRadius = 60;
/*
var table = svg.append("circle").attr({
cx: originX,
cy: originY,
r: 40,
fill: "white",
stroke: "black"
});
*/
var group = svg.append("g");
var outerCircle = svg.append("circle")
.attr("cx", originX)
.attr("cy", originY)
.attr("opacity", 0)
.attr("r", outerCircleRadius)
.attr("fill", "none")
.attr("stroke", "black");
//console.log("outerCircle", outerCircle);
var chairOriginX = originX + ((60) * Math.sin(0));
var chairOriginY = originY - ((60) * Math.cos(0));
var pointOnOuterCircle = svg.append("circle")
.attr("cx", chairOriginX)
.attr("cy", chairOriginY)
.attr("opacity", 0)
.attr("r", 5)
.attr("fill", "black");
//console.log("pointOnOuterCircle", pointOnOuterCircle);
/*
var chairWidth = 20;
var chair = svg.append("rect").attr({
x: chairOriginX - (chairWidth / 2),
y: chairOriginY - (chairWidth / 2),
width: chairWidth,
opacity: 0,
height: 20,
fill: "none",
stroke: "blue"
});
*/
// ANIMATIONS
// drawing outer circle
outerCircle.transition().delay(500).duration(500).style("opacity", 1);
// drawing point on outer circle
pointOnOuterCircle.transition().delay(1000).duration(500).style("opacity", 1);
// drawing chair on the point
//chair.transition().delay(1500).duration(500).style("opacity", 1);
// rotating the chair
var tween = function (d, i, a) {
return d3.interpolateString("rotate(0, 200, 200)", "rotate(360, 200, 200)");
}
var duration = 5000;
//chair.transition().delay(2000).duration(500).attrTween("transform", tween);
pointOnOuterCircle.transition().delay(2000).duration(duration).attrTween("transform", tween);
// fading out the intermediate objects
//pointOnOuterCircle.transition().delay(4000).duration(500).style("opacity", 0);
//outerCircle.transition().delay(4000).duration(500).style("opacity", 0);
function newLoop(){
pointOnOuterCircle.transition().delay(2000).duration(5000).attrTween("transform", tween);
}
setInterval(newLoop, duration);
</script>
</body>
</html>
Outils chauds Tags
Hot Questions
Hot Tools
Collection de bibliothèques d'exécution vc9-vc14 (32 + 64 bits) (lien ci-dessous)
Téléchargez la collection de bibliothèques d'exécution requises pour l'installation de phpStudy
VC9 32 bits
Bibliothèque d'exécution de l'environnement d'installation intégré VC9 32 bits phpstudy
Version complète de la boîte à outils du programmeur PHP
Programmer Toolbox v1.0 Environnement intégré PHP
VC11 32 bits
Bibliothèque d'exécution de l'environnement d'installation intégré VC11 phpstudy 32 bits
SublimeText3 version chinoise
Version chinoise, très simple à utiliser
Sujets chauds





