【无聊】判断一点是否在三角形内。(面积法)

本文介绍了一种通过计算叉积来判断一个点是否位于由三个已知顶点构成的三角形内部的方法。该方法利用了三角形面积计算原理,并通过C++代码实现了具体的算法流程。

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

判断一点是否在三角形内:假设三角形三个顶点坐标都知道分别为a,b,c.

都知道三角形的面积可以是二分之一两边长乘上他们的夹角sin。

而叉积的计算也是|a||b|sin@。所以可以利用面积是否相等来判断一点d是否在三角形内。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <vector>
#include <ctime>
#define LL __int64
#define EPS 1e-8
using namespace std;
struct point
{
	double x,y;
	point (double x=0,double y=0):x(x),y(y){}
}a,b,c,d;
point operator - (point a,point b)
{
	return point(a.x-b.x,a.y-b.y);
}
double cross(point a,point b)
{
	return fabs(a.x*b.y-a.y*b.x);
}
int main()
{
	begin:
	printf("请输入三角形的三个顶点坐标:\n");
	scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y);
	printf("请输入要判断的点的坐标,如若想重新输入三角形顶点,请输入0 0\n");
	while (~scanf("%lf%lf",&d.x,&d.y))
	{
		if (fabs(d.x)<=EPS && fabs(d.y)<=EPS)
			goto begin;
		point A,B,C;
		A=a-d;
		B=b-d;
		C=c-d;
		double s,s1;
		s=cross(A,B)/2+cross(A,C)/2+cross(B,C)/2;
		s1=cross(c-b,a-b)/2;
		//cout<<s<<" "<<s1<<endl;
		if (fabs(s-s1)<EPS) printf("此点(%lf,%lf)在三角形内\n",d.x,d.y);
		else printf("此点(%lf,%lf)不在三角形内\n",d.x,d.y);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值