[英]elements on ellipse edge in d3js
我嘗試將圖像放置在橢圓形邊緣。 但是它們在很大程度上是兩極的。 我有橢圓形:
var oval = group.append("ellipse")
.attr("cx", this.svgWidth / 2)
.attr("cy", this.svgHeight / 2)
.attr("rx", this.rx)
.attr("ry", this.ry)
.style("stroke", "#BCBBB6")
.style("stroke-width", "3px")
.style("fill", "transparent");
我有圖像坐標:
var imgX = Math.cos(that.angle * j) * that.rx - this.model.radius;
var imgY = Math.sin(that.angle * j) * that.ry - this.model.radius;
如何均勻地排列它們?
您不能將圖像添加到ellipse
標記,但可以將圖像設置為橢圓背景,以將圖片添加到您提到的位置,創建circle
然后將圖像設置為它們的背景,如下所示:
var oval = group.append("ellipse")
.attr("cx", this.svgWidth / 2)
.attr("cy", this.svgHeight / 2)
.attr("rx", this.rx)
.attr("ry", this.ry)
.style("stroke", "#BCBBB6")
.style("stroke-width", "3px")
.style("fill", "transparent");
oval.selectAll("circle")
.append("circle")
.attr("cx" ,imgX )
.attr("cy",imgY)
.attr("r","8px")
.attr("fill","Url(#img)");
var imgX = Math.cos(that.angle * j) * that.rx - this.model.radius;
var imgY = Math.sin(that.angle * j) * that.ry - this.model.radius;
UPDATE1
要獲得實際位置,必須將極角更改為笛卡爾角。
var imgX = Math.cos((that.angle)*Math.PI * j/180.0) * that.rx - this.model.radius;
var imgY = Math.sin((that.angle)*Math.PI * j/180.0) * that.ry - this.model.radius;
更新2
我按照您的要求創建了一個樣本,希望對您有所幫助。
var width = 600, height = 600;
var rx = 200, ry = 150;
var circleNumbers = 20;
var svg = d3.select("body").append("svg")
.attr("width", width).attr("height", height)
.attr("transform", "translate(0,150)");
var ellipse = svg.append("ellipse")
.attr("cx", width / 2)
.attr("cy", height / 2)
.attr("rx", rx)
.attr("ry", ry)
.style("stroke", "#BCBBB6")
.style("stroke-width", "3px")
.style("fill", "transparent");
var degree = 360 / circleNumbers;
for (var i = 0; i < circleNumbers; i++) {
var circlePosition = polarToCartesian(width / 2, height / 2, rx, ry, i * degree);
svg.append("circle")
.attr("cx", circlePosition.x)
.attr("cy", circlePosition.y)
.attr("r", "8px")
.attr("fill", "red");
}
此函數在橢圓上以特定程度返回位置:
function polarToCartesian(centerX, centerY, radiusX, radiusY, angleInDegrees) {
var angleInRadians = (angleInDegrees* Math.PI / 180.0);
return {
x: centerX + (radiusX * Math.cos(angleInRadians)),
y: centerY + (radiusY * Math.sin(angleInRadians))
};
}
在此處完成jsfiddle。
更新3
我對PolarToCartesian()
函數進行了一些更改,使橢圓變得更好。我將開始角度更改為-90
,看起來似乎更好。
function polarToCartesian(centerX, centerY, radiusX, radiusY, angleInDegrees) {
var angleInRadians = ((angleInDegrees-90)* Math.PI / 180.0);
return {
x: centerX + (radiusX * Math.cos(angleInRadians)),
y: centerY + (radiusY * Math.sin(angleInRadians))
};
}
在此處完成jsfiddle。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.