2017-08-25 283 views
0

我在路徑(x1,y1)和(x2,y2)上有2個點。兩個點都有一個度數角度值(分別爲a1和a2)。當它與相關的(x,y)值相交時,這些點與這些點相交的曲線必須與y軸形成的角度。例如,與點(x1,y1)和(x2,y2)相交的曲線必須具有在點(x1,y1)處的a1度的軌跡,並且還具有在點處的a2度的軌跡(x2,y2)。如何計算兩點之間的平滑曲線,其中曲線的軌跡必須以兩個給定角度開始和結束

我希望編寫一個函數來找到符合上述場景的曲線,但不知道從哪裏開始。任何幫助都將不勝感激。

+1

這是一個沒有代碼的數學問題,你試過了。 –

+1

[Bézier曲線](https://en.wikipedia.org/wiki/B%C3%A9zier_curve) – ASDFGerte

+0

可以從直線段和圓弧中製作這樣一條曲線,直線與它們的弧相切加入。 – dmuir

回答

0

您可以使用bezier創建您想要的曲線。控制點定義了起點和終點處的曲線切線。因此,要設置開始和結束的角度,只需將控制點定義爲沿着角度。

數據

var x1 = ?; // in pixels 
var y1 = ?; 
var x2 = ? 
var y2 = ?; 
var ang1 = ?; // in radians 
var ang2 = ? 

獲取線

var len = Math.hypot(x2-x1,y2-y1); 

的長度獲取角度的矢量,並延伸到約1/3日len

var ax1 = Math.cos(ang1) * len * (1/3); 
var ay1 = Math.sin(ang1) * len * (1/3); 

var ax2 = Math.cos(ang2) * len * (1/3); 
var ay2 = Math.sin(ang2) * len * (1/3); 

然後畫

ctx.beginPath(); 
ctx.moveTo(x1,y1); 
ctx.bezierCurveTo(
    x1 + ax1, y1 + ay1, 
    x2 - ax1, y2 - ay2, 
    x2, y2 
); 
ctx.stroke(); 

請注意,角度必須在大致相同的方向。如果不是,曲線將會越過終點,然後回來。

+0

謝謝,這很有幫助。你爲什麼選擇1/3的長度? – Jailan

+0

@Jailan沒有理由的價值是任意的,可以是任何長度,只要它是> 0 – Blindman67