垂直化三角形
Verticalize Triangle
我有一个三角形,其中两个点具有相同的 Z 值,一个具有不同的值。现在我想用不同的 Z 值转换点,以便它在光学上生成一个 "vertical" 三角形。假设 C 点具有不同的高度值,我需要以某种方式移动 C 点的 X 和 Y 坐标正交于 A 和 B 的差分向量,直到它们垂直对齐,例如坡度正好是 90 度。但不幸的是,我在轮换和其他事情上完全是个白痴。你能给我任何解决方法的提示吗?
我需要它的代码是用 C++ 编写的,但是一个简单的伪代码就足够了:)
但最好是一种相当快速的方法,因为它必须为每个玩家、每个块加载调用多达 700000 次
假设您有点 A B C,并且 A.z == B.z,z 表示垂直方向。
首先将C的x,y坐标投影到2D中A和B的连线上:
// find normalized AB vector:
AB.x = B.x - A.x;
AB.y = B.y - A.y;
length = sqrt(AB.x * AB.x + AB.y * AB.y);
// test for length == 0 to avoid div by zero
AB.x /= length;
AB.y /= length; // note: you could save a division by dividing dot by length instead
// project C onto AB:
AC.x = C.x - A.x;
AC.y = C.y - A.y;
// this gives us how far along the line AB the projected point is:
dot = (AC.x * AB.x) * (AC.y * AB.y);
newC.x = A.x + (AB.x * dot);
newC.y = A.y + (AB.y * dot);
newC.z = A.z; // same as B.z
接下来找到投影点和 C 之间的 3D 距离,如果使用 AB 作为铰链将三角形旋转到垂直位置,这将是新点 AB 线上方的垂直高度:
newCC.x = C.x - newC.x;
newCC.y = C.y - newC.y;
newCC.z = C.z - newC.z;
height = sqrt((newCC.x * newCC.x) + (newCC.y * newCC.y) + (newCC.z * newCC.z));
设置z值:
newC.z += height;
我有一个三角形,其中两个点具有相同的 Z 值,一个具有不同的值。现在我想用不同的 Z 值转换点,以便它在光学上生成一个 "vertical" 三角形。假设 C 点具有不同的高度值,我需要以某种方式移动 C 点的 X 和 Y 坐标正交于 A 和 B 的差分向量,直到它们垂直对齐,例如坡度正好是 90 度。但不幸的是,我在轮换和其他事情上完全是个白痴。你能给我任何解决方法的提示吗?
我需要它的代码是用 C++ 编写的,但是一个简单的伪代码就足够了:)
但最好是一种相当快速的方法,因为它必须为每个玩家、每个块加载调用多达 700000 次
假设您有点 A B C,并且 A.z == B.z,z 表示垂直方向。
首先将C的x,y坐标投影到2D中A和B的连线上:
// find normalized AB vector:
AB.x = B.x - A.x;
AB.y = B.y - A.y;
length = sqrt(AB.x * AB.x + AB.y * AB.y);
// test for length == 0 to avoid div by zero
AB.x /= length;
AB.y /= length; // note: you could save a division by dividing dot by length instead
// project C onto AB:
AC.x = C.x - A.x;
AC.y = C.y - A.y;
// this gives us how far along the line AB the projected point is:
dot = (AC.x * AB.x) * (AC.y * AB.y);
newC.x = A.x + (AB.x * dot);
newC.y = A.y + (AB.y * dot);
newC.z = A.z; // same as B.z
接下来找到投影点和 C 之间的 3D 距离,如果使用 AB 作为铰链将三角形旋转到垂直位置,这将是新点 AB 线上方的垂直高度:
newCC.x = C.x - newC.x;
newCC.y = C.y - newC.y;
newCC.z = C.z - newC.z;
height = sqrt((newCC.x * newCC.x) + (newCC.y * newCC.y) + (newCC.z * newCC.z));
设置z值:
newC.z += height;