2015-09-06 107 views
1

我使用html5畫布繪製了一個quardrativecurve並正確繪製了它。我在這裏將多項式曲線轉換爲多邊形

enter image description here

碼附加輸出圖像得出這樣的曲線

var c=document.getElementById("myCanvas"); 
var ctx=c.getContext("2d"); 
ctx.beginPath(); 
ctx.moveTo(20,20); 
ctx.quadraticCurveTo(20,100,200,20); 
ctx.stroke(); 

但現在我想這個quardrativecurve分裂成直線的數量是指使用Java的點數。我怎樣才能做到這一點?請幫幫我。

回答

1

您可以使用下面的代碼將二次方程分成多行。分裂二次曲線分成多個行,你只需要以下信息

1)啓動二次曲線

2)二次曲線的控制點的點。

3)二次曲線的終點。

List<Coordinate> coordinates = new ArrayList<Coordinate>(); 
    Coordinate startPoint = QuadraticCurveTo.getStartPoint();   
    Coordinate controlPoint = QuadraticCurveTo.getControlPoint();  
    Coordinate endPoint_ = QuadraticCurveTo.getEndPoint(); 

    double s = 0; 
    double t = 1; 

    while (s < t) { 
     s += 0.1; 
     double controlParameter = (1 - s); 
     Coordinate Q_0 = new Coordinate(controlParameter * startPoint.getX(), controlParameter * startPoint.getY()).offset(new Coordinate(s * controlPoint.getX(), s * controlPoint.getY()));   
     Coordinate Q_1 = new Coordinate(controlParameter * controlPoint.getX(), controlParameter * controlPoint.getY()).offset(new Coordinate(s * endPoint_.getX(), s * endPoint_.getY())); 
     Coordinate R_0 = new Coordinate(controlParameter * Q_0.getX(), controlParameter * Q_0.getY()).offset(new Coordinate(s * Q_1.getX(), s * Q_1.getY())); 
     coordinates.add(R_0); 
    } 
0

您有二次貝塞爾曲線。可以將曲線分成兩條較小的曲線並重復此過程,直到曲線段足夠平直以便由線段表示。這個過程被稱爲遞歸細分。爲二次曲線這是相當簡單:

初始曲線B與控制點P0,P1,P2
新曲線B」和B‘’已經控制點

P0' = P0 
P1' = 1/2 * (P1 - P0) 
P2' = 1/2 * P1 + 1/4 * (P0 + P2) //correction here 

P0'' = P2' //cut point of subdivision 
P1'' = 1/2 * (P2 - P1) 
P2'' = P2 

人們可以通過估算曲線的平坦性三角形P0P1P2的面積除以P0P2的平方(歐式或曼哈頓距離)。

順便說一下,Windows GDI有方法FlattenPath,它將曲線轉換爲線段序列。或許,FlatteningPathIterator或其他Java方法也可以使用相同的技巧

+0

謝謝你的回答,但你能否告訴我我的詳細資料,以便我能理解。另一點是,四邊形曲線只有一個控制點,你提到了3個控制點。你能舉一個真實的例子嗎? –

+0

3分P0,P1,P2分別爲起點,控制點和終點。並注意我糾正了我在P2公式中的錯誤 – MBo

+0

你可以請分享一些簡單的源代碼嗎? –