2009-06-16 2 views

답변

3

이차 베 지어를 들어, 이것은 실제로 매우 간단합니다.

세 개의 제어점을 P0 = (x0,y0), P1 = (x1,y1)P2 = (x2,y2)으로 정의하십시오.

t = (x0 - x1)/(x0 - 2*x1 + x2) 

0 <= t <= 1 경우, t에 당신의 곡선을 평가하고 Px로 위치를 저장 : x에서 극값을 찾으려면,이 방정식을 해결한다.

t = (y0 - y1)/(y0 - 2*y1 + y2) 

다시 0 <= t <= 1 경우, t에서 당신의 곡선을 평가하고 Py로 위치를 저장 : y에 대해 같은 일을 할. 마지막으로 P0, P2, Px (발견되는 경우) 및 Py (발견되는 경우)을 포함하는 축 정렬 경계 상자를 찾습니다. 이 경계 상자는 2D 2 차 베 지어 곡선을 단단히 묶을 것입니다.

+0

P1 '= (X2, Y2)'시작 바로 오타가 있습니까? – kangax

+0

감사합니다. kangax. 오타가 수정되었습니다. – Naaff

1

I 자바 스크립트이 표현을 만들었다 :

Jsfiddle link

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}; 
} 
관련 문제