程序员面试金典 面试题 16.03. 交点

这道题就先围观下看个热闹没问题吧。。。
交点
我觉得我已经很努力了,可以角逐最简解法了

#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define det(a, b, c, d) (a*d-b*c)
class Solution{
public:
    vector<double> intersection(vector<int>& start1, vector<int>& end1, vector<int>& start2, vector<int>& end2) {
        //auto [x1, y1] = start1, [x2, y2] = end1, [x3, y3] = start2, [x4, y4] = end2;
        double x1 = start1[0], y1 = start1[1];
        double x2 = end1[0], y2 = end1[1];
        double x3 = start2[0], y3 = start2[1];
        double x4 = end2[0], y4 = end2[1];

        //double d = det(x1 - x2, x4 - x3, y1 - y2, y4 - y3);
        double d = (x1 - x2)*(y4 - y3) - (x4 - x3)*(y1 - y2);
        //double p = det(x4 - x2, x4 - x3, y4 - y2, y4 - y3);
        double p = (x4 - x2)*(y4 - y3) - (x4 - x3)*(y4 - y2);
        //double q = det(x1 - x2, x4 - x2, y1 - y2, y4 - y2);
        double q = (x1 - x2)*(y4 - y2) - (x4 - x2)*(y1 - y2);
        cout << "d:" << d << ", q:" << q << ", p:" << p << '\n';
        //相交不共线
        if(d != 0){
            double lam = p/d, eta = q/d;
            cout << "lam:" << lam << ", eta:" << eta << '\n';
            if (lam<0 || lam>1 || eta<0 || eta>1) return {};
            return {lam * x1 + (1 - lam) * x2, lam * y1 + (1 - lam) * y2};
        }
        //不相交
        if( p != 0 || q != 0) return {};
        //共线
        double t1 = min(max(y1,y2), max(y3,y4)), t2 = max(min(y1,y2), min(y3,y4)), tx2 = max(min(x1,x2), min(x3,x4));
        cout << t1 << ',' << t2 << '\n';
        if(t1>=t2)
            return {tx2, t2};
        
        return {};
    }
};

猜你喜欢

转载自blog.csdn.net/g534441921/article/details/105477861