news 2026/4/13 6:02:29

神秘大三角(洛谷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/3/28 19:43:20

基于SpringBoot+Vue的垃圾分类回收网站(源码+lw+部署文档+讲解等)

课题介绍 本课题旨在设计实现基于SpringBootVue的垃圾分类回收网站&#xff0c;聚焦居民、回收服务商、环保监管部门的垃圾分类查询、回收预约、数据统计及政策科普核心需求&#xff0c;破解传统垃圾分类指导不足、回收渠道分散、资源利用率低、监管数据滞后等痛点&#xff0c;…

作者头像 李华
网站建设 2026/4/9 17:33:03

基于Thinkphp和Laravel的大学生迎新新生入学报到系统ts0qp-_

目录 系统概述技术架构核心功能安全与扩展性部署与维护 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 系统概述 ThinkPHP与Laravel框架结合开发的大学生迎新报到系统&#xff08;ts0qp-_&#xff09;旨在简化新生入学流程&#xff0c;实现数字…

作者头像 李华
网站建设 2026/4/10 16:33:30

RKNN Toolkit lite2工具详解与工程应用

一、RKNN Toolkit lite2介绍 在之前的博客中&#xff0c;有对rknn-toolkit lite2工具进行简要介绍&#xff0c;rknn-toolkit lite2在嵌入式平台上进行模型推理&#xff0c;它主要用来部署已经转换好的rknn模型。使用python接口对模型进行调用&#xff0c;实现模型推理&#xff…

作者头像 李华
网站建设 2026/4/11 20:46:43

如果有一天,Linus Torvalds 不再维护 Linux 内核了,会发生什么?

作为一名在生产环境里和 Linux 打了十几年交道的运维工程师,我们大多数人每天都在用 Linux,却很少真正思考一个问题: 如果有一天,Linus Torvalds 不再维护 Linux 内核了,会发生什么? 这个问题,在过去很长一段时间里,既“显而易见”又“讳莫如深”。 显而易见,是因为 L…

作者头像 李华
网站建设 2026/4/9 9:26:07

USB2.0端口ESD管单颗能护双路数据传输?

USB2.0接口的D与D-差分对需要协同防护&#xff0c;单颗集成双通道的ESD保护器件在硬件层面具备同时保护两路信号的能力&#xff0c;且有利于保持差分对的电气参数对称性。本文从单颗器件的硬件架构、USB2.0信号适配性、工程设计要点与选型实践四个维度&#xff0c;解析单颗ESD管…

作者头像 李华
网站建设 2026/3/31 21:40:45

高清DP接口ESD管防护会让8K信号断连?

DisplayPort 1.4/2.0接口在传输8K60Hz超高清视频时&#xff0c;信号速率高达8.1Gbps每通道&#xff08;HBR3&#xff09;或更高&#xff0c;对ESD保护器件的结电容提出严苛要求。结电容超标的ESD管会导致插入损耗剧增、眼图闭合与链路协商失败&#xff0c;触发显示器黑屏或分辨…

作者头像 李华