2009-06-16 11 views
5

मैं CoreGraphics उपयोग कर रहा हूँ एक द्विघात बेज़ियर आकर्षित लेकिन कंप्यूटर करने के लिए वक्र के न्यूनतम/अधिकतम मूल्य चाहते हैं के साथ द्विघात बेज़ियर की अधिकतम। मैं गणितीय पृष्ठभूमि से नहीं हूं इसलिए यह थोड़ा परेशान हो गया है। क्या किसी के पास यह हल करने के बारे में कोई लेख या विचार है?ढूँढना मिनट/CoreGraphics

उत्तर

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 डी वर्गिक बेजियर वक्र को कसकर बाध्य करेगा।

+0

'पी 1 = (x2, y2)' में शुरुआत गलत वर्तनी, सही है? – kangax

+0

धन्यवाद कंगैक्स। टाइपो फिक्स्ड। – Naaff

1

मैं जावास्क्रिप्ट में इस का प्रतिनिधित्व बना दिया है:

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}; 
} 
संबंधित मुद्दे