C/C++ 判断一个点是否在任意四边形内

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言 pthread

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 面向对象

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ 设计模式

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C++ STL

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 技术杂谈

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C/C++ 常用函数


一.判断一个点是否在任意四边形内

代码如下:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C/C++ 判断一个点是否在任意四边形内
//@Time:2022/04/16 07:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/


/*
描述:判断点是否在四边形内,该函数也适用于多边形,将点数改成你想要的边数就行
参数:
    pCur:当前点
    pLeftTop:左上角
    pRightTop:右上角
    pRightBelow:右下
    pLeftBelow:左下
返回值:如果在四边形内返回 true ,否则返回 false
*/
bool PtInRect(Point2d pCur, Point2d pLeftTop, Point2d pRightTop, Point2d pRightBelow, Point2d pLeftBelow)
{
	int nCount = 4;//任意四边形有4个顶点
	Point2d RectPoints[4] = { pLeftTop, pLeftBelow, pRightBelow, pRightTop };
	int nCross = 0;
	double lastPointX = -999.999;
	for (int i = 0; i < nCount; i++)
	{
		//依次取相邻的两个点
		Point2d pBegin = RectPoints[i];
		Point2d pEnd = RectPoints[(i + 1) % nCount];
		//相邻的两个点是平行于x轴的,当前点和x轴的平行线要么重合,要么不相交,不算
		if (pBegin.y == pEnd.y)continue;
		//交点在pBegin,pEnd的延长线上,不算
		if (pCur.y < min(pBegin.y, pEnd.y) || pCur.y > max(pBegin.y, pEnd.y))continue;
		//当前点和x轴的平行线与pBegin,pEnd直线的交点的x坐标
		double x = (double)(pCur.y - pBegin.y) * (double)(pEnd.x - pBegin.x) / (double)(pEnd.y - pBegin.y) + pBegin.x;
		if (x > pCur.x)//只看pCur右边交点
		{			
			if (x != lastPointX)//防止角点算两次
			{
				nCross++;
				lastPointX = x;
			}				
		}			
	}
	// 单方向交点为奇数,点在多边形之内
	// 单方向交点为偶数,点在多边形之外
	return (nCross % 2 == 1);
}

二.猜你喜欢

  1. C语言 数组下标越界和内存溢出区别
  2. C语言 使用指针遍历数组
  3. C语言 指针和数组区别
  4. C语言 指针数组和数组指针区别
  5. C语言 野指针
  6. C语言 函数值传递和址传递
  7. 函数不定长参数
  8. C语言 函数指针
  9. C语言 指针函数
  10. C语言 回调函数 callback
  11. C语言 #pragma once
  12. C语言 #include <> 与 #include “” 区别
  13. C语言 const 修饰函数参数
  14. C语言 const 和 define 区别
  15. C语言 va_start / va_end / va_arg 自定义 printf 函数
  16. C语言 main 函数参数 main(int argc, char *argv[])
  17. C语言 结构体struct简介(一)
  18. C语言 结构体struct定义和使用(二)
  19. C语言 结构体struct数组(三)
  20. C语言 结构体struct指针(四)
  21. C语言 结构体struct成员函数(五)
  22. C语言 结构体struct嵌套(六)
  23. C语言 结构体struct值传递和址传递(七)
  24. C/C++ error: cannot assign to non-static data member within const member function ‘xxxx’
  25. C++ 关于类中 const 的使用
  26. C/C++ =delete
  27. C/C++ 条件编译 #ifdef
  28. C/C++ vs 没有匹配 if 的非法 else 问题解决办法
  29. C/C++ Visual studio 中文注释导致编译不能通过
  30. C/C++ error C2589: “(”: “::”右边的非法标记
  31. C/C++ error:表达式是必须修改的左值
  32. C/C++ error C4996: ‘getch’: The POSIX name for this item is deprecated. Instead, use the ISO C++ conf
  33. C/C++ error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
  34. Visual Studio 中 dumpbin 工具使用
  35. C/C++ error LNK2005:”XXX已经在 XXX.obj 中定义
  36. C/C++ 判断字符串是否为 utf-8 编码
  37. C/C++ svpng 将 RGBA 保存 png 图片
  38. C/C++ 使用 stb_image 加载 png / jpg / gif / bmp等常用图片
  39. C/C++ void* 和 float 转换
  40. C/C++ error 无法从“float”转换为“void *
  41. C/C++ 判断一个点是否在任意四边形内

未经允许不得转载:猿说编程 » C/C++ 判断一个点是否在任意四边形内
喜欢(1) 打赏

评论抢沙发

评论前必须登录!

文章付费之后,如果下载源码失败,请直接留言,博主看到消息会及时处理的,感谢配合!!!共勉!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