Rect3D / Plane的3D Line / Vector交点

时间:2016-09-08 08:01:36

标签: c# wpf math vector 3d

我在Point3D BoundingBox中有Vector3D和方向Rect3D。我想扩展Point unitl它“点击”Rect3D然后获得将向量扩展50 的点。有人可以帮助我找到计算这个的方法吗?

类似的东西:

public Point3D CalculatePoint(Point3D innerPoint, Rect3D rect, double extendOutside)

enter image description here

1 个答案:

答案 0 :(得分:1)

如果你给了一个方框并根据它的8个顶点A-H定义它,其6个面被定义为例如:

ABC
ADE
FBC
FGH
DGH
ABE

和由方向向量<vx,vy,vz>和点(x0,y0,z0)定义的直线 你可以通过它们中的每一个来获得线相交的2个不同的点。所以给出一个点,方向向量和框的3个顶点......

//p0 is point on line
//direction is direction vector of line
//A,B,C are points on plane
Vector3 lpIntersect(Vector3 p0, Vector3 direction, Vector3 A, Vector3 B, Vector3 C){
    Vector3 n = (B - C).cross(C - A);
    Vector3 num = (p0-A)*n;
    Vector3 denom = direction*n;
    if((num.x==0 && num.y==0 && num.z==0) ||
       (denom.x==0 && denom.y==0 && denom.z==0))
        return Vector3(0,0,0);
    return num/denom;
}

一旦你得到2分,就称他们为(Ax,Ay,Az)(Bx,By,Bz)以及该行的等式

x = x0 + vx*t
y = y0 + vy*t
z = z0 + vz*t

您可以通过插入以上几点并解决t以获取例如(x-x0)/vx以及t>=0然后检查以查看您指向的方向要点是你给的方向,否则它是另一点:

if (((Ax-x0)/vx)>=0){
    x = Ax + vx*50;
    y = Ay + vy*50;
    z = Az + vz*50;
}
else{
    x = Bx + vx*50;
    y = By + vy*50;
    z = Bz + vz*50;
}