gpt4 book ai didi

javascript - D3.js 完全在 svg 容器内创建三 Angular 形

转载 作者:行者123 更新时间:2023-11-28 15:05:08 25 4
gpt4 key购买 nike

我必须在随机位置创建 30 个三 Angular 形;对于形状,我使用 d3.symbolTriangle,我可以通过 attr("d",triangle.size(dim) 设置它的尺寸,这应该是三 Angular 形的面积。问题是有些三 Angular 形并不完全在 svg 容器内,它有一些边框,并且这些三 Angular 形的某些部分在外部(参见图片)。如何将它们强制放入容器内,例如使用 x 像素的边距?这是我的代码:

 var width = window.innerWidth;
var height = window.innerHeight;
var triangle = d3.symbol()
.type(d3.symbolTriangle);

function drawTriangles(number) {
for(var i=0;i<number;i++){
var dim = Math.random()*300;
console.log("Path: "+i+", dim: "+dim);
svg.append("path")
.attr("d", triangle.size(dim))
.attr("transform", function(d) { return "translate(" + Math.random()*width + "," + Math.random()*height + ")"; })
.attr("fill", "rgb("+parseInt(Math.random()*255)+","+parseInt(Math.random()*255)+","+parseInt(Math.random()*255)+")")
.attr("opacity", 2)
.attr("class", "path"+i);
}
}

这是 fiddle :https://jsfiddle.net/jjr3kqao/

您可以看到不在容器内的蓝色三 Angular 形: Effect

最佳答案

设置元素边界框的平移值后,您可以轻松使用元素边界框的大小。

这很奇怪,但是对于完全位于 svg 内部的三 Angular 形,使用 bbox 高度不起作用。形状宽度比其高度大几个像素,并且在计算中使用该值是可行的。

var width = 250;
var height = 250;
var number = 30;
var borderSize = 1;
var body = d3.select("body");
var triangle = d3.symbol()
.type(d3.symbolTriangle);

var svg = body.append("svg")
.attr("width", width)
.attr("height", height)
.style("border", "1px solid black");


function drawTriangles(number) {
for (var i = 0; i < number; i++) {
var dim = Math.random() * 300;
svg.append("path")
.attr("d", triangle.size(dim))
.attr("transform", function (d) {
var boundingBox = this.getBBox();
var elementWidth = Math.ceil(boundingBox.width);
var randomXOffset = Math.random() * (width - elementWidth - 2 * borderSize) + elementWidth/2 + borderSize;
var randomYOffset = Math.random() * (height - elementWidth - 2 * borderSize) + elementWidth/2 + borderSize;
return "translate(" + randomXOffset + "," + randomYOffset + ")";
})
.attr("fill", "rgb(" + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + "," + parseInt(Math.random() * 255) + ")")
.attr("opacity", 2)
.attr("class", "path" + i);
}
}

drawTriangles(number);
<script src="https://d3js.org/d3.v4.min.js"></script>

<body>
</body>

关于javascript - D3.js 完全在 svg 容器内创建三 Angular 形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39318090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com