I am making a d3.js graph where when i click on a image the group rotates and the clicked image comes on top. I am having 2 problems: 1. The images are not properly aligned (not a major issue) 2. Images also rotates when group rotates.
How to keep images unrotated. I visited the link Keeping text horizontal while it's position is rotating with d3.js. But i was unable to resolve this issue.
This is my fiddle. https://jsfiddle.net/swc7uopf/
Below is my code
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class = "graphs" id="circular"></div>
<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script>
function circular_chart(data){
var width = 500;
var height = 500;
var length = 0
function circle(selection){
selection.each(function(){
svg = d3.select(this)
.append('svg')
.attr('width',width)
.attr('height',height)
.append('g')
.attr('transform','translate(' + width/2+ ','+height/2 + ')')
.append('g');
circle = svg.append('circle')
.attr('cx',0)
.attr('cy',0)
.attr('r',200)
.style('fill','none')
.style('stroke','black');
var chairOriginX = 0 + ((250) * Math.sin(0));
var chairOriginY = 0 - ((250) * Math.cos(0));
length = data.length;
function position_x(d,i){
radius = 200
angle = (i / (data.length/2)) * Math.PI;
x = (radius * Math.sin(angle));
y = (-radius * Math.cos(angle));
return x
}
function position_y(d,i){
radius = 200
angle = (i / (data.length/2)) * Math.PI;
x = (radius * Math.sin(angle));
y = (-radius * Math.cos(angle));
// nodes.push({'id': i, 'x': x, 'y': y});
return y
}
images = svg.selectAll('image')
.data(data)
.enter()
.append('svg:image')
.attr('xlink:href',function(d){return d.Image_Url})
.attr('x',function(d,i){return position_x(d,i)})
.attr('y',function(d,i){return position_y(d,i)})
.attr('width',50)
.attr('height',50)
.attr('id',function(d,i){return i});
images.on('click',function(d){
// debugger;
angle = -(360*this.id)/(data.length);
svg.transition().duration(2000).attr('transform','rotate('+angle+',0,0)')
images.attr('transition','rotate('+angle+',0,0)')
})
});
}
return circle;
}
data = [{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'},
{"Image_Url":'https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Jnehru.jpg/800px-Jnehru.jpg'}]
cir = circular_chart(data)
d3.select('#circular').call(cir)
</script>
Also, i would like to know is there a way by which i can individually rotate each image along circular path (if i create one) because this gives me much more functionality.