CoreGraphics を使用して二次ベジエを描画していますが、曲線の最小/最大値を計算したいと考えています。私は数学のバックグラウンドを持っていないので、これは少し面倒です。これを解決する方法についての記事やアイデアはありますか?
質問する
1966 次
3 に答える
5
二次ベジエの場合、これは実際には非常に単純です。
P0 = (x0,y0)
、P1 = (x1,y1)
およびとして 3 つのコントロール ポイントを定義します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
見つけます。このバウンディング ボックスは、2D 2 次ベジエ曲線もしっかりと結び付けます。
于 2009-07-08T16:52:18.620 に答える
2
微積分は、連続した微分可能な曲線の最小/最大を見つけるためのトリックの標準ボックスを提供します。
これがサンプルディスカッションです。
于 2009-06-16T04:51:35.220 に答える
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};
}
于 2013-07-26T14:11:20.260 に答える