gpt4 book ai didi

javascript - 2 条 SVG 路径的交集

转载 作者:行者123 更新时间:2023-11-30 15:32:10 26 4
gpt4 key购买 nike

我需要检查两个 SVG 路径元素是否相交。使用 .getBBox() 检查边界框的交集太不准确了。我目前正在做的是用 .getTotalLength() 迭代两条路径,然后检查两个点 .getPointAtLength() 是否相等。

下面是一个片段,但如您所见,它非常慢并且会阻塞浏览器选项卡。必须有一种更有效的方法来检查两条路径之间的交叉点。

var path1 = document.getElementById("p1");
var path2 = document.getElementById("p2");
var time = document.getElementById("time");
var btn = document.getElementById("start");
btn.addEventListener("click", getIntersection);

function getIntersection() {
var start = Date.now();
for (var i = 0; i < path1.getTotalLength(); i++) {
for (var j = 0; j < path2.getTotalLength(); j++) {
var point1 = path1.getPointAtLength(i);
var point2 = path2.getPointAtLength(j);

if (pointIntersect(point1, point2)) {
var end = Date.now();
time.innerHTML = (end - start) / 1000 + "s";
return;
}
}

}
}

function pointIntersect(p1, p2) {
p1.x = Math.round(p1.x);
p1.y = Math.round(p1.y);
p2.x = Math.round(p2.x);
p2.y = Math.round(p2.y);
return p1.x === p2.x && p1.y === p2.y;
}
svg {
fill: none;
stroke: black;
}
#start {
border: 1px solid;
display: inline-block;
position: absolute;
}
<div id="start">Start
</div>
<svg xmlns="http://www.w3.org/2000/svg">
<path d="M 50 10 c 120 120 120 120 120 20 z" id="p1"></path>
<path d="M 150 10 c 120 120 120 120 120 20 z" id="p2"></path>
</svg>
<div id="time"></div>

最佳答案

我不确定,但如果您可以从路径中提取向量和曲线,则可以通过数学方式解决这个问题。但是,可以通过缓存一条路径中的点并减少对 getTotalLengthgetPointAtLength 的调用次数来优化您的函数。

function getIntersection() {
var start = Date.now(),
path1Length = path1.getTotalLength(),
path2Length = path2.getTotalLength(),
path2Points = [];

for (var j = 0; j < path2Length; j++) {
path2Points.push(path2.getPointAtLength(j));
}

for (var i = 0; i < path1Length; i++) {
var point1 = path1.getPointAtLength(i);

for (var j = 0; j < path2Points.length; j++) {
if (pointIntersect(point1, path2Points[j])) {
var end = Date.now();
time.innerHTML = (end - start) / 1000 + "s";
return;
}
}
}
}

这可以在大约 0.07 秒而不是 4-5 秒内计算出示例路径。

jsfiddle

关于javascript - 2 条 SVG 路径的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42070839/

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