OBB方向包圍盒
計算OBB其中將找到曲線的旋轉角度和位置,從而使它們旋轉的一個,這樣便開始在相同的位置並具有相同的方向。
如果OBB尺寸太差,那麼曲線就不同了。
對於上面的例子中它yealds這個結果:
每個OBB由開始點和P
基本向量U,V
定義,其中的U x V
爲正|U|>=|V|
和z座標。這將確保所有OBB的繞組相同。它可以在OBBox_compute
加入這年底完成:
// |U|>=|V|
if ((u.x*u.x)+(u.y*u.y)<(v.x*v.x)+(v.y*v.y)) { _pnt2D p; p=u; u=v; v=p; }
// (U x V).z > 0
if ((u.x*v.y)-(u.y*v.x)<0.0)
{
p0.x+=v.x;
p0.y+=v.y;
v.x=-v.x;
v.y=-v.y;
}
所以curve0
有p0,u0,v0
和curve1
有p1,u1,v1
。
現在我們要重新調整,平移和旋轉curve1
匹配curve0
它可以這樣做:
// compute OBB
OBBox_compute(p0,u0,v0,curve0.dat,curve0.num);
OBBox_compute(p1,u1,v1,curve1.dat,curve1.num);
// difference angle = - acos((U0.U1)/(|U0|.|U1|))
a=-acos(((u0.x*u1.x)+(u0.y*u1.y))/(sqrt((u0.x*u0.x)+(u0.y*u0.y))*sqrt((u1.x*u1.x)+(u1.y*u1.y))));
// rotate curve1
for (pp=curve1.dat,i=0;i<curve1.num;i++,pp++)
rotate2D(a,p1.x,p1.y,pp->x,pp->y);
// rotate OBB1
rotate2D(a,0.0,0.0,u1.x,u1.y);
rotate2D(a,0.0,0.0,v1.x,v1.y);
// translation difference = P0-P1
x=p0.x-p1.x;
y=p0.y-p1.y;
// translate curve1
for (pp=curve1.dat,i=0;i<curve1.num;i++,pp++)
{
pp->x+=x;
pp->y+=y;
}
// translate OBB1
p1.x+=x;
p1.y+=y;
// scale difference = |P0|/|P1|
x=sqrt((u0.x*u0.x)+(u0.y*u0.y))/sqrt((u1.x*u1.x)+(u1.y*u1.y));
// scale curve1
for (pp=curve1.dat,i=0;i<curve1.num;i++,pp++)
{
pp->x=((pp->x-p0.x)*x)+p0.x;
pp->y=((pp->y-p0.y)*x)+p0.y;
}
// scale OBB1
u1.x*=x;
u1.y*=x;
v1.x*=x;
v1.y*=x;
您可以使用Understanding 4x4 homogenous transform matrices做到這一切在一個步驟。這裏的結果:
你應該用'[算法]'如果你想要的東西通用的,或者你應該指定編程語言,你想將其標記爲實現這一點,並提供您當前的結果。 –
謝謝你的建議。我正在寫自由軟件,如scilab或八度。 – anna95