JSFiddle - React, Tailwind, and code Playground
by Gabriel Z
HTML
<script src="http://d3js.org/d3.v3.min.js"></script>
<body></body>
CSS
#vis{
background-color: steelblue;
}
JavaScript
width = 200 ;
height = 200 ;
var svg = d3.select("body").append("svg").attr("id","vis")
.attr("width", width )
.attr("height", height );
var drag = d3.behavior.drag()
.on("drag", dragmove);
var anchorPoint={"x":width/2,"y":height/2};
var auxvect,ang;
svg.append("rect").attr("fill","red").attr("width",10).attr("height",30).call(drag);
//anchor point circle reference
svg.append("circle").attr("cx",width/2).attr("cy",height/2).attr("r","5");
svg.append("text").attr("transform","translate(20,20)").text("Drag the red rectangle").attr("fill","white");
function dragmove(d) {
//get mouse coordinates
var x = d3.event.x;
var y = d3.event.y;
//get the perpendicular from the vector between the mouse coordinates and the anchorPoint
auxvect ={"x": x-anchorPoint.x,"y":-(y-anchorPoint.y)};
//get the angle between vector (0,1) and auxvect.
//http://stackoverflow.com/questions/12903547/fastest-way-to-find-the-angle-between-two-points
ang= Math.acos( auxvect.x / Math.sqrt(auxvect.x*auxvect.x + auxvect.y*auxvect.y) );
ang = ang * 180 / Math.PI;//in degrees
//transform the rect
if(y<anchorPoint.y){
d3.select(this).attr("transform", "translate(" + x + "," + y + ")rotate("+(-ang)+")");
}else{
d3.select(this).attr("transform", "translate(" + x + "," + y + ")rotate("+(ang)+")");
}
}