欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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

发布时间:2024/4/18 60 豆豆
生活随笔 收集整理的这篇文章主要介绍了 牛客小白月赛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); } }

总结

以上是生活随笔为你收集整理的牛客小白月赛2-B小马过河(求点到直线的垂足)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。