判断一个点是否在矩形内会经常用到,比如判断点是否在障碍物里,判断游戏中的玩家是否在某一区域。网上的解释都是抄来抄去的,有的明显错误也没发现,要么就是扔了一段代码,什么解释也没有,让人云里雾里。因此这里好好的讲解以下。

首先要明确的是矩形也可以旋转。因此,在矩形内检查点的简单解决方案在这里不起作用。

  • 关于射线法:1.当射线经过顶点时,判断就会出现异常情况。 2. 点在边上:这种情况也不能用交点个数的奇偶性来判断了。
  • 关于面积法:就是计算所有边和目标点组成的三角形面积和是否等于总的多边形面积,如果相等,则点在该区域的内部。这种方法计算量较大,多边形的面积计算也是比较麻烦;
  • 还有夹角法:判断所有边和目标点的夹角和是否为360度,计算量同样很大。

那么该如何处理这个问题呢?想要解决这个问题首先要了解叉积的概念,叉积(x1,y1)×(x2,y2)=x1∗y2−x2∗y1(x1,y1) \times (x2,y2)=x1*y2-x2*y1(x1,y1)×(x2,y2)=x1∗y2−x2∗y1,大小表示两个向量围成的平行四边形的面积,正负表示两个向量的相对位置。用处:求面积或者判断两点的相对位置。顺带提一下点积:(x1,y1)⋅(x2,y2)=x1∗x2+y1∗y2(x1,y1) \cdot(x2,y2)=x1*x2 + y1*y2(x1,y1)⋅(x2,y2)=x1∗x2+y1∗y2,用处:判断直线是否正交。关于叉积的另一篇精彩解释
叉积首先可以判断两点间的相对位置:一个点位于另一个点的顺时针或逆时针方向:以p0为参考点,如果multi大于0,则p2在p1的逆时针方向,反正,如果multi小于0,则p2在p1的顺时针方向,特殊的,当multi等于0,p1、p2、p0三点共线。

然后我们就可以判断线段间的关系:

最后,我们就可以判断点是否落在矩形内了:

如上图一所示,只需要判断该点是否在上下两条边和左右两条边之间就行,判断一个点是否在两条线段之间夹着,就转化成,判断一个点是否在某条线段的一边上,就可以利用叉乘的方向性,来判断夹角是否超过了180度 。因此只要满足(P1P2→×P1P→)∗(P3P4→×P3P→)>=0(\overrightarrow{P_1P_2} \times \overrightarrow{P_1P})*(\overrightarrow{P_3P_4} \times \overrightarrow{P_3P})>=0(P1​P2​​×P1​P​)∗(P3​P4​​×P3​P​)>=0

就说明P在P1P2,P3P4中间夹着,同理计算另两边就可以了。就说明P在P_1 P_2,P_3P_4中间夹着,同理计算另两边就可以了。就说明P在P1​P2​,P3​P4​中间夹着,同理计算另两边就可以了。

所以最后就是只需要判断(P1P2→×P1P→)∗(P3P4→×P3P→)>=0所以最后就是只需要判断 (\overrightarrow{P_1P_2} \times \overrightarrow{P_1P})*(\overrightarrow{P_3P_4} \times \overrightarrow{P_3P})>=0所以最后就是只需要判断(P1​P2​​×P1​P​)∗(P3​P4​​×P3​P​)>=0 && (P2P3→×P2P→)∗(P4P1→×P4P→)>=0(\overrightarrow{P_2P_3} \times \overrightarrow{P_2P})*(\overrightarrow{P_4P_1} \times \overrightarrow{P_4P})>=0(P2​P3​​×P2​P​)∗(P4​P1​​×P4​P​)>=0

实现的代码如下:

// ConsoleApplication18.cpp : Defines the entry point for the console application.
//判斷一個點是否在矩形內部#include "stdafx.h"
#include "iostream"struct Point
{float x;float y;Point(float x,float y){this->x = x;this->y = y;}
};
// 計算 |p1 p2| X |p1 p|
float GetCross(Point& p1, Point& p2,Point& p)
{return (p2.x - p1.x) * (p.y - p1.y) -(p.x - p1.x) * (p2.y - p1.y);
}
//判斷點是否在5X5 以原點為左下角的正方形內(便於測試)
bool IsPointInMatrix(Point& p)
{Point p1(0,5);Point p2(0,0);Point p3(5,0);Point p4(5,5);return GetCross(p1,p2,p) * GetCross(p3,p4,p) >= 0 && GetCross(p2,p3,p) * GetCross(p4,p1,p) >= 0;//return false;
}
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{while(true){Point testPoint(0,0);cout << "enter  the point :" << endl;cin >> testPoint.x >> testPoint.y;cout << "the point is  : "<< testPoint.x << " "<< testPoint.y << endl;cout << "the point is " << (IsPointInMatrix(testPoint)? "in the Matrix .": "not in the matrix ." )<< endl;}return 0;
}

