gpt4 book ai didi

java - 在与 3d 中给定线同一平面上的垂直线上查找距离 t 的点

转载 作者:行者123 更新时间:2023-12-01 13:17:39 26 4
gpt4 key购买 nike

点 A (x1,y1,z1) 是一条线的“起点”。点 B (x2,y2,z2) 是一条线的“末端”。

仅知道 3d 空间中的线 AB,我需要找到沿与线 AB 相交的两条垂直线分别在同一点上的点 A 和 B 的点 -tt 距离平面为AB线。

我的java代码目前可以得到3d中沿着一条线的一个点,但是我无法弄清楚如何在只给定一条线的情况下找到垂直线的方向 vector ,这是我拥有的唯一信息。

提前致谢。

编辑:获取线上的点工作正常,但是我认为我不明白如何从单条线上找到平面法线 vector 或如何使用它来获取垂直线。

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) 是你的方向 vector 。找到2个量级较大的元素,交换它们,然后将其中一个取反。将第三个元素(最小量值)设置为零。该 vector 垂直于 DirectionVector。

示例:

if (dx <= dy) and (dx <= dz) then PV = (0, -dz, dy)

然后标准化这个 vector uP = PV/|PV|还有你的目标点

Ta = A +- t * uP(两点)

Tb = B +- t * uP(两点)

请注意,线 AB 和所有点 A、B、Ta1、Ta2、Tb1、Tb2 位于同一平面(任意选择)

关于java - 在与 3d 中给定线同一平面上的垂直线上查找距离 t 的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22340313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com