牛客竞赛计算几何专题班二维基础
2022/1/13 6:06:04
本文主要是介绍牛客竞赛计算几何专题班二维基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
D.Operation Love
题意:
在二维坐标图给出一个手掌状图形,判断该图形是左手还是右手。
题解:
枚举所有线段,通过线段长度找到A,B,C三个点,若 B C ⃗ \vec{BC} BC 在 A B ⃗ \vec{AB} AB 的逆时针方向为左手,否则为右手。
代码:
t B) { return Vector(A.x - B.x, A.y - B.y); } Vector operator * (Vector A, double p) { return Vector(A.x * p, A.y * p); } Vector operator / (Vector A, double p) { return Vector(A.x / p, A.y / p); } bool operator < (const Point& a, const Point& b) { return a.x < b.x || (a.x == b.x && a.y < b.y); } bool operator ==(const Point& a, const Point& b) { return !sgn(a.x - b.x) && !sgn(a.y - b.y); } //点积,可用于判断角度 double Dot(Vector A, Vector B) { return A.x * B.x + A.y * B.y; } //叉积 double Cross(Vector A, Vector B) { return A.x * B.y - B.x * A.y; } //模长 double Length(Vector A) { return sqrt(Dot(A, A)); } //判断 bc 是不是在 ab 的逆时针方向,向量夹角<90 bool ToLeftTest(Point a, Point b, Point c) { return Cross(b - a, c - b) > 0; } int T; int main() { ios::sync_with_stdio(0); cin >> T; while (T--) { Point p[30], P1, P2, P3, P4; for (int i = 1; i <= 20; i++)cin >> p[i].x >> p[i].y; p[21] = p[1], p[22] = p[2]; p[0] = p[20]; for (int i = 1; i <= 20; i++) { double L = Length(p[i + 1] - p[i]); if (L - 8.5 > eps) {//找到线段AB // P1 = p[i], P2 = p[i + 1]; double L1 = Length(p[i - 1] - p[i]), L2 = Length(p[i + 2] - p[i + 1]); //根据长度区分C点(P3) if (L2 - L1 > eps)P1 = p[i], P2 = p[i + 1], P3 = p[i - 1]; if (L1 - L2 > eps)P1 = p[i + 1], P2 = p[i], P3 = p[i + 2]; break; } } if (!ToLeftTest(P2, P1, P3))cout << "right\n"; else cout << "left\n"; } return 0; }
这篇关于牛客竞赛计算几何专题班二维基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API
- 2025-01-102025 蛇年,J 人直播带货内容审核团队必备的办公软件有哪 6 款?
- 2025-01-10高效运营背后的支柱:文档管理优化指南
- 2025-01-10年末压力山大?试试优化你的文档管理
- 2025-01-10跨部门协作中的进度追踪重要性解析
- 2025-01-10总结 JavaScript 中的变体函数调用方式
- 2025-01-10HR团队如何通过数据驱动提升管理效率?6个策略
- 2025-01-10WBS实战指南:如何一步步构建高效项目管理框架?