Bu, Bezier eğrilerinin zorunlu olarak işlevleri olmadığı anlamına gelir (tek başına y
değerlerine sahip olabilir (x
). Bu nedenle için t
parametrelerini x0
-koordinatınız olarak bulmanız gerekir.
@ Mike 'Po max' Kamermans gibi. Ayrıca approximation search (ikili aramaya benzer, ancak monoton olmayan fonksiyonlarda da kullanılabilir) kullanımı ile çok daha basit bir matematiksel seçenek gerektirmeyen (ancak daha yavaş olan) daha basit bir seçenek de vardır. Bu C++ kodu gibi örnek bir şey için: o zaman tüm olası puan gerekirse yeni bulunan çözüm sağlanıncaya kadar
double x0,y0; // your point x0 valid y0 not yet
double ax0,ax1,ax2,ax3; // cubic Bezier fx() polynomial coefficients
double ay0,ay1,ay2,ay3; // cubic Bezier fy() polynomial coefficients
double ee,x,t,tt,ttt;
approx aa;
for (aa.init(0.0,1.0,0.025,6,&ee); !aa.done; aa.step()) // search t
{
t = aa.a;
tt = t*t;
ttt = tt*t;
x = ax0 + ax1*t + ax2*tt + ax3*ttt; // compute the x=fx(t)
ee = fabs(x-x0); // compute error of solution for the approximation search
}
// here aa.a holds found `t0`
t = aa.a;
tt = t*t;
ttt = tt*t;
y0 = ay0 + ay1*t + ay2*tt + ay3*ttt; // compute the final y0=fx(t0)
özyinelemeli <0.0,t0)
ve (t0,1.0>
arama aralığını t=<0.0,1.0>
bölmek gerekir.
[edit1] 2D Bezier eğrilerinin olarak (Mike 'Pomax' Kamermans
tarafından istenen) biraz daha fazla bilgi
fonksiyonları koordinat tek x
daha y
değerler olabilir zorunlu değildir. Bu örnekte olduğu gibi:

sayılı mavi noktalar hale 2D Bezier eğrisinin kontrol noktalarıdır. Sarı olanlar yukarıda açıklanan özyineli çözüm buldu. Bunun İşte bazı C++ örnek: orada çözümlerin sonsuz sayıda olduğundan
double x0; // input x coordinate
List<double> y0; // output y coordinates
double ax0,ax1,ax2,ax3; // cubic coefficients
double ay0,ay1,ay2,ay3;
double px0,px1,px2,px3; // control points
double py0,py1,py2,py3;
//---------------------------------------------------------------------------
bool find_point(double t0,double t1,int layer)
{
approx aa;
double ee,x,y,t,tt,ttt,dt;
const double _zero=1e-4;
dt=0.025*(t1-t0); // approximation search step
if (dt<=_zero) return false; // stop if too small interval to search to avoid stack overflows
if (layer>10) return false; // stop if too high recursion layer to avoid stack overflows (this also limits the max found solutions
for (aa.init(t0,t1,dt,6,&ee); !aa.done; aa.step()) // search t
{
t = aa.a;
tt = t*t;
ttt= tt*t;
x = ax0 + ax1*t + ax2*tt + ax3*ttt; // compute the x=fx(t)
ee = fabs(x-x0); // compute error of solution for the approximation search
}
// check the error of found solution
if (aa.e0>_zero) return false;
// here aa.aa holds found `t0`
t = aa.aa;
// check bounds can cross the border a bit
if (t<t0) return false;
if (t>t1) return false;
// add new solution
tt = t*t;
ttt= tt*t;
y = ay0 + ay1*t + ay2*tt + ay3*ttt; // compute the final y0=fx(t0)
y0.add(y); // add to list of solutions
// recursion to check for other solutions by dividing the interval by found solution
if (t0<t-dt) find_point(t0,t-dt,layer+1);
if (t1>t+dt) find_point(t+dt,t1,layer+1);
}
//---------------------------------------------------------------------------
// here usage
void test()
{
// just compute the Bezier cubic polynomials from control points
ax0= ( px0);
ax1= (3.0*px1)-(3.0*px0);
ax2= (3.0*px2)-(6.0*px1)+(3.0*px0);
ax3=( px3)-(3.0*px2)+(3.0*px1)-( px0);
ay0= ( py0);
ay1= (3.0*py1)-(3.0*py0);
ay2= (3.0*py2)-(6.0*py1)+(3.0*py0);
ay3=( py3)-(3.0*py2)+(3.0*py1)-( py0);
// Find the points from mouse x0 coordinate
y0.num=0; // clear found solutions list
find_point(0.0,1.0,0); // recursively found solutions on interval t=<0,1> ,as highest recursion level 0
}
Bu dikey çizgiler ile ilgili bir sorun var ... yerine bunlardan sadece birkaç bulundu edecektir. Aksi halde kullanılması güvenlidir. (sorunsuz bir şekilde çalışması için birçok kontrol ekledi)
biraz daha fazla bilgi gereklidir - farklı bir "y" değeri vermek istediğiniz bir noktanız (x, y) var mı yoksa bir * eğri var mı? (x, y) üzerinde durur ve * tüm eğriyi * değiştirmek istersiniz, böylece en azından sizin (x, y) koordinatınız için, “y” koordinatı istenen hedef değere sahip olur mu? Çünkü ilk durum çok anlamlı görünmüyor, ikinci durumda ise eğrinin ne tür bir eğri olduğu, hedef eğrisinin ne tür bir eğri olduğu, daha fazla noktanın sıraya girip girmeyeceği vb. Hakkında biraz daha fazla ayrıntı gerektiriyor. –
İhtiyacım olan ilk dava; pembe daire içindeki nokta '(1, -0.6)' 'olması gereken '' (1,?)' dır ama 'Y''''nün ne olduğunu bilmiyorum. Neden bu anlamlı değil? Bu noktalardan oluşan bir dizi var, zaten bir yaratığımın alt yarısını yapmak için aynı şeyi yapmaya ihtiyacım var. – Sphynx