对于一个2D的平面的求解示意图和代码过程
方案1:
PSGMPoint point2dto3d(const PSGMPoint2D& pt)
{
return PSGMPoint(pt.x(), pt.y(), 0.);
}
void func()
{
PSGMPoint2D ptBeg1(4, 1);
PSGMPoint2D ptEnd1(2, 4);
PSGMPoint2D ptBeg2(2, 1);
PSGMPoint2D ptEnd2(4, 4);
PSGMDirection2D dir2d1 = (ptEnd1 - ptBeg1).normalized();
PSGMDirection dir1 = (point2dto3d(ptEnd1) - point2dto3d(ptBeg1)).normalized();
double dir1Len = dir1.norm();
PSGMDirection dir2 = (point2dto3d(ptEnd2) - point2dto3d(ptBeg2)).normalized();
double dir2Len = dir2.norm();
const PSGMVector chord = point2dto3d(ptBeg2) - point2dto3d(ptBeg1);
double chordLen = chord.norm();
const PSGMVector n1 = dir1.cross(dir2);
double n1Len = n1.norm();
const double nLen = n1.squaredNorm();
const PSGMVector n2 = dir2.cross(n1);
double n2Len = n2.norm();
auto n3 = n2 / nLen;
double n3Len = n3.norm();
// PSGM_ASSERT(std::fabs(nLen) > tol); // parallel lines
// intersection of lines
const double intersectParam = chord.dot(n3);
PSGMPoint2D ptInt = ptBeg1 + dir2d1 * intersectParam;
}
方案2:
// 正弦定理:在任意一个平面三角形中,各边和它所对角的正弦值的比相等且等于外接圆的直径,即a/sinA = b/sinB =c/sinC = 2r=D(r为外接圆半径,D为直径)
void func1()
{
PSGMPoint2D ptBeg1(4, 1);
PSGMPoint2D ptEnd1(2, 4);
PSGMPoint2D ptBeg2(2, 1);
PSGMPoint2D ptEnd2(4, 4);
PSGMDirection2D dir2d1 = (ptEnd1 - ptBeg1).normalized();
PSGMDirection dir1 = (point2dto3d(ptEnd1) - point2dto3d(ptBeg1)).normalized();
PSGMDirection dir2 = (point2dto3d(ptEnd2) - point2dto3d(ptBeg2)).normalized();
const PSGMVector chord = point2dto3d(ptBeg1) - point2dto3d(ptBeg2);
const PSGMVector n1 = dir1.cross(dir2);
const PSGMVector n2 = dir2.cross(chord.normalized());
double intersectParam = sqrt(chord.squaredNorm() * n2.squaredNorm() / n1.squaredNorm());
// intersection of lines
PSGMPoint2D ptInt = ptBeg1 + dir2d1 * intersectParam;
}