news 2026/5/1 4:04:26

神秘大三角(洛谷P1355)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
神秘大三角(洛谷P1355)

题目描述

判断一个点与已知三角形的位置关系。

输入格式

前三行,每行一个坐标,表示该三角形的三个顶点。

第四行,一个点的坐标,试判断该点与前三个点围成三角形的位置关系。

所有坐标值均为整数。

输出格式

  • 若点在三角形内(不含边界),输出 1;
  • 若点在三角形外(不含边界),输出 2;
  • 若点在三角形边界上(不含顶点),输出 3;
  • 若点在三角形顶点上,输出 4。

输入输出样例

输入 #1复制运行

(0,0) (3,0) (0,3) (1,1)

输出 #1复制运行

1

说明/提示

数据规模与约定

对于 100% 数据,0≤xi​,yi​≤100。

1. 问题背景

在计算几何中,判断一个点P与已知三角形ABC的位置关系是一个非常基础但容易出错的问题。我们需要区分以下四种情况:

  1. 点在三角形顶点上。

  2. 点在三角形边界上(不含顶点)。

  3. 点在三角形内部

  4. 点在三角形外部

如果不小心处理,很容易掉进“点在边的延长线上”或者“浮点数精度丢失”的陷阱中。本文将介绍一种利用叉积(面积法)的稳健解决方案。

2. 核心算法:面积法

相比于计算夹角之和或射线法,面积法在处理整数坐标时具有天然优势:全程无浮点运算,无精度误差。

原理

三角形的面积可以通过向量叉积计算:

=

我们在代码中为了避免除以2产生小数,直接计算2倍面积(即叉积的绝对值)。

设大三角形面积为,点P与三个顶点形成的三个小三角形面积分别为

判定逻辑

  1. 顶点判定:直接比较坐标是否相等。

  2. 位置判定

    • 计算面积和:

    • 在外部(面积溢出)。

    • 在内部或边上(面积守恒)。

  3. 边界与延长线的区分

    • 如果某个小三角形面积为 0(例如),说明P在直线AB上。

    • 此时必须结合面积守恒判定:

      • 在边上

      • 在延长线上(即外部)

3. 代码实现细节

  • 输入技巧:题目输入格式为(x,y),利用scanf(" (%d,%d)", ...)中的空格跳过所有空白符,格式化读取十分方便。

  • 向量构造:无需构造全部向量,利用 helper 函数即时计算。

  • 数据类型:题目坐标范围,面积最大约int足够,无需long long

4. 完整代码

//叉积判断 #include <iostream> #include <cmath>//对应abs函数 using namespace std; typedef pair<int,int> pii; pii n[5]; int cross(pii a,pii b){//计算a b叉积 return (a.first*b.second-a.second*b.first); } pii product(int a,int b){//计算a-b向量坐标 int x=n[b].first-n[a].first; int y=n[b].second-n[a].second; return {x,y}; } int main(){ //n1 n2 n3存三角形三个点,n4是需要判断的点 for(int i=1;i<=4;i++){ //格式串前的空格非常关键,用于跳过换行符和空格 scanf(" (%d,%d)",&n[i].first,&n[i].second); } pii n14,n24,n34,n21,n12,n13;//1 2 3点分别与4点相连所构成的向量 //n14表示向量P1->P4(即顶点1到点P) n14=product(1,4); n24=product(2,4); n34=product(3,4); n21=product(2,1); n12=product(1,2); n13=product(1,3); //若点在三角形顶点上,输出4 if((n14.first==0&&n14.second==0)||(n24.first==0&&n24.second==0) ||(n34.first==0&&n34.second==0)){ cout<<4; return 0; } //不在顶点上,就判断该点是在内部还是外部还是边上 //如果在内部,三个顶点与该点构成的三个小三角面积应该等于三个顶点构成的三角形面积 //如果在外部,三个顶点与该点构成的三个小三角面积大于三个顶点构成的三角形面积 //如果在边上,三个顶点与该点构成的三个小三角面积有一个等于0(这里容易出问题)如果在三角形外部但是在边的延长线上其实也会有个小三角形面积为0 int sum=abs(cross(n12,n13));//三个顶点构成的三角形面积的二倍。不除以2避免精度问题 //sum1 2 3是三角形三个顶点中两两一组与题目给出端点构成三角形面积的二倍 int sum1=abs(cross(n14,n24)); int sum2=abs(cross(n24,n34)); int sum3=abs(cross(n34,n14)); //端点在边上,一定有一个三角形面积为0,接下来还要去判断三个小三角面积之和是否等于三个顶点构成的三角形面积之和,等于就在边上,大于就在延长线上(外部) if(sum1==0 || sum2==0 || sum3==0){ if(sum==sum1+sum2+sum3){ cout<<3; return 0; } else{ cout<<2; return 0; } } else if(sum==sum1+sum2+sum3){//端点在内部,大三角形面积一定等于三个小三角形面积之和 cout<<1; return 0; } else{//端点在外部,三个小三角形面积之和一定大于三个顶点构成三角形面积 cout<<2; return 0; } }

