计算机图形学:传统函数方法判定点在不规则封闭区域内的判定方法

在封闭的多边形中,需要判断一个点在不在图形中

先在点处画一条竖直的线穿过图形

这时候记下A上下两边焦点的个数分别为1,为单数

但是B上下两边焦点的个数分别为0和2,为双数

那么找一个有凹面的多边形呢

 发现也一样

那么就用这个方法来实现,点是否在封闭图形中的判定(cocos2d实现方式)

bool PointInRegion(cocos2d::CCPoint pt,vector<cocos2d>::plist)
{
	int Cross=0;
	
    //依次判定每一条边的情况
	for(int i=0;i<plist.size(),i++)
	{
		cocos2d:CCPoint p1;
		cocos2d:CCPoint p2;
		
		p1=plist[i];
		p2=plist[(i+1)%plist.size()];
		
        //看点的x坐标是不是在两点的x坐标之中
		if(pt.x=p2.x)
			contine;
			
		if(pt.x<min(p1.x,p2.x))
			contine;
			
		if(pt.x>min(p1.x,p2.x))
			contine;
			 
		//一条垂直线穿过图形,看交点的y坐标	
		double y = (double)(pt.x - p1.x) * (double)(p2.y - p1.y) / (double)(p2.x - p1.x) + p1.y; 
		//统计在一边的交点的数量
		if(y>pt.y)
			nCross++;							
	}
	
        //当一边的数量为偶数时候点在图形外
	if(nCross%2==0)
		return false;
        //当一边的数量为奇数时候点在图形内
	else
		return true;
	
}

原理图如下:

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要得到一个不规则图形,glscenc使用的是计算机图形学中的一种技术——多边形剪裁。多边形剪裁是指对于一个给定的多边形图形,在给定的区域内进行裁剪,并得到一个不规则图形的过程。 glscenc首先需要定义一个给定的多边形图形,可以通过指定顶坐标的方式来定义多边形的形状。然后,利用多边形剪裁算法,将该多边形图形裁剪为指定区域内的不规则图形。 多边形剪裁算法可以分为两种常用方法:内部-外部测试算法和Cohen-Sutherland算法。 内部-外部测试算法是通过检测多边形的每个顶,判断其相对于裁剪区域的位置关系,确定多边形哪些部分位于区域内部,哪些部分位于区域外部。然后,根据求得的内部多边形顶,通过连接相邻顶的方式重新构造一个不规则图形。 Cohen-Sutherland算法是一种线段裁剪算法,通过将多边形的边看作线段,利用线段相交的判定来裁剪多边形图形。该算法首先将给定的多边形图形分解为多个线段,然后对每一个线段进行裁剪,得到新的线段边界。最后,根据新得到的线段边界,重新连接相邻线段的顶,得到一个不规则图形。 通过上述算法,glscenc可以得到一个给定区域内的不规则图形,可用于计算机图形学中的各种应用,如图形渲染、图像处理等。 ### 回答2: 要得到一个不规则图形,可以通过以下步骤使用glscenc来实现。 第一步,创建一个窗口,并设置好窗口的大小和标题。可以使用glutInitWindowSize()函数来设置窗口大小,glutInitWindowPosition()函数来设置窗口位置,glutCreateWindow()函数来创建窗口。 第二步,设置绘图环境。在glscenc中,可以使用glClearColor()函数来设置背景颜色,glMatrixMode()函数来设置投影模式,glLoadIdentity()函数来设置当前的矩阵状态。 第三步,使用glBegin()和glEnd()函数来定义不规则图形的顶。在glBegin()和glEnd()之间使用glVertex2f()函数来定义每个顶的坐标。 第四步,使用glColor3f()函数来设置每个顶的颜色。可以使用红、绿、蓝三个分量来定义颜色,取值范围为0到1。 第五步,使用glutMainLoop()函数来进入主循环,保持窗口的显示状态。 通过以上步骤,可以使用glscenc来得到一个不规则图形。可以根据需要,调整顶的坐标和颜色,从而得到不同形状和效果的图形

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值