2017-04-04 114 views
0

我使用這個公式沿着二次曲線計算出一系列的點:計算均勻分佈的點沿曲線

// 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緩慢溶液或什麼也不會做。我需要一個適合渲染器的快速解決方案。這不適用於研究或一次性計算!

dashed

編輯:我不問如何實現以上。以上是MY RENDERING!我已經知道如何估計貝塞爾的長度,計算積分的數量,等等,等等。我需要的是一個更好的貝塞爾點插值算法,因爲我有計算沿曲線分佈不均分!

+0

與此類似(HTTP://計算器.COM /問題/ 18244305 /如何對再分發點,均勻,過一個曲線),但我想在JS更簡單的東西和代碼。 –

+0

https://github.com/MadLittleMods/svg-curve-lib, https://gamedev.stackexchange.com/questions/5373/moving-ships-between-two-planets-along-a-bezier-missing- some-equations-for-acce/5427#5427 ....當爲這個查找一個答案甚至沿着一條路徑的速度運動,或類似的東西,這就是我通常如何找到答案 – PAEz

回答

3

要生成二次貝塞爾曲線的等距(由電弧長度)的細分。

所以你需要細分流程和function for calculation of curve length

整個曲線( L),估計( N)鏈段的期望數目,那麼生成的細分點,調整 t參數,以獲得與長度爲約 L/N

例貝塞爾段

查找長度:你發現L = 100並且想要N = 4段。得到t = 1/2,將曲線細分爲兩部分,得到第一部分的長度。如果長度> 50,則減小t並再次細分曲線。重複(使用二分搜索),直到長度值接近50.記住t值並執行相同的過程,以獲得曲線的第一半和第二半長度爲25的段。

+0

我已經這樣做!我需要的是一個更好的貝塞爾點插值算法,因爲我正在做的導致點不均勻分佈! –

+0

你是什麼意思在貝塞爾點插值? – MBo

+0

看看我在文章第一段中提供的等式。我需要更好的版本。提供T值的等式,它提供沿曲線均勻分佈的貝塞爾點的x/y,其中T = 0是起點,T = 1是終點。 –

0

此方法使用three.js所圖書館,這是不是在任擇議定書的問題,但可能是有用的,如果只是爲了看看他們是如何來解決:

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);