1.判断点在三角形的内外

即可判定点P在内。

三角形面积计算公式:.

2.判断点在多边形的内外

方法一:扫描法

以p点做一条射线,让其与多边形一个顶点相交,再判断是否与多边形上点共线当然这个点不可能是顶点,就是说作一条射线,与多边形相交一点就认为在里面,相交0或偶数点就在外面(仔细想想为什么偶数点就一定可以)。

#include<iostream>
#include<string>
#include<sstream>
#include<set>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
#define eps 1.0e-5
inline double max(double a, double b) { return a > b ? a : b; }
inline double min(double a, double b) { return a < b ? a : b; }
inline double dabs(double a) { return a <0 ? -a : a; }
struct Point {double x, y;
};
Point poly[110];
int n, m;
bool online(const Point& p1, const Point& p2, const Point& p3) {//判断是否共线if (p2.x >= min(p1.x, p3.x) && p2.x <= max(p1.x, p3.x) && p2.y >= min(p1.y, p3.y) && p2.y <= max(p1.y, p3.y)) {if (dabs((p2.x - p1.x)*(p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y)) <= eps)return true;}return false;
}
bool insidepolygon(Point p) {int counter = 0;double xinters;Point p1, p2;p1 = poly[0];for (int i = 1; i <= n; i++) {p2 = poly[i%n];if (online(p1, p, p2))return true;if (p.y > min(p1.y, p2.y)&& p.y <= max(p1.y, p2.y)&& p.x <= max(p1.x, p2.x)) {if (p1.y != p2.y) {xinters = (p.y - p1.y)*(p2.x - p1.x) / (p2.y - p1.y) + p1.x;if (p1.x == p2.x || p.x <= xinters)counter++;//说明射线与顶点之外的的相交}}p1 = p2;}if (counter % 2 == 0)return false;return true;
}int main() {int t = 0;Point p;while (cin >> n&&n) {cin >> m;for (int i = 0; i < n; i++)cin >> poly[i].x >> poly[i].y;for (int i = 0; i < m; i++) {cin >> p.x >> p.y;if (insidepolygon(p))cout << "Within" << endl;elsecout << "Outside" << endl;}}return 0;
}

方法二:叉乘判别法(只适用于凸边形)

连接要测试的点p与第一个顶点为向量v,连接第一个顶点与第二个顶点为向量u,都以第一个顶点为起点,u和v做叉乘,从第二条边开始判断上一个结果*当前是否小于0,小于0就在外面。

struct Point {double x, y;
};
double multi(Point p1, Point p2, Point p0) {return (p1.x - p0.x)*(p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y);
}
Point edge[100][2];//记录边,起点和终点
int isInside(Point p, Point edge[][2], int n) {int i;double pre;double now;for (i = 0; i < n; i++) {now = multi(p, edge[i][1], edge[i][0]);if (i > 0) {if (pre*now < 0)//主要是记录方向return 0;}pre = now;}return 1;
}

方法三:角度和的判断法(适用任意多边形)

p点到各个顶点边的夹角和为360。

累计交相加就可以了,可以用叉积来求。

几何基础之点在多边形内的判断相关推荐

  1. php 判断点在多边形内,PHP判断点是否在多边形区域内外

    PHP判断点是否在多边形区域内外: 根据数学知识的射线法,射线与几何多边形相交的点的个数为奇数则是在几何内部: 偶数在外部:/** * Created by PhpStorm. * function: ...

  2. 点在多边形内 java_判断点在多边形内部的方法(Java版)

    /** * 检查多边形是否包含了某点~ * @param point * @return */ public boolean containsPoint(BYPoint point) { int ve ...

  3. 点在多边形内的判断(射线法)

    这个博客写得非常好 转载于:https://www.cnblogs.com/justPassBy/p/5205310.html

  4. 判断某点在多边形内——方法一

    算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目.如果有 ...

  5. 电子海图中点在多边形内的判定

    1          算法背景        在电子海图系统中,经常需要用到判断一个点(可能是一个船位,或者其它点状物标)是否在某个多边形区域内(矩形或圆也可看作特殊的多边形),比如某个警戒区,作业区 ...

  6. HDU1756(判断一个点是否在多边形内)

    以下内容是在自己学习中总结出来了的,如果有什么错误,请指出,谢谢! 判断一个点是否在多边形内: (1)判断方法一(具有一定的局限性):将测试点的Y坐标与多边形的每一个点进行比较,将得到一 个与多边形的 ...

  7. php之判断点在多边形内的api

    1.判断点在多边形内的数学思想:以那个点为顶点,作任意单向射线,如果它与多边形交点个数为奇数个,那么那个点在多边形内,相关公式: <?php class AreaApi{//$area是一个多边 ...

  8. 判断多个点在多边形内的在线算法

    通常判断一个点在多边形内有五种算法: 1. 叉积法,面积法(适用于凸包) 2. 射线法,直线法, 最坏时间O(n), 通常都可以达到常数基数时间 3.回转数(也叫旋转角)法 4.改进弧长法(转角法的改 ...

  9. 判断点是否处于多边形内的三种方法(转)

    1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...

最新文章

  1. linux下进制是如何转换?
  2. SpringBoot无法书写主启动类的情况之一
  3. jeecg <t:choose 功能标签用法修改 处理选择0条记录回写
  4. centos7安装mysql的rpm_Centos7 安装MySQL(rpm方式)
  5. docker查询镜像命令_Docker镜像相关命令
  6. Layui或Layuimini整合Echarts 5
  7. 勇者游戏C语言,c语言命令行-勇者斗恶龙
  8. 【C++】大小端转换
  9. [SUCTF 2019]EasyWeb
  10. 安德鲁1.2Ku使用感受
  11. java物联网第三天 智慧农业物联网
  12. 最简单的可拖拽窗口教程
  13. 阿里云RDS数据库设置
  14. 告别夏日的烤串,迎来秋季的凉爽
  15. vue2 ElementUI 表单标签、表格表头添加问号图标提示
  16. Laravel 批量注入的安全处理,通过模型的 fillable 和 guarded 解决
  17. PLSQL Oracle存储过程(实例分析)
  18. Windows 下最实用的 Gvim 配置
  19. 微星Z390主板双SSD+HDD,win10系统下安装Ubuntu18.04系统借鉴参考
  20. Python(24)python中的calendar模块(日历模块)

热门文章

  1. springboot-websocket-netty
  2. HystrixDashbord
  3. aop简介-aop相关概念
  4. MyBatis使增删改不刷新二级缓存
  5. java调用存储过程之环境测试
  6. spring的aop配置-配置将通知织入目标对象
  7. java jdbc url编码_java中jdbc/sql出现编码问题
  8. Redis与Lua详解
  9. 图片去字工具_这些免费工具轻松提取图片中的文字,别再傻傻地手工去输了
  10. python调用winrar解压_批量文件解压缩脚本(Python3.5 + WinRAR)