news 2026/10/2 23:31: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/9/29 20:09:54

代理分析(agentic analytics):破除流行词泡沫,读懂数据智能的核心变革

“代理分析” 凭借极具韵律的头韵美感&#xff0c;迅速成为数据领域炙手可热的新兴概念&#xff0c;其传播势头一路高涨&#xff0c;俨然有跻身行业顶流流行词的趋势。但令人遗憾的是&#xff0c;市面上绝大多数试图解读这一概念的内容&#xff0c;要么内容空洞乏味、观点单薄浅…

作者头像 李华
网站建设 2026/10/1 8:27:13

大数据领域元数据管理的实践经验分享

大数据领域元数据管理的实践经验分享:像管理图书馆一样管理数据资产 关键词 元数据管理;大数据治理;数据血缘;Apache Atlas;数据字典;自动化采集;实时元数据 摘要 在大数据时代,企业的数据资产就像一座不断扩张的图书馆——里面有海量的书籍(数据),但如果没有索…

作者头像 李华
网站建设 2026/10/1 13:35:23

基于Thinkphp和Laravel的乡村政务举报投诉办公系统的设计与实现_

目录 系统背景技术架构核心功能模块创新点实现效果 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 系统背景 乡村政务举报投诉办公系统旨在利用现代化信息技术提升基层政务处理效率&#xff0c;解决传统投诉渠道响应慢、流程不透明等问题。该系…

作者头像 李华
网站建设 2026/10/3 2:43:21

基于Thinkphp和Laravel的喀什旅游网站酒店机票美食_hw31x_

目录 开发框架选择功能模块设计技术实现要点喀什特色整合部署与运维 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 开发框架选择 ThinkPHP和Laravel均为成熟的PHP框架。ThinkPHP适合快速开发&#xff0c;中文文档丰富&#xff1b;Laravel生态完…

作者头像 李华
网站建设 2026/10/3 2:43:21

基于Thinkphp和Laravel的被裁人员就业求职招聘管理系统_w3209_

目录系统概述技术栈核心功能项目亮点适用场景项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理系统概述 Thinkphp和Laravel框架结合开发的被裁人员就业求职招聘管理系统&#xff08;项目代号_w3209_&#xff09;旨在为被裁人员提供职业匹配、岗位推…

作者头像 李华
网站建设 2026/10/3 2:43:18

基于Thinkphp和Laravel的高校电动车租赁系统_hb0fi_

目录 系统概述技术架构核心功能创新点部署与扩展 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 系统概述 该系统基于ThinkPHP和Laravel框架开发&#xff0c;旨在为高校提供电动车租赁管理解决方案&#xff0c;涵盖用户管理、车辆调度、订单处理…

作者头像 李华