[英]Calculate evenly distributed points along a curve
我正在使用此方程式来计算沿二次曲线的一系列点:
// Returns a point on a quadratic bezier curve with Robert Penner's optimization of the standard equation
result.x = sx + t * (2 * (1 - t) * (cx - sx) + t * (ex - sx));
result.y = sy + t * (2 * (1 - t) * (cy - sy) + t * (ey - sy));
可悲的是,这些点分布不均,如下面的虚线所示。 这些点在曲线的中间更密集,并且在边缘附近进一步隔开。 如何计算沿二次贝塞尔曲线的均匀分布的点集?
请注意,我正在使用它来渲染虚线,因此在MATLAB中缓慢的解决方案或其他解决方案将无法实现。 我需要一个适合渲染器的快速解决方案。 这不是为了研究或一次性计算!
编辑:我不是问如何完成上述。 以上是我的翻译! 我已经知道如何估计贝塞尔曲线的长度,计算点的数量等。我需要一种更好的贝塞尔曲线点插值算法,因为我已经计算出了沿曲线分布不均匀的点!
您想要生成二次Bezier曲线的等距(按弧长)细分。
因此,需要细分过程和函数来计算曲线长度 。
找到整个曲线的长度( L
),估计所需的线段数量( N
),然后生成细分点,调整t
参数以获得长度约为L/N
贝塞尔曲线线段
示例:您找到L = 100,并希望N = 4个细分。 得到t = 1/2,将曲线细分为两部分,得到第一部分的长度。 如果长度> 50,则减小t并再次细分曲线。 重复(使用二进制搜索),直到长度值接近50。记住t值,并执行相同的过程以获取曲线的前半部分和后半部分的length = 25的线段。
这种方法使用THREE.js库,该库不在OP的问题中,但是如果仅看一下它们的处理方式,则可能有用:
var curve = new THREE.QuadraticBezierCurve(
new THREE.Vector2( -10, 0 ),
new THREE.Vector2( 20, 15 ),
new THREE.Vector2( 10, 0 )
);
var points = curve.getSpacedPoints(numPoints);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.