有两个Point3D( A 和 B ),我想计算线周围的长方体(a,b,c ... h)的点数在 A 和 B 之间,如船体:
有一个自由度,长方体的角度,因为它可以绕 AB 线旋转。我不确定这是否是一个问题。
我尝试计算一个正常 AB , D 的矢量,然后计算 AB ⨯ AD的叉积 = E 。在代码中, C 是 A - B ,因此其偏移平行于 AB 。
我对这三个向量( C , D 和 E )进行了规范化,然后将其与偏移量相乘以从 A 和 B 。它还没有完成工作。
编辑:请参阅ja72的解决方案代码
我还实现了一种寻找法向量的方法:
double ax = Vector3D.AngleBetween(E, new Vector3D(1, 0, 0));
double ay = Vector3D.AngleBetween(E, new Vector3D(0, 1, 0));
double az = Vector3D.AngleBetween(E, new Vector3D(0, 0, 1));
ax = Math.Abs(ax - 90);
ay = Math.Abs(ay - 90);
az = Math.Abs(az - 90);
if (ax <= ay & ax <= az)
{
n = Vector3D.CrossProduct(E, new Vector3D(1, 0, 0));
}
else if (az <= ax && az <= ay)
{
n = Vector3D.CrossProduct(E, new Vector3D(0, 0, 1));
}
else
{
n = Vector3D.CrossProduct(E, new Vector3D(0, 1, 0));
}
n = normalize(n);
答案 0 :(得分:3)
您需要两个方向向量。一个是
给出的 AB 行Vector3D e = Normalize(B-A)
和一个描述横截面的“向上”方向。这可以给出,或者可以使用以下算法计算(优先选择+ y)
if( e.X != 0 || e.Z != 0 )
{
// choose direction perpendicular to line closest to +y direction
Vector3D n = [-e.X*e.Y, e.X*e.X+e.Z*e.Z, -e.Z*e.Y];
} else {
// if line along +y already then choose +z for up vector
Vector3D n = [ 0, 0, 1];
}
现在您可以计算第三个方向以形成坐标系
Vector3D k = Normalize( Cross(e,n) )
然后组装3×3旋转矩阵,用
将局部坐标转换为世界坐标 | k.X n.X e.X |
R = | k.Y n.Y e.Y |
| k.Z n.Z e.Z |
局部坐标沿线的方向为+ z,使
Point3D a = A + R*[w,h,0]
Point3D b = A + R*[-w,h,0]
Point3D c = A + R*[w,-h,0]
Point3D d = A + R*[-w,-h,0]
Point3D e = B + R*[w,h,0]
Point3D f = B + R*[-w,h,0]
Point3D g = B + R*[w,-h,0]
Point3D h = B + R*[-w,-h,0]
其中R*[x,y,z]
指定矩阵向量乘法,w
和h
是矩形横截面的宽度和高度,A
,B
是 A 和 B 位置向量。向量之间的加法是逐个元素。
我已经在我自己的代码中检查了代码,但它确实有效。 vec3
是3D矢量的别名,mat3
是3×3矩阵的别名。
vec3 u=(B-A).Normalized();
vec3 n = vec3.O;
if(Math.Abs(u.X)<=Math.Abs(u.Y)&&Math.Abs(u.X)<=Math.Abs(u.Z))
{
n=new vec3(u.Y*u.Y+u.Z*u.Z, -u.Y*u.X, -u.Z*u.X);
}
else if(Math.Abs(u.Y)<=Math.Abs(u.X)&&Math.Abs(u.Y)<=Math.Abs(u.Z))
{
n=new vec3(-u.X*u.Y, u.X*u.X+u.Z*u.Z, -u.Z*u.Y);
}
else if(Math.Abs(u.Z)<=Math.Abs(u.X)&&Math.Abs(u.Z)<=Math.Abs(u.Y))
{
n=new vec3(-u.X*u.Z, -u.Y*u.Z, u.X*u.X+u.Y*u.Y);
}
vec3 v=n.Cross(u);
mat3 R=mat3.Combine(v, n, u);
var a=A+R*new vec3(wt, ht, 0);
var b=A+R*new vec3(-wt, ht, 0);
var c=A+R*new vec3(wt, -ht, 0);
var d=A+R*new vec3(-wt, -ht, 0);
var e=B+R*new vec3(wt, ht, 0);
var f=B+R*new vec3(-wt, ht, 0);
var g=B+R*new vec3(wt, -ht, 0);
var h=B+R*new vec3(-wt, -ht, 0);
答案 1 :(得分:2)
我不能给你一段真正的代码,但我可以给你一个想法。
好吧,假设你已经有一个合适的长方体。我的意思是它有正确的宽度和高度。 让我们在飞机上找到它xy。之后,您需要将其偏移到中心(减去偏移矢量)。最后一件事是根据你的线旋转来旋转它。
再次:
您可以使用矩阵乘法来实现此转换。