P1355 神秘大三角

这篇博客介绍了如何判断一个点相对于一个给定三角形的位置关系,包括点在三角形内部、外部、边界上或顶点上的四种情况。通过解析输入格式和输出格式,博主提供了一个简单的思路,并给出了AC代码实现,利用三角形面积公式进行判断,避免精度问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门:P1355

题目描述

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

输入格式

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

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

(详见样例)

所有坐标值均为整数。

输出格式

若点在三角形内(不含边界),输出1;

若点在三角形外(不含边界),输出2;

若点在三角形边界上(不含顶点),输出3;

若点在三角形顶点上,输出4。

输入输出样例

输入 #1

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

输出 #1

1

思路

其实这题很简单啊,就是一堆判断(所以我们省掉一个判断,这里省去了1)

我们把p[1~3]看成三角形的三个顶点A、B、C,p[4]当成那个点D,这里我使用了结构体,c就是输入中的废字符。

cin>>c>>p[1].x>>c>>p[1].y>>c;
cin>>c>>p[2].x>>c>>p[2].y>>c;
cin>>c>>p[3].x>>c>>p[3].y>>c;
cin>>c>>p[4].x>>c>>p[4].y>>c;

四号情况:(不说了,太简单了)直接上代码

if((p[1].x==p[4].x&&p[1].y==p[4].y)||(p[2].x==p[4].x&&p[2].y==p[4].y)||(p[3].x==p[4].x&&p[3].y==p[4].y)){//特判点在三角形顶点上的情况
    cout<<4;
	return 0;
}

剩下的判断,我们需要使用到三角形面积公式(非常重要!!!)

double msr(int a,int b,int c,int d,int e,int f){//三角形面积
    double x,y,z,s;
    x=sqrt((a-c)*(a-c)+(b-d)*(b-d));
    y=sqrt((a-e)*(a-e)+(b-f)*(b-f));
    z=sqrt((c-e)*(c-e)+(d-f)*(d-f));
    s=(x+y+z)/2;
    return sqrt(s*(s-x)*(s-y)*(s-z));
}

我们用sum2~sum4依次表示S\triangle ABDS\triangle ACD,S\triangle BCD,sum表示S\triangle ABC(这里怕有精度问题,面积都乘100)

接着特判

二号情况:S\triangle ABD+S\triangle ACD+S\triangle BCD>S\triangle ABC

三号情况:S\triangle ABD=0或者S \triangle ACD=0或者S\triangle BCD=0

(一号情况:S\triangle ABD+S\triangle ACD+S\triangle BCD=S\triangle ABC

AC代码:

#include<bits/stdc++.h>
using namespace std;
char c;
struct point{
	int x,y;
}p[9];
double msr(int a,int b,int c,int d,int e,int f){//三角形面积
    double x,y,z,s;
    x=sqrt((a-c)*(a-c)+(b-d)*(b-d));
    y=sqrt((a-e)*(a-e)+(b-f)*(b-f));
    z=sqrt((c-e)*(c-e)+(d-f)*(d-f));
    s=(x+y+z)/2;
    return sqrt(s*(s-x)*(s-y)*(s-z));
}
int main(){
	cin>>c>>p[1].x>>c>>p[1].y>>c;
	cin>>c>>p[2].x>>c>>p[2].y>>c;
	cin>>c>>p[3].x>>c>>p[3].y>>c;
	cin>>c>>p[4].x>>c>>p[4].y>>c;
	//p[1]-p[2]为AB,p[2]-p[3]为BC,p[3]-p[1]为CA,p[4]为D
	if((p[1].x==p[4].x&&p[1].y==p[4].y)
	||(p[2].x==p[4].x&&p[2].y==p[4].y)
	||(p[3].x==p[4].x&&p[3].y==p[4].y)){//特判点在三角形顶点上的情况
		cout<<4;
		return 0;
	}
	int sum=(int)msr(p[1].x,p[1].y,p[2].x,p[2].y,p[3].x,p[3].y)*100;//三角形ABC的面积
	int sum2=(int)msr(p[1].x,p[1].y,p[2].x,p[2].y,p[4].x,p[4].y)*100;//三角形ABD的面积
	int sum3=(int)msr(p[1].x,p[1].y,p[3].x,p[3].y,p[4].x,p[4].y)*100;//三角形ACD的面积
	int sum4=(int)msr(p[2].x,p[2].y,p[3].x,p[3].y,p[4].x,p[4].y)*100;//三角形BCD的面积
	if(sum2+sum3+sum4>sum){//三个三角形的面积之和>大三角形面积说明点在三角形外
		cout<<2;
		return 0;
	}else if(sum2==0||sum3==0||sum4==0){//任何一个小三角形面积=0就代表着点在三角形边界上
		cout<<3;
		return 0;
	}else{
		cout<<1;
		return 0; 
	} 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值