5. 总结

解决计算几何问题的关键在于“把几何关系转化为代数关系”。

  • 与其纠结复杂的角度判断,不如使用面积法

  • 与其纠结浮点数的误差,不如全程使用整数运算

  • 通过sum==sum1+sum2+sum3这一条核心公式,我们就能完美地将“内部/边上”与“外部/延长线”区分开来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 13:12:09

【网安毕设项目】基于深度学习的恶意钓鱼邮件检测系统

摘要&#xff1a;本文设计并实现了一个基于深度学习的钓鱼邮件自动检测系统。系统采用BiLSTM模型对邮件文本进行语义分析&#xff0c;结合文本预处理、词向量表示等技术&#xff0c;实现钓鱼邮件与正常邮件的自动分类。项目构建了完整的数据处理流程和GUI界面&#xff0c;包含数…

作者头像 李华
网站建设 2026/4/17 8:07:49

Thinkphp和Laravel电影院购票商城管理系统的设计与实现_

目录 技术框架选择核心功能模块设计数据库与高并发处理支付与安全实现部署与性能优化 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 技术框架选择 ThinkPHP和Laravel均为流行的PHP框架。ThinkPHP以轻量级、中文文档丰富著称&#xff0c;适合快…

作者头像 李华
网站建设 2026/4/25 1:30:30

Thinkphp和Laravel院课表调课管理系统_2n594_

目录 功能概述技术架构核心模块系统特点扩展性能 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 功能概述 Thinkphp和Laravel院课表调课管理系统_2n594_是一个基于两种流行PHP框架&#xff08;ThinkPHP和Laravel&#xff09;开发的课程管理解决…

作者头像 李华
网站建设 2026/4/30 13:42:37

AI智能体 - 探索与发现 Clawdbot >> Moltbot

探索者的崛起&#xff1a;从执行指令到主动发现&#xff0c;解构 AI 智能体的“蜕变”之路 在 AI 的进化史中&#xff0c;我们正处于一个关键的临界点。如果说过去的智能体&#xff08;Agent&#xff09;是 “熟练的地图使用者”&#xff0c;那么未来的智能体将是 “勇敢的制图…

作者头像 李华
网站建设 2026/4/17 23:54:48

基于SpringBoot + Vue的校园社团信息管理系统

文章目录 前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S 四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论 五、项目代码参考六、数据库代码参考七、项目论文示例结语 前言 &#x1f49b;博主介绍&a…

作者头像 李华
网站建设 2026/4/23 16:26:15

学长亲荐2026TOP10AI论文工具:本科生毕业论文全场景测评

学长亲荐2026TOP10AI论文工具&#xff1a;本科生毕业论文全场景测评 2026年AI论文工具测评&#xff1a;为何选择这些工具&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文工具已经成为高校学生和研究人员不可或缺的辅助工具。然而&#xff0c;面对市场上琳琅满目的产…

作者头像 李华