Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何在右矩形棱镜(3d矩形)上找到最近点_Algorithm_Geometry - Fatal编程技术网

Algorithm 如何在右矩形棱镜(3d矩形)上找到最近点

Algorithm 如何在右矩形棱镜(3d矩形)上找到最近点,algorithm,geometry,Algorithm,Geometry,如果我有一个右矩形棱镜,其角标记如下 在三维空间中有一个随机点q,假设C中存在向量类型库,点积定义为 double Dot(Vector3 a, Vector3 b) => a.X * b.X + a.Y*b.Y + a.Z*b.Z; double LengthSquared ()=> Dot(this,this); 长度平方定义为 double Dot(Vector3 a, Vector3 b) => a.X * b.X + a.Y*b.Y + a.Z*b.Z; do

如果我有一个右矩形棱镜,其角标记如下


在三维空间中有一个随机点q,假设C中存在向量类型库,点积定义为

double Dot(Vector3 a, Vector3 b) => a.X * b.X + a.Y*b.Y + a.Z*b.Z;
double LengthSquared ()=> Dot(this,this);
长度平方定义为

double Dot(Vector3 a, Vector3 b) => a.X * b.X + a.Y*b.Y + a.Z*b.Z;
double LengthSquared ()=> Dot(this,this);
将点投影到超矩形的每个独立轴上以查找 投影的标量参数。然后在第二个点饱和标量参数 面的限制。然后将各分量相加得到答案

public Vector3 ClosestPointTo
    (Vector3 q, Vector3 origin, Vector3 v100, Vector3 v010, Vector3 v001)
{
    var px = v100;
    var py = v010;
    var pz = v001;

    var vx = (px - origin);
    var vy = (py - origin);
    var vz = (pz - origin);

    var tx = Vector3.Dot( q - origin, vx ) / vx.LengthSquared();
    var ty = Vector3.Dot( q - origin, vy ) / vy.LengthSquared();
    var tz = Vector3.Dot( q - origin, vz ) / vz.LengthSquared();

    tx = tx < 0 ? 0 : tx > 1 ? 1 : tx;
    ty = ty < 0 ? 0 : ty > 1 ? 1 : ty;
    tz = tz < 0 ? 0 : tz > 1 ? 1 : tz;

    var p = tx * vx + ty * vy + tz * vz + origin;

    return p;
}
public Vector3 ClosestPointTo
(矢量3 q、矢量3原点、矢量3 v100、矢量3 v010、矢量3 v001)
{
var-px=v100;
var py=v010;
var pz=v001;
var vx=(px-原点);
变量vy=(py-原点);
var vz=(pz-原点);
var tx=Vector3.Dot(q-原点,vx)/vx.LengthSquared();
var ty=Vector3.Dot(q-原点,vy)/vy.LengthSquared();
var tz=Vector3.Dot(q-原点,vz)/vz.LengthSquared();
tx=tx<0?0:tx>1?1:tx;
ty=ty<0?0:ty>1?1:ty;
tz=tz<0?0:tz>1?1:tz;
var p=tx*vx+ty*vy+tz*vz+原点;
返回p;
}