首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个向量的交集

两个向量的交集
EN

Stack Overflow用户
提问于 2018-01-13 13:03:56
回答 1查看 683关注 0票数 0

有没有有效的方法来寻找两个向量之间的交集?光线是无限的,所以一种方法是将一个矢量转换为光线,找到该光线和其他矢量的交点。如果有交集,求交集和第一个向量之间的距离。如果它是0,那么两个向量之间有交集,如果我没有遗漏什么的话。但是在three.js中有更好的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2018-01-13 20:56:02

正如您提到的,这更像是一个数学问题,而不是three.js问题,您可以在Ray对象上使用现有方法,然后从那里开始解决,但我怀疑这是否是最优的,因为您关心的是性能。

正确的方法可能是确定两个线段之间的最短距离,如果该距离为零,则它们相交。您可以在该主题上找到类似的讨论:The Algorithm to Find the Point of Intersection of Two 3D Line Segment

我找到了一个C算法,它可以很容易地转换成here

代码语言:javascript
复制
typedef struct {
  double x,y,z;
} XYZ;

/*
 Calculate the line segment PaPb that is the shortest route between
 two lines P1P2 and P3P4. Calculate also the values of mua and mub where
 Pa = P1 + mua (P2 - P1)
 Pb = P3 + mub (P4 - P3)
 Return FALSE if no solution exists.
 */
int LineLineIntersect(
  XYZ p1,XYZ p2,XYZ p3,XYZ p4,XYZ *pa,XYZ *pb,
double *mua, double *mub)
{
  XYZ p13,p43,p21;
  double d1343,d4321,d1321,d4343,d2121;
  double numer,denom;

  p13.x = p1.x - p3.x;
  p13.y = p1.y - p3.y;
  p13.z = p1.z - p3.z;
  p43.x = p4.x - p3.x;
  p43.y = p4.y - p3.y;
  p43.z = p4.z - p3.z;
  if (ABS(p43.x) < EPS && ABS(p43.y) < EPS && ABS(p43.z) < EPS)
    return(FALSE);
  p21.x = p2.x - p1.x;
  p21.y = p2.y - p1.y;
  p21.z = p2.z - p1.z;
  if (ABS(p21.x) < EPS && ABS(p21.y) < EPS && ABS(p21.z) < EPS)
    return(FALSE);

  d1343 = p13.x * p43.x + p13.y * p43.y + p13.z * p43.z;
  d4321 = p43.x * p21.x + p43.y * p21.y + p43.z * p21.z;
  d1321 = p13.x * p21.x + p13.y * p21.y + p13.z * p21.z;
  d4343 = p43.x * p43.x + p43.y * p43.y + p43.z * p43.z;
  d2121 = p21.x * p21.x + p21.y * p21.y + p21.z * p21.z;

  denom = d2121 * d4343 - d4321 * d4321;
  if (ABS(denom) < EPS)
    return(FALSE);
  numer = d1343 * d4321 - d1321 * d4343;

*mua = numer / denom;
*mub = (d1343 + d4321 * (*mua)) / d4343;

    pa->x = p1.x + *mua * p21.x;
    pa->y = p1.y + *mua * p21.y;
    pa->z = p1.z + *mua * p21.z;
    pb->x = p3.x + *mub * p43.x;
    pb->y = p3.y + *mub * p43.y;
    pb->z = p3.z + *mub * p43.z;

  return(TRUE);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48237077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档