牛客小白月赛2-B小马过河(求点到直线的垂足)

题目链接

求点到直线的垂足分为 空间 、平面

原理:

这里写图片描述

空间:

#include<iostream>
#include<cmath>
using namespace std;
const double eps = 1e-6;
struct ac{
    double x, y, z;
};
ac get(ac p, ac a, ac b){
    double dx, dy, dz, k;
    ac ans;
    dx = b.x - a.x;
    dy = b.y - a.y;
    dz = b.z - a.z;
    if(dx < eps && dy < eps && dz < eps)
        return a;
    k = (a.x - p.x) * dx + (a.y - p.y) * dy + (a.z - p.z) * dz;
    k /= dx * dx + dy * dy + dz * dz;
    k *= -1;
    ans.x = k * dx + a.x;
    ans.y = k * dy + a.y;
    ans.z = k * dz + a.z;
    return ans;
}
int main(){
    int t;
    cin >> t;
    ac p, a, b;
    ac ans = get(p, a, b);
    cout << ans.x << ans.y << ans.z << endl;
}

平面:将Z轴去掉

ac代码:

#include<iostream>
#include<cmath>
using namespace std;
const double eps = 1e-6;
struct ac{
    double x, y, z;
};
ac get(ac p, ac a, ac b){
    double dx, dy, dz, k;
    ac ans;
    dx = b.x - a.x;
    dy = b.y - a.y;
    if(abs(dx) < eps && abs(dy) < eps)
        return a;
    k = (a.x - p.x) * dx + (a.y - p.y) * dy;
    k /= dx * dx + dy * dy;
    k *= -1;
    ans.x = k * dx + a.x;
    ans.y = k * dy + a.y;
    return ans; 
}
int main(){
    int t;
    cin >> t;
    ac p, a, b;
    while(t--){
        cin >> p.x >> p.y >> a.x >> a.y >> b.x >> b.y;
        ac ans = get(p, a, b);
        printf("%.5lf %.5lf\n", ans.x, ans.y); 

    }
}


猜你喜欢

转载自blog.csdn.net/henuyh/article/details/80045394
今日推荐