【发布时间】:2019-12-18 00:57:34
【问题描述】:
我必须实现一个圆近似的想法,它是一个有 N 个角的正多边形,而 N 是由用户定义的。
例如,如果 N=3,我将有一个三角形。当 n=5 时,我会得到一个开始类似于圆形的形状。随着 N 的增加,我会越来越接近圆形。
这个想法与在以下问题/解决方案中提出和回答的内容非常相似: Draw regular polygons inscribed in a circle 但是,他们使用的是 raphael.js 而不是 D3.js。
我想做什么:
var vis = d3.select("body").append("svg")
.attr("width", 1000)
.attr("height", 667);
var svg = d3.select('svg');
var originX = 200;
var originY = 200;
var outerCircleRadius = 60;
var outerCircle = svg.append("circle").attr({
cx: originX,
cy: originY,
r: outerCircleRadius,
fill: "none",
stroke: "black"
});
var chairWidth = 10;
var chairOriginX = originX + ((outerCircleRadius) * Math.sin(0));
var chairOriginY = originY - ((outerCircleRadius) * Math.cos(0));
var chair = svg.append("rect").attr({
x: chairOriginX - (chairWidth / 2),
y: chairOriginY - (chairWidth / 2),
width: chairWidth,
opacity: 1,
height: 20,
fill: "none",
stroke: "blue"
});
var n_number = 5
var n_angles = 360/n_number
var angle_start=0;
var angle_next;
console.log(chair.node().getBBox().x);
console.log(chair.node().getBBox().y);
chair.attr("transform", "rotate(" + (angle_start+n_angles+n_angles) + ", 200, 200)");
var circle = svg.append("circle")
.attr("cx", 195)
.attr("cy", 135)
.attr("r", 50)
.attr("fill", "red");
var chairOriginX2 = originX + ((outerCircleRadius) * Math.sin(0));
var chairOriginY2 = originY - ((outerCircleRadius) * Math.cos(0));
var chair2 = svg.append("rect").attr({
x: chairOriginX2 - (chairWidth / 2),
y: chairOriginY2 - (chairWidth / 2),
width: chairWidth,
opacity: 1,
height: 20,
fill: "none",
stroke: "blue"
});
console.log(chair2.node().getBBox().x);
console.log(chair2.node().getBBox().y);
我的想法,但没有奏效,试图创建一个圆(“outerCircle”),我将在圆的圆周(“chair.attr(“transform”...”))内滑动,基于 N , 获得几个不同的 (x,y) 坐标。 然后,我会将 (x,y) 坐标提供给多边形。
我相信我解决这个问题的方法是错误的。此外,我卡住的部分是我无法继续在圆周上滑动并存储每个不同的 (x,y) 坐标。我试过“console.log(chair2.node().getBBox().x);”但它总是存储相同的坐标,它是原点。
【问题讨论】:
-
不管你用什么库,逻辑还是一样的,jsfiddle.net/8h2mgoz6
标签: javascript d3.js svg