点在三角形,圆,矩形内

这篇博客介绍了在计算机图形学中,如何判断一个点是否位于圆、三角形和矩形内的算法。对于圆,通过计算点到圆心的距离与半径的比较来确定;对于三角形,利用面积法;对于矩形,采用向量法。这些方法在游戏开发、图形渲染等领域有着广泛应用。
摘要由CSDN通过智能技术生成

一、圆

判断点到圆心的距离,再让距离和圆的半径比较。小于即在圆的内部,等于则再圆的的边上,大于则再圆的外部。

bool CScenes::IsPointInCir(CPoint point)//point 是从外部传来的点
{
	int dis,x,y;
	x = point.x - m_cirVertex.x;//m_cirVertex 是圆的圆心坐标
	y = point.y - m_cirVertex.y;
	dis = sqrt(pow(x,2) + pow(y,2));
	if(dis <= 40)
	{
		return true;
	}
	return false;
}

二、三角形

使用面积法进行判断,给定平面上一点p(x0,y0),判断该点是否在三角形ABC中,三角形顶点坐标分别为A(xa,ya),B(xb,yb),C(xc,yc)。可以使用面积法来判断,方法如下:其中S(A,B,C)表示三角形ABC的面积。

若abs( S(A,B,C) ) = abs( S(P,B,C) ) + abs( S(A,P,C) ) + abs( S(A,B,P) ) ,则P在三角形ABC的内部或边上;如果还有abs( S(P,B,C) )、abs( S(A,P,C) ) 和abs( S(A,B,P) )全都大于0,则说明P在三角形ABC的内部,否则P在三角形ABC的边上,具体为:S(P,B,C)为0,则说明P在BC边上,S(A,P,C)为0,则说明P在AC边上,S(A,B,P)为0,则说明P在AB边上;
若abs( S(A,B,C) ) < abs( S(P,B,C) ) + abs( S(A,P,C) ) + abs( S(A,B,P) ) ,则P在三角形ABC的外部;
对abs( S(A,B,C) ) > abs( S(P,B,C) ) + abs( S(A,P,C) ) + abs( S(A,B,P) ) 情况在理论上是不存在的。
此处又引出另一个问题,如何求平面中三角形的面积?这个可以使用叉乘法来实现,即S(A,B,C)为向量AB叉乘AC所得向量模的1/2,再对该值求绝对值就是三角形ABC的面积。

bool CScenes::IsPointInTir(CPoint point)//point 是从外部传来的点
{
	int tirArea = CalTirArea(m_tirVertex[0],m_tirVertex[1],m_tirVertex[2]);//m_tirVertex是三角形顶点坐标的数组
	int splitTirArea = CalTirArea(m_tirVertex[0],m_tirVertex[1],point) + CalTirArea(m_tirVertex[0],point,m_tirVertex[2]) + CalTirArea(point,m_tirVertex[1],m_tirVertex[2]);
	if(abs(tirArea - splitTirArea) < 10)//小于10是为了减小误差,使得效果更加明显
	{
	    return true;
	}
	return false;
}
int CScenes::CalTirArea(CPoint a,CPoint b,CPoint c)//计算三角形的面积
{
    int x1 = b.x - a.x;  
    int y1 = b.y - a.y;  
    int x2 = c.x - a.x;  
    int y2 = c.y - a.y;  
    return abs(x1*y2-x2*y1)/2.0;  
}

三、矩形

使用向量法解决,凸多边形内部的点都在凸多边形的边所在的向量的同一侧(前提是计算边所在的向量时采用的是同一个方向,同为顺时针或者同为逆时针),利用又积求解。

假设四边形四个顶点依次为A(x1,y1 ) B(2,2),(x3,3),(X4,Y4),待判断的点为P(x,y),如果点P在四边形内部,则向量AB * AP (注意: 1.这是求叉积; 2.AB、AP均为向量,也就等于(x2-x1) * (y-y1)-(y2-y1) * (x-x1)) 的值与BCBP、CD CP、DA * DP的值同号(若有等于零的情况,则表示P在边上,可以根据自己的喜好把它当做是内部或者外部),即四个值同为正或者同为负,则点P在ABCD内部,否则在外部。

bool CScenes::IsPointInRect(CPoint point)//point 是从外部传来的点
{
	CPoint A = m_rectVertex[3];//左下顶点
	CPoint B = m_rectVertex[0];//左上顶点
	CPoint C = m_rectVertex[1];//右上顶点
	CPoint D = m_rectVertex[2];//右下顶点

	int a = (B.x - A.x) * (point.y - A.y) - (B.y - A.y) * (point.x - A.x);
	int b = (C.x - B.x) * (point.y - B.y) - (C.y - B.y) * (point.x - B.x);
	int c = (D.x - C.x) * (point.y - C.y) - (D.y - C.y) * (point.x - C.x);
	int d = (A.x - D.x) * (point.y - D.y) - (A.y - D.y) * (point.x - D.x);
	
	if((a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0))
	{
		return true;
	}
	return false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐雨清风 จุ๊บ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值