我正在尝试制作一个将元素定向到点击的功能。代码有效(方向角度很好),但是在旋转之前有一个平移,可以将元素放置在合适的位置并根据它们的中心进行旋转。
抱歉,如果我的代码不好,我的数学不好,我使用了一些教程来使它工作。该函数将元素定向和他在容器中的偏移位置。
function refresh(scot, offSetX, offSetY){
// récupére et traite l'id
var id = scot.attr("id")
var sid = id.substring(0, id.length-6);
// dimensions et positions scot courant (curent element to orient)
var w1 = _scotDim[sid+"Points"][0]/2;
var h1 = _scotDim[sid+"Points"][1]/2;
var x1 = _initPos[sid+"Points"][0];
var y1 = _initPos[sid+"Points"][1];
var x1prim = _initPos[sid+"Points"][0]+offSetX;
var y1prim = _initPos[sid+"Points"][1]+offSetY;
// dimensions et positions du scot vers lequel se tourner (target element to focus)
var w2 = _scotDim[dadID+"Points"][0]/2;
var h2 = _scotDim[dadID+"Points"][1]/2;
var x2 = _initPos[dadID+"Points"][0];
var y2 = _initPos[dadID+"Points"][1];
var x2prim = _initPos[dadID+"Points"][0]+offSetX;
var y2prim = _initPos[dadID+"Points"][1]+offSetY;
// calcul de la différence entre les positions du scot courant et du scot vers lequel se tourner
var p1x = x1+w1+_offSetX;// position du scot courant
var p1y = y1+h1+_offSetY;
var p2x = x2+w2+_offSetX;// position du scot vers lequel s'orienter
var p2y = y2+h2+_offSetY;
// calcul de l'orientation à appliquer sur le scot courant
var p1xprim = x1prim+w1;
var p1yprim = y1prim+h1;
var p2xprim = x2prim+w2;
var p2yprim = y2prim+h2;
var deltax = p2xprim - p1xprim;
var deltay = p2yprim - p1yprim;
// valeur de la rotation à appliquer
var anglInDegrees = Math.atan2(deltay, deltax) * 180 / Math.PI;
//console.log(sid+" : Orientation>>"+anglInDegrees+" // Position x/y>>"+p1x+"/"+p1y);
// animation du scot courant (translation et rotation)
d3.select("#"+sid+"Bulle").transition().duration(320)
.attr("transform", function(){
return "translate("+offSetX+", "+offSetY+") rotate("+anglInDegrees+", "+p1x+", "+p1y+")";
})
.delay(50).style("opacity", 1);
// fait disparaitre la bulle du scot cliqué
if(dadID+"Points" == id){
d3.select("#"+sid+"Bulle").transition().duration(400)
.style("opacity", 0);
}
}
就是这一行:
d3.select("#"+sid+"Bulle").transition().duration(320)
.attr("transform", function(){
return "translate("+offSetX+", "+offSetY+") rotate("+anglInDegrees+", "+p1x+", "+p1y+")";
进行转换,其余代码都很好。这只是平移/旋转的连续性,不会产生我想要的效果。 在每次单击时,我们可以在旋转之前看到一点过渡(理论上,这种平移只是放置元素以便根据它们的中心进行旋转)
您可以在此处查看实际结果:http ://www.pixelreseller.com/d3giro/ 单击圆形地图以启动动画。
ps:对不起,如果我的语言不好。并要求添加信息。