使用Three.js,(尽管我相信这与数学更相关),我有一组2D点可以创建2D几何。例如正方形,矩形,五边形或自定义2D形状。基于原始的2D形状,我想创建一种方法来像附加的图像一样均匀地向内或向外偏移点。
我不知道是否有一种简单的方法可以向内或向外均匀地偏移/增长/缩小2D形状上的所有点(vector3)。如果是这样,我可以将点偏移X距离会很酷吗?有点像是说将2D形状上的点向外或向内偏移X距离。
不,我不是指从中心点缩放。虽然缩放可能适用于对称形状,但对于非对称形状则无效。
谢谢。
答案 0 :(得分:1)
您可以阅读forum thread。
我对ProfiledContourGeometry
进行了一些更改,得到了OffsetContour
,所以我把它留在这里,以防万一,如果有帮助的话:)
function OffsetContour(offset, contour) {
let result = [];
offset = new THREE.BufferAttribute(new Float32Array([offset, 0, 0]), 3);
console.log("offset", offset);
for (let i = 0; i < contour.length; i++) {
let v1 = new THREE.Vector2().subVectors(contour[i - 1 < 0 ? contour.length - 1 : i - 1], contour[i]);
let v2 = new THREE.Vector2().subVectors(contour[i + 1 == contour.length ? 0 : i + 1], contour[i]);
let angle = v2.angle() - v1.angle();
let halfAngle = angle * 0.5;
let hA = halfAngle;
let tA = v2.angle() + Math.PI * 0.5;
let shift = Math.tan(hA - Math.PI * 0.5);
let shiftMatrix = new THREE.Matrix4().set(
1, 0, 0, 0,
-shift, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
let tempAngle = tA;
let rotationMatrix = new THREE.Matrix4().set(
Math.cos(tempAngle), -Math.sin(tempAngle), 0, 0,
Math.sin(tempAngle), Math.cos(tempAngle), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
);
let translationMatrix = new THREE.Matrix4().set(
1, 0, 0, contour[i].x,
0, 1, 0, contour[i].y,
0, 0, 1, 0,
0, 0, 0, 1,
);
let cloneOffset = offset.clone();
console.log("cloneOffset", cloneOffset);
shiftMatrix.applyToBufferAttribute(cloneOffset);
rotationMatrix.applyToBufferAttribute(cloneOffset);
translationMatrix.applyToBufferAttribute(cloneOffset);
result.push(new THREE.Vector2(cloneOffset.getX(0), cloneOffset.getY(0)));
}
return result;
}
随时对其进行修改:)
答案 1 :(得分:1)
对于不包含边缘修改数量的解决方案,我有些疑问。
我在这个项目中遇到了同样的问题,我想确保voronoi细胞之间的距离已知,然后我很快发现比例尺不能满足用例的要求。但是我面临的一个复杂问题是我不得不在while循环中处理的某些边缘的消失。调试是如此困难,以至于我不得不创建一个调试模式以帮助查看点和线,因此我也可以使用它。可以通过以下复选框激活此调试模式:
请注意图片,我将它们作为未嵌入的链接,因为我仍然是新贡献者(以后可能会改进)。
应消失的边缘以红色显示 retraction snapshot1
retraction with edges discard 1
retraction with edges discard 2
在这里有一个正在使用的函数的链接,您可能需要修改它以具有其他点格式: https://github.com/WebSVG/voronoi/blob/8893768e3929ea713a47dba2c4d273b775e0bd82/src/voronoi_diag.js#L278
这里有一个集成了此功能的完整项目的链接,它也有一个现场演示的链接 https://github.com/WebSVG/voronoi