关于判断一个点是否落在矩形内相关推荐

  1. Qt 判断一个点是否落在三角形内(算法)

    利用重心法判断一个点是否落在三角形面积内,三角形的三个点在同一个平面上,如果选中其中一个点,其他两个点不过是相对该点的位移而已,比如选择点A作为起点,那么点B相当于在AB方向移动一段距离得到,而点C相 ...

  2. 如何判断一个点是否落在一个平面内

    最近有个朋友问起的一个问题,给定一个荷质比和保留时间构成的平面,想看下哪些化合物落在这个平面里面. 假如有下面一个平面,哪些点在平面里?哪些点在平面外?怎么判断呢? 最简单的方法是目测! 如果采用程序 ...

  3. POJ 1410 Intersection 判断线段交和点在矩形内 【计算几何】

    ACM博客_kuangbin POJ 1410 Intersection(判断线段交和点在矩形内) Intersection Time Limit: 1000MS   Memory Limit: 10 ...

  4. 判断一个点是否在某个区域内(多边形)

    判断一个点是否在某个区域内(多边形) 背景: 比如滴滴会根据乘客所在的不同区域,给出不同的价格.市区堵一点,那么价格也高点.获取服务范围只规定在某个范围内 原理: 求解从该点向右发出的水平线射线与多边 ...

  5. 判断一个点是否在指定三角形内(1)

    问题:判断点P是否在三角形ABC内 判断一个点是否在在三角形内,最常用的两种方法:面积法.向量同向法.算法虽然很简单,但要做到高效却不容易,要考虑到二维.三维的区别,还要考虑到坐标是用浮点数还是用整数 ...

  6. java 判断范围_java判断一个点是否在一个围栏范围内

    应项目需求,需要判断一个点所属哪个区域范围内管辖,突然想起来三年前做了个外卖的项目里面有个功能,判断用户是否在商家自己划的配送范围内,又找回来以前的代码来看了下,所以在此处记录一下 @Data @No ...

  7. 地图处理方法-判断一个点是否在某个区域内

    判断一个点是否在某个区域内(多边形) 背景: 比如滴滴会根据乘客所在的不同区域,给出不同的价格.市区堵一点,那么价格也高点.获取服务范围只规定在某个范围内 原理: 求解从该点向右发出的水平线射线与多边 ...

  8. JAVA判断一个地理坐标是否在一个多边形区域内和是否在一个圆形区域内(经纬度)

    怎么样判断一个坐标点在一个多边形区域内?包括规则多边形,不规则多边形,还有圆... 1 判断一个坐标是否在圆形区域内? 多边形和圆分开写,首先简单的就是判断是否在圆里面,如何判断一个坐标是否在圆形区域 ...

  9. Unity判断一个物体是否在相机范围内

    Unity判断一个物体是否在相机范围内 思路 代码 注意点 思路 先说下思路,先把物体从世界坐标转到该相机的视口坐标viewPos, 如果满足这两个条件: 0<viewPos.x < 1 ...

最新文章

  1. ViewPager动态添加、删除Fragment,且提供红色小圆球指示当前位置
  2. 博客园博客停止更新的通知,程序员生存定律会在CSDN发完
  3. TADOQuery parameter对象被不正确地定义。提供了不一致或不完整的信息
  4. 计算机由那几个基础部分组成,计算机的基本组成由哪些?
  5. ArchLinux安装图文教程(2017.06.15)
  6. 考研英语一2011年翻译真题详解
  7. 信阳哪些技校有学计算机的,2018年信阳十大技校排名 排名前十的学校有哪些
  8. Mysql,再见吧,select * !
  9. 使用Spring开发Java RESTful Web服务的7个理由
  10. 李晓菁201771010114《面向对象程序设计(java)》第十三周学习总结
  11. 操作数组的常用方式二-----排序、查找
  12. 关于复利2.0 3.0
  13. c语言图书管理系统登录系统,C语言图书管理系统设计代码.doc
  14. word 宏命令 表头与图名的设置
  15. restframework序列化解析详解(番外)
  16. css3新单位vw、vh、vmin、vmax的使用详解
  17. 北京职工修改医保定点医院
  18. html5图片自动滑动,超简单的图片左右切换滑动
  19. php session fixation,Session Fixation 攻防实战(图)
  20. Python学习笔记六——画小猪佩奇

热门文章

  1. 【文献阅读】 Fair Sequential Group Recommendations
  2. 普通大学生的真实出路
  3. android killer回编译apk后,提示无法安装的解决办法
  4. uniapp如何给全端小程序添加激励广告详细教程
  5. VMware ESXi网络配置
  6. 计算机专业高级职称证书什么样,计算机软考高级资格是否等于高级职称
  7. 成都本地的伪装成科技公司的培训机构对照表(全)
  8. win10 SystemParametersInfo 设置屏保 不好使_Win10系统游戏优化
  9. 摩斯代码在线html,JSON在线编辑器
  10. 微信公号 DIY:一小时搭建微信聊天机器人