题目链接
求点到直线的垂足分为 空间 、平面
原理:
空间:
#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)
}
}