我正在使用CoreGraphics繪製二次貝塞爾曲線,但想要計算曲線的最小值/最大值。我不是從數學背景出發的,所以這變得有點麻煩。有沒有人有關於如何解決這個問題的文章或想法?使用CoreGraphics查找二次貝塞爾的最小值/最大值
5
A
回答
3
對於二次貝塞爾,這其實是很簡單的。
將您的三個控制點定義爲P0 = (x0,y0)
,P1 = (x1,y1)
和P2 = (x2,y2)
。要查找x
極值,解決這個方程:
t = (x0 - x1)/(x0 - 2*x1 + x2)
如果0 <= t <= 1
,然後在t
評估你的曲線和存儲位置爲Px
。做同樣的事情y
:
t = (y0 - y1)/(y0 - 2*y1 + y2)
再次,如果0 <= t <= 1
,在t
評估你的曲線和存儲位置爲Py
。最後,找到包含P0
,P2
,Px
(如果找到)和Py
(如果找到)的軸對齊邊界框。這個邊界框也將緊緊地限制你的二維二次貝塞爾曲線。
2
微積分給出了尋找連續,可微分曲線的最小/最大值的標準方法。
下面是一個簡單的討論:
http://newsgroups.derkeiler.com/Archive/Comp/comp.graphics.algorithms/2005-07/msg00334.html
1
我已經作出的這一表示在javascript:
function P(x,y){this.x = x;this.y = y; }
function pointOnCurve(P1,P2,P3,t){
if(t<=0 || 1<=t || isNaN(t))return false;
var c1 = new P(P1.x+(P2.x-P1.x)*t,P1.y+(P2.y-P1.y)*t);
var c2 = new P(P2.x+(P3.x-P2.x)*t,P2.y+(P3.y-P2.y)*t);
return new P(c1.x+(c2.x-c1.x)*t,c1.y+(c2.y-c1.y)*t);
}
function getQCurveBounds(ax, ay, bx, by, cx, cy){
var P1 = new P(ax,ay);
var P2 = new P(bx,by);
var P3 = new P(cx,cy);
var tx = (P1.x - P2.x)/(P1.x - 2*P2.x + P3.x);
var ty = (P1.y - P2.y)/(P1.y - 2*P2.y + P3.y);
var Ex = pointOnCurve(P1,P2,P3,tx);
var xMin = Ex?Math.min(P1.x,P3.x,Ex.x):Math.min(P1.x,P3.x);
var xMax = Ex?Math.max(P1.x,P3.x,Ex.x):Math.max(P1.x,P3.x);
var Ey = pointOnCurve(P1,P2,P3,ty);
var yMin = Ey?Math.min(P1.y,P3.y,Ey.y):Math.min(P1.y,P3.y);
var yMax = Ey?Math.max(P1.y,P3.y,Ey.y):Math.max(P1.y,P3.y);
return {x:xMin, y:yMin, width:xMax-xMin, height:yMax-yMin};
}
相關問題
- 1. 查找最小值的最大值
- 2. 查找最大值/最小值
- 3. 查找局部最小值/最大值
- 4. C查找最大值和最小值?
- 5. 查找最大值和最小值
- 6. 查找最小值和最大值
- 7. 查找最小值和最大值JAVA
- 8. 查找五次數組中的最大值和最小值
- 9. 從二維數組查找最小值和最大值
- 10. 使用循環查找python中的最大值和最小值
- 11. 查找最大羣集的最小值?
- 12. 使用CUBLAS查找最大值和最小值
- 13. Javascript:使用reduce()查找最小值和最大值?
- 14. 如何使用nCr查找最小值和最大值?
- 15. 二次貝塞爾曲線上的最近點
- 16. 查找值的平均值,最大值和最小值進入
- 17. 查找最大,最小和中間值
- 18. 查找最大的5值小於1,最小的5個值
- 19. SQL查詢 - 查找日常最小值,最大值和時間的最小值和最大值發生
- 20. 適合立方貝塞爾曲線的最小二乘法
- 21. 查找本地最小值最小值
- 22. 在Java中查找num值和最小值/最大值值
- 23. 查找用戶輸入的最小值和最大值
- 24. 在bigquery中查找多個值的最小值和最大值
- 25. 三次貝塞爾到二次方
- 26. 如何在Scala中查找笛卡爾座標的最小值和最大值
- 27. 如何找到二次貝塞爾曲線的最佳控制點?
- 28. 查找第一列的最小值和最大值 - 由第二列
- 29. Java int Array:查找平均值,最小值/最大值,排序
- 30. 查找平均值,最小值,最大值和範圍
`P1 =(X2,Y2)`在一開始是一個錯字,是嗎? – kangax 2013-01-31 17:12:11