点A (x1,y1,z1)是一行的"起点"。点B (x2,y2,z2)是一行的"终点"。
只知道三维空间中的直线AB,我需要求出点-t和t沿着与直线AB相交的两条垂直线分别在点A和点B处与直线AB在同一平面上的距离。
我的java代码目前可以在3d中沿着一条线得到一个点,但我不知道如何找到垂直线的方向矢量,只有一条给定的线,这是我唯一的信息。
提前感谢。
编辑:在直线上得到点是很好的,但是我不认为我知道如何从一条直线上找到平面法向量,或者如何用它来得到一条垂线。
public class ParameterizedLine {
private Vector3f originVector;
private Vector3f directionVector;
public ParameterizedLine(Line line) {
originVector = new Vector3f(line.getOrigin());
directionVector = line.getDirection().subtract(originVector);
}
public ParameterizedLine(Vector3f originVector, Vector3f directionVector) {
this.originVector = originVector;
this.directionVector = directionVector;
}
public Vector3f getPointAtDistance(float distance) {
Vector3f point = new Vector3f();
float distanceRatio = getDistanceRatio(distance);
point.x = originVector.x + (directionVector.x * distanceRatio);
point.y = originVector.y + (directionVector.y * distanceRatio);
point.z = originVector.z + (directionVector.z * distanceRatio);
return point;
}
public ParameterizedLine getPerpendicularLineAtDistance(float distance) {
Vector3f perpindicularOriginVector = getPointAtDistance(distance);
Vector3f planeNormalVector = originVector.cross(originVector.add(directionVector));
Vector3f perpindicularDirectionVector = directionVector.cross(planeNormalVector);
ParameterizedLine perpindicularLine = new ParameterizedLine(perpindicularOriginVector,
perpindicularDirectionVector);
return perpindicularLine;
}
private float getDistanceRatio(float distance) {
return distance / (originVector.distance(originVector.add(directionVector)));
}
public Vector3f getOrigin() {
return originVector;
}
public Vector3f getDirection() {
return directionVector;
}
@Override
public String toString() {
return "ParameterizedLine{" + "originVector=" + originVector + ", directionVector=" + directionVector + '}';
}
}
编辑2:求任意距离垂直点的明显解法,欢迎校对。
public Vector3f getPerpendicularPoint(float parametricDistance, float perpendicularDistance) {
Vector3f parametricPoint = getPointAtDistance(parametricDistance);
Vector3f perpendicularVector = new Vector3f();
if(directionVector.x <= directionVector.y && directionVector.x <= directionVector.z){
perpendicularVector.set(0, -directionVector.z, directionVector.y);
} else if (directionVector.y <= directionVector.x && directionVector.y <= directionVector.z){
perpendicularVector.set(-directionVector.z, 0, directionVector.x);
} else if (directionVector.z <= directionVector.x && directionVector.z <= directionVector.y){
perpendicularVector.set(-directionVector.y, directionVector.x, 0);
}
Vector3f normalizedPerpendicularVector = perpendicularVector.normalize();
Vector3f perpendicularPoint = parametricPoint.add(normalizedPerpendicularVector.mult(perpendicularDistance));
return perpendicularPoint;
}
单行不能定义唯一的平面-因为它属于空间中无限数量的平面。所以你必须提供关于飞机的额外信息。
如果没有关于该平面的附加信息,您可以选择该线所属的任意平面:
设(dx, dy, dz)是你的方向向量。找到两个更大的元素,交换它们,并否定其中一个。将第三个元素(最小值)设置为零。这个向量垂直于directionVector
的例子:
if (dx <= dy) and (dx <= dz) then PV = (0, -dz, dy)
然后对这个向量进行归一化 = PV /| PV |和你的目标点
Ta = 的 + - t * 到
(2分)结核病= B + - t * 到
(2分)注意AB线和所有点A, B, Ta1, Ta2, Tb1, Tb2位于同一平面(任意选择)