线上的 3D 垂直点来自 3D 点 [英] 3D Perpendicular Point on Line From 3D point

查看:33
本文介绍了线上的 3D 垂直点来自 3D 点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题之前已经问过关于 2D 的问题.这个问题将其扩展到 3D.如何从 3D 空间中的一个点找到一条线上的垂直相交点?.如果我的线由点 (x1,y1,z1) & 定义(x2,y2,z2) 并且我在空间中有一个点 (x3,y3,z3).

如何在 (x3,y3,z3) 的直线上找到点 (x4,y4,z4) 的垂直交点?

解决方案

对于初学者来说,您几乎需要一些 Vector3 类的实现,无论您是否编写自己的,都可以在Internet 某处,或使用包含类似 XNASharp3D.Math.

通常,3d 空间中的线不是由两点表示,而是由参数方程表示,并由向量而不是标量进行运算.您的参数方程将采用以下形式:

x = x1 + t(x2-x1), y = y1 + t(y2-y1), z = z1 + t(z2-z1)

向量ut的系数定义..

矢量 PQ 由您选择的点 Q 减去直线上的点 P 定义.可以选择线上的任何点,因此最简单的方法是使用 t = 0 线,它简化为 x1、y1 和 z1.<x3-x1, y3-y1, z3-z1>

3-space中点到线最短距离的定义如下:

<块引用>

D = ||PQ x u||/||u||

其中 x 是叉积运算符,||... || 获取包含向量的大小.根据您选择的库,您的代码可能会有所不同,但应该非常相似:

Vector3 u = new Vector3(x2 - x1, y2 - y1, z2 - z1);Vector3 pq = new Vector3(x3 - x1, y3 - y1, z3 - z1);浮动距离 = Vector3.Cross(pq, u).Length/u.Length;

编辑:我刚刚意识到您想要实际的交点,而不是距离.找到实际点的公式有点不同.您需要使用内积空间来获得 u 垂直于 PQ 的分量.为此,您需要在 PQ 的方向上找到 u 的分量:

((PQ · u)/||u||^2) * u

这让我们得到了 w1 组件,但我们想要 w2,它是 Q 和线之间的组件:

<块引用>

PQ = w1 + w2

w2 = PQ - w1

从那里,我们取 w2 并将其添加到点 Q 上以获得最接近 Q 的线上的点.在代码中,这将是:

Vector3 p1 = new Vector3(x1, y1, z1);Vector3 p2 = new Vector3(x2, y2, z2);Vector3 q = new Vector3(x3, y3, z3);向量3 u = p2 - p1;Vector3 pq = q - p1;Vector3 w2 = pq - Vector3.Multiply(u, Vector3.Dot(pq, u)/u.LengthSquared);矢量 3 点 = q - w2;

其中 point.Xx4point.Yy4point.Zz4.

This question has been asked before in reference to 2D. This question extends it to 3D. How do I find the perpendicular intersected point on a line from a point in 3D space?. If my line is defined by points (x1,y1,z1) & (x2,y2,z2) and I have a point (x3,y3,z3) in space.

How do I find the perpendicular intersection of point (x4,y4,z4) on the line from (x3,y3,z3)?

解决方案

For starters, you pretty much need some implementation of a Vector3 class, whether you write your own, find a standalone implementation on the internet somewhere, or use a library that contains one like XNA or Sharp3D.Math.

Typically lines in 3d space are not represented by two points, but by parametric equations and operated on by vectors and not scalars. Your parametric equation would be of the form:

x = x1 + t(x2-x1), y = y1 + t(y2-y1), z = z1 + t(z2-z1)

The vector u is defined by the coefficients of t. <x2-x1, y2-y1, z2-z1>.

The vector PQ is defined by your chosen point Q minus a point P on the line. Any point on the line can be chosen, so it would be simplest to just use the line t = 0, which simplifies to x1, y1, and z1. <x3-x1, y3-y1, z3-z1>

The definition of the shortest distance between a point and a line in 3-space is as follows:

D = ||PQ x u|| / ||u||

Where x is the cross product operator, and || ... || gets the magnitude of the contained vector. Depending on which library you choose, your code may vary, but it should be very similar:

Vector3 u = new Vector3(x2 - x1, y2 - y1, z2 - z1);
Vector3 pq = new Vector3(x3 - x1, y3 - y1, z3 - z1);

float distance = Vector3.Cross(pq, u).Length / u.Length;

Edit: I just realized you wanted the actual point of intersection, and not the distance. The formula to find the actual point is a bit different. You need to use inner product space to get the component of u perpendicular to PQ. To do that, you need to find the component of u in the direction of PQ:

((PQ · u) / ||u||^2) * u

This gets us the w1 component, but we want w2, which is the component between Q and the line:

PQ = w1 + w2

w2 = PQ - w1

From there, we take w2 and add it to the point Q to get the point on the line nearest Q. In code this would be:

Vector3 p1 = new Vector3(x1, y1, z1);
Vector3 p2 = new Vector3(x2, y2, z2);
Vector3 q = new Vector3(x3, y3, z3);

Vector3 u = p2 - p1;
Vector3 pq = q - p1;
Vector3 w2 = pq - Vector3.Multiply(u, Vector3.Dot(pq, u) / u.LengthSquared);

Vector3 point = q - w2;

Where point.X is x4, point.Y is y4, and point.Z is z4.

这篇关于线上的 3D 垂直点来自 3D 点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