Здравствуйте, появилась необходимость найти точку пересечения между двумя осями(помечены красной стрелкой на картинке)
Так как оси эти, на самом деле, не пересекаются, а просто расположены очень близко друг к другу, то я предположил, что найдя ближайшую точку между ними, я смогу найти то, что мне нужно.
Однако мой код выдаёт странные ближайшие точки(помечены синим на скриншоте). Соответсвенно при их усреднении я получаю не то, что ожидал от алгоритма.
Вот мой код для опеределния ближайших точек, на данный момент:
static inline bool ClosetPointBetweenAxis(std::pair<Vector3, Vector3> axis1,std::pair<Vector3, Vector3> axis2, Vector3& point1, Vector3& point2) {
Vector3 axis1Vector = axis1.second - axis1.first;
Vector3 axis2Vector = axis2.second - axis2.first;
Vector3 originVector = axis2.first - axis1.first;
float normU = Vector3::DotProduct(Vector3::GetNormalize(axis1Vector), Vector3::GetNormalize(axis2Vector));
//parallel
if (fabs(normU) == 1)
return false;
float u = Vector3::DotProduct(axis1Vector, axis2Vector);
float dir1Length = Vector3::GetNonSqrtMagnitude(axis1Vector);
float dir2Length = Vector3::GetNonSqrtMagnitude(axis2Vector);
float t1 = (
originVector.X * axis1Vector.X +
originVector.Y * axis1Vector.Y +
originVector.Z * axis1Vector.Z -
u * (
originVector.X * axis1Vector.X +
originVector.Y * axis1Vector.Y +
originVector.Z * axis1Vector.Z)) /
(dir1Length - u * dir2Length);
float t2 = (t1 * u -
originVector.X * axis2Vector.X -
originVector.Y * axis2Vector.Y -
originVector.Z * axis2Vector.Z) /
dir2Length;
Vector3 p1 = axis1.first + axis1Vector * t1;
Vector3 p2 = axis2.first + axis2Vector * t2;
point1 = p1;
point2 = p2;
return true;
}
Где я ошибся в данном алгоритме?