簡體   English   中英

在瀏覽器畫布上繪制hermite曲線(javascript)

[英]draw hermite curve on browser canvas (javascript)

我試圖在畫布瀏覽器上繪制隱士曲線。 厄米特曲線用2點和2個導數定義。

Point1X = 71
Point1Y = 165
Deriv1X = -12
Deriv1Y = 2
Point2X = 210
Point2Y = 153
Deriv2X = 108
Deriv2Y = 0

我可以在畫布上畫出貝塞爾曲線。 有沒有什么方法可以將hermite曲線的點和推導轉換為貝塞爾曲線,這樣我就可以在畫布上繪制它?

還有另一種選擇,我可以在瀏覽器上繪制hermite曲線嗎?

感謝幫助。

Canvas2d不支持任意Hermite樣條,但它確實支持三次Bezier曲線,並且由於三次Beziers是二階Hermite曲線,我們可以在您的數據和Bezier曲線之間自由轉換。

可以在Bezier曲線上的這個Primer上找到這樣做的數學,特別是對於這個問題,我們可以將有序的[p1,d1,p2,d2]的Hermite點轉換為:

Hermite points [p1,d1,p2,d2] = Bezier [p1, (p1 + d1/(2*t)), (p2 - d2/(2*t)), p2]

注意, t值是曲線張力並且控制每個點處的曲率順序(張力越高,沿着曲線上點附近的曲線的曲率變化率越高),在這種情況下簡單地為1

(沒有張力值,您的四個坐標實際上定義了平面上的沙漏六邊形區域,而不是單個曲線,因為方向向量不能保證是真正的切線;僅僅是表示行進方向的向量。這些值定義的區域由一側的{start,end}線界定,沿着開始和結束的行進方向具有無限延伸的邊界。

因此,您可以在畫布上的畫布上繪制任何Hermite曲線,使用Canvas2d API繪制三次貝塞爾曲線:

// Hermite data
var p1 = ..., d1 = ..., p2 = ..., d2 = ...;
var cmpoints = [p1.x, p1.y, d1.x, d1.y, p2.x, p2.y, d2.x, d2.y];

// Bezier data
var tension = 1;
var tensionFactor = 2 * tension;
var bpoints = [
  p1.x,
  p1.y,
  p1.x + d1.x/tensionFactor,
  p1.y + d1.y/tensionFactor,
  p2.x - d2.x/tensionFactor,
  p2.y - d2.y/tensionFactor,
  p2.x,
  p2.y
]

// Draw code (where we assume you already
// have your canvas context as "ctx")
ctx.beginPath();
ctx.moveTo.apply(bpoints.slice(0,2));
ctx.bezierCurveTo.apply(bpoints.slice(2);
ctx.stroke();

立方Hermite曲線(由C(0),C'(0),C(1)和C'(1)定義)和三次貝塞爾曲線(由P0,P1,P2和P3定義)可以相互關聯通過

C(0)= P0,
C(1)= P3,
C'(0)= 3(P1-P0),
C'(1)= 3(P3-P2)

因此,您可以找到控制點

P0 = C(0),
P1 =(1/3)* C'(0)+ P0,
P2 = P3-(1/3)* C'(1),
P3 = C(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM