İkinci dereceden bir çerçeve çizmek için CoreGraphics kullanıyorum ancak eğrinin min/max değerini bilgisayarla kullanmak istiyorum. Matematiksel bir arka plandan değilim, bu yüzden biraz zahmetli hale geldi. Bunu çözmek için herhangi bir makale veya fikir var mı?CoreGraphics ile en düşük/en yüksek kuadil bezier bulma
cevap
bir kuadratik Bezier için bu aslında oldukça basittir.
Üç denetim noktanızı P0 = (x0,y0)
, P1 = (x1,y1)
ve P2 = (x2,y2)
olarak tanımlayın.
t = (x0 - x1)/(x0 - 2*x1 + x2)
0 <= t <= 1
, o zaman t
adresinden eğrisini değerlendirmek ve Px
olarak yerini saklamak: x
yılında uç değerlerini bulmak için, bu denklemi çözmek.
t = (y0 - y1)/(y0 - 2*y1 + y2)
Yine 0 <= t <= 1
eğer t
adresinden eğrisini değerlendirmek ve Py
olarak yerini saklamak: y
için aynı şeyi yapın. Son olarak, P0
, P2
, Px
(varsa) ve Py
(varsa) içeren eksen hizalama sınırlayıcı kutusunu bulun. Bu sınırlayıcı kutu, 2D quadratic Bezier eğrinizi de sıkı sıkıya bağlayacaktır.
Calculus, sürekli, ayırt edilebilir eğrilerin min/maks değerini bulmak için standart hileler kutusu sunar. İşte
örnek bir tartışma:http://newsgroups.derkeiler.com/Archive/Comp/comp.graphics.algorithms/2005-07/msg00334.html
ben javascript bu bir temsilini yapmış:
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};
}
'P1 = (x2, y2)' başlangıcı, doğru bir yazım hatası olduğu içinde? – kangax
Teşekkürler kangax. Yazım hatası düzeltildi. – Naaff