[射线法]判断一个点是否在多边形内部

空间搜索-射线法 在几何学中,PIP(Point in Polygon)问题即判断一点在多边形的内部或外部。 射线法(Ray casting algorithm)是一种判断点是否在多边形内部的一种简单方法。即从该点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外部。 阅读详情
AI摘要

本文介绍了一种判断点是否位于多边形内部的射线法算法,并提供了详细的实现步骤与OpenCV示例代码。

思路及实现转自“前端乱炖”,最后测试为自己修改后的代码。

一、思路

前言:本文源于前几天看到的一条微博 http://weibo.com/1057676857/Adpfwwfsv

这里写图片描述

对于 po 主的言论我并不赞同。我是学化学的,没有学过计算机专业的课程,但凭直觉我认为这应该也是计算机图形学里面比较常见的一类问题。并且我认为这并不需要多么高端的计算机专业知识,只要中学数学没有全还给老师,就应该能给出至少一种解法。下面就试着解一下这个题吧。

比如说,我就随便涂了一个多边形和一个点,现在我要给出一种通用的方法来判断这个点是不是在多边形内部(别告诉我用肉眼观察……)。

这里写图片描述

首先想到的一个解法是从这个点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外。

enter image description here

这个结论很简单,那它是怎么来的?下面就简单讲解一下。

首先,对于平面内任意闭合曲线,我们都可以直观地认为,曲线把平面分割成了内、外两部分,其中“内”就是我们所谓的多边形区域。

enter image description here

基于这一认识,对于平面内任意一条直线,我们可以得出下面这些结论:

  • 直线穿越多边形边界时,有且只有两种情况:进入多边形或穿出多边形。
  • 在不考虑非欧空间的情况下,直线不可能从内部再次进入多边形,或从外部再次穿出多边形,即连续两次穿越边界的情况必然成对。
  • 直线可以无限延伸,而闭合曲线包围的区域是有限的,因此最后一次穿越多边形边界,一定是穿出多边形,到达外部。
    enter image description here

现在回到我们最初的题目。假如我们从一个给定的点做射线,还可以得出下面两条结论:

  • 如果点在多边形内部,射线第一次穿越边界一定是穿出多边形。
  • 如果点在多边形外部,射线第一次穿越边界一定是进入多边形。
    enter image description here

把上面这些结论综合起来,我们可以归纳出:

  • 当射线穿越多边形边界的次数为偶数时,所有第偶数次(包括最后一次)穿越都是穿出,因此所有第奇数次(包括第一次)穿越为穿入,由此可推断点在多边形外部。
    enter image description here
  • 当射线穿越多边形边界的次数为奇数时,所有第奇数次(包括第一次和最后一次)穿越都是穿出,由此可推断点在多边形内部。
    enter image description here

    到这里,我们已经了解了这个解法的思路,大家可以试着自己写一个实现出来。关于算法实现中某些具体问题和边界条件的处理,下次接着写,这次画图已经画够了……

    后记:给出这个解法后,我简单搜了一下,原来这种算法就叫做射线法(ray casting)或者奇偶规则法(even odd rule),是一种早已被广泛应用的算法。后面还打算介绍另一种通过回转数(winding number,拓扑学的一个概念)解这个问题的思路。

本站专栏文章皆为原创,转载请注明出处(带有 前端乱炖 字样)和本文的显式链接(http://www.html-js.com/article/1517),本站和作者保留随时要求删除文章的权利!



二、实现

看过上一次的思路讲解后,不知道大家思考得怎么样,有没有遇到一些不好处理的特殊情况。今天就来讲讲射线法在实际应用中的一些问题和解决方案。

  1. 点在多边形的边上

    前面我们讲到,射线法的主要思路就是计算射线穿越多边形边界的次数。那么对于点在多边形的边上这种特殊情况,射线出发的这一次,是否应该算作穿越呢?

    enter image description here

    看了上面的图就会发现,不管算不算穿越,都会陷入两难的境地——同样落在多边形边上的点,可能会得到相反的结果。这显然是不正确的,因此对这种特殊情况需要特殊处理。

  2. 点和多边形的顶点重合

    enter image description here

    这其实是第一种情况的一个特例。

  3. 射线经过多边形顶点

    射线刚好经过多边形顶点的时候,应该算一次还是两次穿越?这种情况比前两种复杂,也是实现中的难点,后面会讲解它的解决方案。

    enter image description here

  4. 射线刚好经过多边形的一条边

    这是上一种情况的特例,也就是说,射线连续经过了多边形的两个相邻顶点。

    enter image description here

解决方案:

1. 判断点是否在线上的方法有很多,比较简单直接的就是计算点与两个多边形顶点的连线斜率是否相等,中学数学都学过。

2. 点和多边形顶点重合的情况更简单,直接比较点的坐标就行了。

3. 顶点穿越看似棘手,其实我们换一个角度,思路会大不相同。先来回答一个问题,射线穿越一条线段需要什么前提条件?没错,就是线段两个端点分别在射线两侧。只要想通这一点,顶点穿越就迎刃而解了。这样一来,我们只需要规定被射线穿越的点都算作其中一侧。

enter image description here

如上图,假如我们规定射线经过的点都属于射线以上的一侧,显然点D和发生顶点穿越的点C都位于射线Y的同一侧,所以射线Y其实并没有穿越CD这条边。而点C和点B则分别位于射线Y的两侧,所以射线Y和BC发生了穿越,由此我们可以断定点Y在多边形内。同理,射线X分别与AD和CD都发生了穿越,因此点X在多边形外,而射线Z没有和多边形发生穿越,点Z位于多边形外。

4. 解决了第三点,这一点就毫无难度了。根据上面的假设,射线连续经过的两个顶点显然都位于射线以上的一侧,因此这种情况看作没有发生穿越就可以了。由于第三点的解决方案实际上已经覆盖到这种特例,因此不需要再做特别的处理。

问题都解决了,其实并不复杂,不是吗?啥也不说了,上代码。

  /**
   * @description 射线法判断点是否在多边形内部
   * @param {Object} p 待判断的点,格式:{ x: X坐标, y: Y坐标 }
   * @param {Array} poly 多边形顶点,数组成员的格式同 p
   * @return {String} 点 p 和多边形 poly 的几何关系
   */
  function rayCasting(p, poly) {
    var px = p.x,
        py = p.y,
        flag = false

    for(var i = 0, l = poly.length, j = l - 1; i < l; j = i, i++) {
      var sx = poly[i].x,
          sy = poly[i].y,
          tx = poly[j].x,
          ty = poly[j].y

      // 点与多边形顶点重合
      if((sx === px && sy === py) || (tx === px && ty === py)) {
        return 'on'
      }

      // 判断线段两端点是否在射线两侧
      if((sy < py && ty >= py) || (sy >= py && ty < py)) {
        // 线段上与射线 Y 坐标相同的点的 X 坐标
        var x = sx + (py - sy) * (tx - sx) / (ty - sy)

        // 点在多边形的边上
        if(x === px) {
          return 'on'
        }

        // 射线穿过多边形的边界
        if(x > px) {
          flag = !flag
        }
      }
    }

    // 射线穿过多边形边界的次数为奇数时点在多边形内
    return flag ? 'in' : 'out'
  }

本站专栏文章皆为原创,转载请注明出处(带有 前端乱炖 字样)和本文的显式链接(http://www.html-js.com/article/1528),本站和作者保留随时要求删除文章的权利!



测试并用OpenCV显示

Lib: OpenCV 2.4.9
Tools: Visual Studio 2013
Tips: 在测试前请先编译并配置好OpenCV(项目属性VC++目录中的包含目录、库目录,还有链接器中的输入)

#include <iostream>
#include <vector>
#include <fstream>
#include "imgproc.hpp"  
#include "highgui.h"  
#include "opencv2/opencv.hpp"  

using namespace std;
using namespace cv;

struct Point2D{
    int x;
    int y;
};

/*
*   函数功能:判断点是否在多边形内
*   输入参数: vector<Point2D> poly  构成多边形的顶点坐标
*             int x                 需要判断点的横坐标
*             int y                 需要判断点的纵坐标
*   返 回 值: bool  true为在多边形内,false为不在。也可修改为返回string,用于区分:多边形上、多边形内、多边形外
*/
bool PointInPolygon(vector<Point2D> poly, int x, int y)
{
    bool flag = false;
    int size = poly.size();
    for (int i = 0, j = size - 1; i < size; j = i, i++)
    {
        int x1 = poly[i].x;
        int y1 = poly[i].y;
        int x2 = poly[j].x;
        int y2 = poly[j].y;

        // 点与多边形顶点重合
        if ((x1 == x && y1 == y) || (x2 == x && y2 == y))
        {
            //return 'on'; // 点在轮廓上
            return true;
        }

        // 判断线段两端点是否在射线两侧
        if ((y1 < y && y2 >= y) || (y1 >= y && y2 < y)) // 只有一边取等号,当射线经过多边形顶点时,只计一次
        {
            // 线段上与射线 Y 坐标相同的点的 X 坐标
            double crossX = (y - y1) * (x2 - x1) / (y2 - y1) + x1;  // y=kx+b变换成x=(y-b)/k 其中k=(y2-y1)/(x2-x1)

            // 点在多边形的边上
            if (crossX == x)
            {
                //return 'on'; // 点在轮廓上
                return true;
            }

            // 右射线穿过多边形的边界,每穿过一次flag的值变换一次
            if (crossX > x)
            {
                flag = !flag;  // 穿过奇数次为true,偶数次为false
            }
        }
    }

    // 射线穿过多边形边界的次数为奇数时点在多边形内
    //return flag ? 'in' : 'out'; // 点在轮廓内或外
    return flag ? true : false;
}

Mat DrowPolygon(vector<Point2D> rois)
{
    // 绘制一块黑布
    Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);


    // 初始化默认第一个点为最大最小XY
    int minX = rois[0].x;
    int maxX = rois[0].x;
    int minY = rois[0].y;
    int maxY = rois[0].y;
    int tempX = 0;
    int tempY = 0;

    // 寻找ROI边界
    for (vector<Point2D>::const_iterator it = rois.cbegin(); it != rois.cend(); it++)
    {
        tempX = (*it).x;
        tempY = (*it).y;
        if (tempX > maxX)
        {
            maxX = tempX;
        }
        if (tempX < minX)
        {
            minX = tempX;
        }
        if (tempY > maxY)
        {
            maxY = tempY;
        }
        if (tempY < minY)
        {
            minY = tempY;
        }
    }

    // 蓝色边框
    rectangle(canvas, Rect(minX, minY, maxX - minX, maxY - minY), CV_RGB(0, 0, 255), 1);

    // 遍历找到多边形内部的点
    ofstream out("mask.txt");    // 将多边形内的坐标输出到mask.txt
    int inPolygon = 0;
    int outPolygon = 0;
    int count = 0;
    for (int i = minY; i <= maxY; i++)
    {
        int rawNum = 0;
        for (int j = minX; j <= maxX; j++)
        {
            count++;
            if (PointInPolygon(rois, j, i))
            {
                out << j << " " << i << endl;
                inPolygon++;
                rawNum++;
                circle(canvas, Point(j, i), 1, CV_RGB(255, 0, 0));
            }
            else
            {
                outPolygon++;
            }
        }
        cout << "y = " << i << " PointNum:" << rawNum << endl;
    }
    out.close();

    // 最大最小边界
    cout << "minX: " << minX << endl;
    cout << "maxX: " << maxX << endl;
    cout << "minY: " << minY << endl;
    cout << "maxY: " << maxY << endl;

    // 在多边形内外点的个数及总数count
    cout << "count: " << count << endl;
    cout << "inPolygon: " << inPolygon << endl;
    cout << "outPolygon: " << outPolygon << endl;



    // 绘制绿色多边形  
    int pointSize = rois.size();
    for (int i = 0; i < pointSize; i++)
    {
        if (i + 1 == pointSize)
        {
            line(canvas, Point(rois[i].x, rois[i].y), Point(rois[0].x, rois[0].y), CV_RGB(0, 255, 0));
        }
        else
        {
            line(canvas, Point(rois[i].x, rois[i].y), Point(rois[i + 1].x, rois[i + 1].y), CV_RGB(0, 255, 0));
        }
    }

    return canvas;
}

void main()
{
    vector<Point2D> polygon;
    Point2D p;

    // 从ori.txt中读入多边形的坐标
    ifstream in("ori.txt");    
    while (in >> p.x >> p.y)
    {
        polygon.push_back(p);
    }
    in.close();

    imshow("Polygon", DrowPolygon(polygon));
    waitKey(0);
}

input: ori.txt
175 189
166 195
156 204
154 213
154 226
162 232
177 238
195 231
205 226
211 219
217 208
219 192
216 181
199 181
190 186

console output:
y = 181 PointNum:2
y = 182 PointNum:20
y = 183 PointNum:22
y = 184 PointNum:24
y = 185 PointNum:27
y = 186 PointNum:28
y = 187 PointNum:33
y = 188 PointNum:38
y = 189 PointNum:44
y = 190 PointNum:46
y = 191 PointNum:47
y = 192 PointNum:50
y = 193 PointNum:51
y = 194 PointNum:53
y = 195 PointNum:54
y = 196 PointNum:56
y = 197 PointNum:57
y = 198 PointNum:58
y = 199 PointNum:59
y = 200 PointNum:59
y = 201 PointNum:60
y = 202 PointNum:61
y = 203 PointNum:62
y = 204 PointNum:63
y = 205 PointNum:64
y = 206 PointNum:64
y = 207 PointNum:64
y = 208 PointNum:63
y = 209 PointNum:64
y = 210 PointNum:63
y = 211 PointNum:63
y = 212 PointNum:62
y = 213 PointNum:62
y = 214 PointNum:61
y = 215 PointNum:61
y = 216 PointNum:60
y = 217 PointNum:60
y = 218 PointNum:59
y = 219 PointNum:58
y = 220 PointNum:58
y = 221 PointNum:57
y = 222 PointNum:56
y = 223 PointNum:55
y = 224 PointNum:54
y = 225 PointNum:53
y = 226 PointNum:52
y = 227 PointNum:48
y = 228 PointNum:45
y = 229 PointNum:42
y = 230 PointNum:38
y = 231 PointNum:35
y = 232 PointNum:32
y = 233 PointNum:26
y = 234 PointNum:22
y = 235 PointNum:16
y = 236 PointNum:12
y = 237 PointNum:6
y = 238 PointNum:1
minX: 154
maxX: 219
minY: 181
maxY: 238
count: 3828
inPolygon: 2710
outPolygon: 1118

显示结果

Show Polygon

射线法学习记录 射线法的优化1.射线法简述具体处理python代码 1.射线法简述 因为工作需要,所以需要判断某个坐标的点是不是在某个区域范围(单个闭合多边形)内。经过在网上搜索资料,发现射线法能解决我的问题,并且十分巧妙,记录一下。 原理: 1.如果一个点在一个多边形内部,那么以它为起始点,发射一条射线(任意方向),那么它至少会和一条边相交,也就是有一个交点。如图所示 2.如果点在多边形内部出发射线不止和一条... 阅读详情

相关推荐

射线法

射线法 这是一个大佬看了都说简单的算法。。。。(甚至觉得没有掌握的必要) QAQ 这个算法是用来判断一个点是否在一个多边形以内。很简单 将这个点沿着x轴的正方向作射线。如果穿过的边数为基数,那么这个点在多边形内;反之不在。 由于有可能出现经过两条边的相邻的点,而被重复计算的情况。我们只需要采用上加下不加策略,即如果射线经过了这条边的上顶点,则cnt++,如果经过下顶点,则不变。经过这条边上除了上顶...

qq_45342177的博客 1712

判断点与多边形的关系(4):射线法

终极大招来了,射线法是解决这一问题的最优方法,其他方法仅具有理论意义,如果工程应用的话,知道这个方法就够了。 射线法的思想是:以目标点为端点引一条射线,计算这条射线和多边形所有边的交点数目。如果交点个数为奇数,则点在多边形部,反之则在多边形外部。

ezhchai的博客 1万+

Qt之判断一个点是否在多边形内部(射线法)

以被测点Q为端点,向任意方向作射线(一般水平向右作射线),统计该射线与多边形的交点数。其次,对多边形的顶点和射线相交的情况,如果该顶点是其所属的边上纵坐标较大的顶点,则计数,否则忽略该点;最后,对于Q在多边形边上的情形,直接可以判断Q属于多边形。在图A中,射线与多边形的顶点相交,这时交点只能计算一个;在图B中,射线与多边形顶点的交点不应被计算;在图C中,射线与多边形的一条边重合,这条边应该被忽略不计。为了统一起见,射线可设定为水平向右,设点P的纵坐标与Q相同,P的横坐标为一大的整数,则可用QP代替射线。

草上爬的博客 3536

计算机图形学——射线法与碰撞检测

射线通常定义为:O\mathbf{O}O 为射线的起点(通常为摄像机位置或交点位置)。D\mathbf{D}D 为射线的方向向量。ttt 为参数,用于确定射线在方向 D\mathbf{D}D 上的延伸距离。射线追踪会依赖“递归”实现光的多次反射和折射。当射线遇到物体时,可能生成一个反射射线和一个折射射线,对每条新射线继续追踪,直至满足终止条件。射线法在3D渲染中能碰撞检测是计算机图形学、物理仿真等领域的重要技术。它的实施通常包含广义阶段和狭义阶段,每个阶段都有不同的方法和算法。

警警的博客 2764

DIY音频必备:手把手教你用AB类功放模块打造高保真桌面音响(含电路图)

本文详细指导如何利用AB类功放模块DIY高保真桌面音响,涵盖选型指南、核心元器件清单、电路搭建与焊接工艺,以及系统调试与音质优化技巧。AB类功放以其接近A类功放的音质和B类功放的效率,成为音频爱好者的理想选择,适合有一定电子基础的实践者。

weixin_42665725的博客 443

基于STM32与MPU6050的实时姿态检测系统设计与实现(源码+硬件解析)

本文详细介绍了基于STM32单片机与MPU6050传感器的实时姿态检测系统设计与实现。通过硬件解析、传感器校准、卡尔曼滤波算法和欧拉角计算,实现高精度姿态检测。提供完整源码和调试技巧,适用于无人机、平衡车等嵌入式开发项目,解决噪声干扰和数据漂移等常见问题。

jupi8的博客 493

射线法——判断一个点是否在多边形内部(适用于凸多边形和凹多边形)【关键原理解释+文字伪代码+java代码实现】

给定一个点和一个多边形(由点集的点依次连接构成),需要判断该点是否在多边形的内部。

我只管埋头前行,剩下的交给时间。 6430

京东云鼎环境配置与API安全接入实战:ISV服务商如何搞定数据加密与商家授权

本文详细介绍了京东云鼎环境配置与API安全接入的实战指南,帮助ISV服务商解决数据加密与商家授权等核心问题。通过京东开放平台的应用申请流程,结合多租户数据隔离策略和自动化授权实现,确保电商生态中的安全高效运营。文章还提供了避坑指南,助力开发者规避常见配置错误。

weixin_28705087的博客 353

判断地图上一个点是否在多边形内部--射线法

比如说,我就随便涂了一个多边形和一个点,现在我要给出一种通用的方法来判断这个点是不是在多边形内部(别告诉我用肉眼观察……)。 首先想到的一个解法是从这个点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外。 这个结论很简单,那它是怎么来的?下面就简单讲解一下。 首先,对于平面内任意闭合曲线,我们都可以直观地认为,曲线把平面分割成了内、外两部分,其中“内”就是我们所谓的多边形区域。 基于这一认识,对于平面内任意一条直线,我们可以得出下面这些结

岩的博客 1049

昆仑通态屏幕制作(连载1)---接触篇

写在开始 背景:最近出了做QT、LORA和4G,还做了一个屏幕。以前做了一个迪文的串口屏幕,发现网上的教程很多,所以连载就不更新了,并且迪文屏幕的设置什么的比较简单,应该从网上都能找到对应的教程。而现在用的昆仑通态的屏幕属于嵌入式屏幕,至于为啥叫嵌入式,也不是很明白,反正就是需要用这个屏幕,嵌入式不嵌入式不重要了。重要的是能用,并且能实现串口屏幕不能实现的功能。所以选定昆仑通态的一款屏幕。 文章语言:我比较习惯用比较糙的语言介绍做的东西,有时候不太准备,但是为了方便理解,还请大家谅解。用...

weixin_45426095的博客 6735

Java的API帮助文档

JDK帮助文档 SUN公司为JDK工具包提供了一整套文档资料,我们习惯上称之为JDK文档。 JDK文档中提供了Java中的各种技术的详细资料,以及JDK中提供的各种类的帮助说明。 JDk文档是Java语言的完整说明,大多数书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料 如何理解API:就当做是一个“字典”,“使用手册”,API就相当于是一个电子的帮助文档,可以帮我们查看JDK提供的类的信息,平时查看的时候可结合百度一起看。 官网下载: 1、登录Oracle官网(Oracl.

人生得意须尽欢 2万+

判断一个点是否在多边形内部 - 射线法思路

原文链接判断一个点是否在多边形内部 [1] 射线法思路、 判断一个点是否在多边形内部 [2] 射线法实现比如说,我就随便涂了一个多边形和一个点,现在我要给出一种通用的方法来判断这个点是不是在多边形内部(别告诉我用肉眼观察……)。首先想到的一个解法是从这个点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外。这个结论很简单,那它是怎么来的?下面就简单讲

sherlockreal的博客 2万+

YOLOv11知识蒸馏实战:让小模型拥有大模型90%精度,速度提升3倍的终极教程

在self.alpha = alpha # 蒸馏损失权重self.temperature = temperature # 温度系数,控制分布平滑度# 输出分布蒸馏(KL散度损失)# 中间特征蒸馏(MSE损失,对齐中间层特征)# 总蒸馏损失知识蒸馏是YOLOv11在“小模型高性能部署”场景的“破局之法”——它让小模型能“站在大模型的肩膀上”,兼具速度与精度。从损失函数定义到多阶段训练,再到实战落地,本教程已为你铺就了一条清晰的路径。

m0_64661770的博客 801

射线法判断一个点是否在多边形内部(js版)

射线法判断一个点是否在多边形内部

qq_23447231的博客 4614

PCL 快速均匀下采样

快速均匀下采样 是一种点云降采样技术,通过设置采样步长来实现等距降采样,从而减少点的数量。用户可以通过指定步长,选择每隔一定数量的点采样一个点,这样可以在保持点云几何特性的同时,显著减少点的数量。

纵马踏花向自由 870

让 ABAP 再次优雅:全面认知 ABAP Development Tools for SAP HANA(ADT)与可运行示例

本文介绍了ABAP开发工具ADT(ABAP Development Tools for SAP HANA)的核心概念与价值。ADT是基于Eclipse的现代化ABAP集成开发环境,支持ABAP Platform、S/4HANA等后端开发,提供代码编辑、CDS数据建模、质量检查等全流程功能,相比传统SAP GUI具有显著优势。文章详细阐述了ADT与SAP HANA的关系、关键能力模块(如代码重构、CDS建模、质量管控等),并通过一个制造企业案例说明其实际应用场景。最后提供了ADT安装指南和一个完整的ABAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 669

判断一个点是否在多边形内部 [2] 射线法实现

原文出处:http://www.html-js.com/article/1528 看过上一次的思路讲解后,不知道大家思考得怎么样,有没有遇到一些不好处理的特殊情况。今天就来讲讲射线法在实际应用中的一些问题和解决方案。 点在多边形的边上 前面我们讲到,射线法的主要思路就是计算射线穿越多边形边界的次数。那么对于点在多边形的边上这种特殊情况,射线出发的这一次,是否应该算作穿越呢?

chelen_jak的专栏 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

判断一个点是否在多边形内部 [1] 射线法思路

原文出处:http://www.html-js.com/article/1517 前言:本文源于前几天看到的一条微博 http://weibo.com/1057676857/Adpfwwfsv 对于 po 主的言论我并不赞同。我是学化学的,没有学过计算机专业的课程,但凭直觉我认为这应该也是计算机图形学里面比较常见的一类问题。并且我认为这并不需要多么高端的计算机专业知识,只要中学数学没有

chelen_jak的专栏 2011

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

判断一个点是否在多边形内部 --射线法思路

一、比如说,我就随便涂了一个多边形和一个点,现在我要给出一种通用的方法来判断这个点是不是在多边形内部(别告诉我用肉眼观察……)。 首先想到的一个解法是从这个点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外。 这个结论很简单,那它是怎么来的?下面就简单讲解一下。 首先,对于平面内任意闭合曲线,我们都可以直观地认为,曲线把平面分割成了内...

gkingzheng的专栏 7475

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java射线法判断一个点是否在一个多边形内部

看到网络上大量重复的博客,书写类似的代码。但英文解释并不清晰,希望通过此博客给出详尽解释。 import java.awt.geom.Point2D; import java.util.List; public class GeoUtils { /** * 判断点是否在多边形内 * <p> * 整个算法的思路为:作点平行于y轴的射线,这样就可以直接比较交点是否大于点(x,y)中y的值,可以简化判断。 * * @param point

喜爱设计架构,追求项目可控。 1905

判断一个点是否在多边形内部,射线法思路,C#实现

感谢原作者,原理请看原作者的文章http://www.html-js.com/article/1517 C#实现 public string rayCasting(PointF p, PointF[] poly) { var px = p.X; var py = p.Y; var...

weixin_30938149的博客 317

射线法判断地图上点是否在多边形内

1. 射线法介绍 在地图应用上,我们会经常需要判断一个点是否位于多边形区域内,这里介绍下采用射线法如何实现。 算法思想:从待判断的点向某一个方向引射线,计算和多边形交点的个数,如果个数是偶数或者0,则点在多边形外,如果是奇数,则在多边形内,如下图: 这里有两种情况需要特殊处理: 1) 射线经过顶点:当射线经过顶点时,判断就会出现异常情况。 2) 点在边上:这种

提笔写忧伤 7398

判断一个点是否在一个复杂多边形的内部

如何判断一个点是否在多边形内部? (1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。 (2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,为360度则在多边形内部。 (3)引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。

ShangQuan2012的博客 5188

判断点是否在多边形的内部(C#)

要判断点是否在多边形的内部,适用于任意多边形的方法最常用的就是射线法,即以要判断的点向左或者向右作水平射线,与多边形交点的个数为奇数个时则在多边形的内部,若为偶数个交点时则在多边形的外部,其中0个交点也为偶数个交点。 依据该原理,于是有了第一种实现 /// /// 判断点是否在多边形内. /// ----------原理----------

学而时习之 1万+

射线法判断一个点是否在多边形内

射线法判断一个点是否在多边形内

zjzytnn的博客 2411

判断一个点是否在不规则图形中

本文转自https://www.cnblogs.com/anningwang/p/7581545.html(转载只为保存方方便之后查看) 判断一个点是否在多边形内部 - 射线法思路 比如说,我就随便涂了一个多边形和一个点,现在我要给出一种通用的方法来判断这个点是不是在多边形内部(别告诉我用肉眼观察……)。 首先想到的一个解法是从这个点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,...

u014421970的博客 5728
上一篇: [Office]Win7(x64)旗舰版安装Office 2013专业版的过程中提示在安装过程中出错
下一篇: [回转数法]判断一个点是否在多边形内部
o_0123
博客等级 码龄12年 37粉丝 34原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值