2D空间中求一点是否在多边形内
参考自这篇博文:http://www.cnblogs.com/dabiaoge/p/4491540.html
一开始没仔细看做法,浪费了不少时间。下面是最终实现的效果:
大致流程:
1.随便选取多边形上任意一条边,以比较点和边的中心点做一条射线(这里用的伪射线)。
2.用这条射线与其他所有边判断是否相交。
3.将所有与线段相交的数量相加,如果是奇数就在多边形内。
特殊情况:
1.刚好在点上或者在线上。实际运用时会有点误差,但不影响。
2.必须是闭合线段,且不能存在包含的情况。但如果是一个数组生成的线段,不会有这种情况
代码(Unity3D):
using UnityEngine;
using System.Collections; public class Test1 : MonoBehaviour
{
const float RAYCAST_LEN = 100000f;
public Transform[] points;
public Transform compare; bool IsContract(Transform compare)
{
var comparePoint = (points[].position + points[].position) * 0.5f;
var originPoint = compare.transform.position;
comparePoint += (comparePoint - originPoint).normalized * RAYCAST_LEN; Debug.DrawLine(originPoint, comparePoint); int count = ;
for (int i = ; i < points.Length; i++)
{
var a = points[i % points.Length];
var b = points[(i + ) % points.Length]; var r = IsIntersection(a.position, b.position, originPoint, comparePoint); if (r) count++;
} return count % == ;
} void OnDrawGizmos()
{
if (compare == null) return; var oldColor = Gizmos.color; if (IsContract(compare))
Gizmos.color = Color.red; for (int i = ; i < points.Length; i++)
{
var a = points[i % points.Length];
var b = points[(i + ) % points.Length]; Gizmos.DrawLine(a.position, b.position);
} Gizmos.color = oldColor;
} bool IsIntersection(Vector3 a, Vector3 b, Vector3 c, Vector3 d)
{
var crossA = Mathf.Sign(Vector3.Cross(d - c, a - c).y);
var crossB = Mathf.Sign(Vector3.Cross(d - c, b - c).y); if (Mathf.Approximately(crossA, crossB)) return false; var crossC = Mathf.Sign(Vector3.Cross(b - a, c - a).y);
var crossD = Mathf.Sign(Vector3.Cross(b - a, d - a).y); if (Mathf.Approximately(crossC, crossD)) return false; return true;
}
}
另外参考的文章中没有说差乘判断两个线段是否相交的具体做法,这里说明一下
大致流程:
现在有线段AB和线段CB
用线段AB的方向和C,D两点分别做差乘比较。如果C,D在同侧则return跳出
用线段CD的方向和A,B两点分别做差乘比较。如果A,B在同侧则return跳出
最终返回相交
脚本就是上面的IsIntersection函数,最终实现效果(只适用于2D空间,如果是XY轴向要取差乘的z分量做比较):
2D空间中求一点是否在多边形内的更多相关文章
- 2D空间中判断一点是否在三角形内
要注意如果是XY坐标轴的2D空间,要取差乘分量z而不是y. 实现原理是,将三角形ABC三个边(AB,BC,CA)分别与比较点判断差乘,如果这3个差乘结果表示的方向一致,说明就在三角形内. 效果: 代码 ...
- 2D空间中求两圆的交点
出处:https://stackoverflow.com/questions/19916880/sphere-sphere-intersection-c-3d-coordinates-of-colli ...
- 2D空间中求线段与圆的交点
出处: https://answers.unity.com/questions/366802/get-intersection-of-a-line-and-a-circle.html 测试脚本(返回值 ...
- [译]2D空间中使用四叉树Quadtree进行碰撞检测优化
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Unity2017.2.0f3 原文出处 : Quick Tip: Use Quadtrees to Detect Lik ...
- 2d游戏中求出一个向量的两个垂直向量
function cc.exports.VerticalVector(vec)--求出两个垂直向量 local result = {} result[1] = cc.p(vec.y/vec.x,-1) ...
- 2D和3D空间中计算两点之间的距离
自己在做游戏的忘记了Unity帮我们提供计算两点之间的距离,在百度搜索了下. 原来有一个公式自己就写了一个方法O(∩_∩)O~,到僵尸到达某一个点之后就向另一个奔跑过去 /// <summary ...
- Computer Science Theory for the Information Age-2: 高维空间中的正方体和Chernoff Bounds
高维空间中的正方体和Chernoff Bounds 本文将介绍高维空间中正方体的一些性质,以及一个非常常见也是非常有用的概率不等式——Chernoff Bounds. 考虑$d$维单位正方体$C=\{ ...
- Computer Science Theory for the Information Age-1: 高维空间中的球体
高维空间中的球体 注:此系列随笔是我在阅读图灵奖获得者John Hopcroft的最新书籍<Computer Science Theory for the Information Age> ...
- 为什么很多人坚信“富贵险中求”?
之家哥 2017-11-15 09:12:31 微信QQ微博 下载APP 摘要 网贷之家小编根据舆情频道的相关数据,精心整理的关于<为什么很多人坚信"富贵险中求"?>的 ...
随机推荐
- 使用Fiddler截断更改Request数据
0x01 Fiddler介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据.(百度百科) 0x ...
- find xargs exec rm
有时候比如我们删除上万行的文件种的几千行需要怎么做呢 如果配合find 和exec 因为exec有个内存溢出的可能所以一般都会有控制. 例如: find . -name *.log -exec rm ...
- cocos2d-x-3.1.1 创建项目
cocos new 项目名 -p 包名 -l 语言 -d 路径 cmd 输入以下命令 cocos new HelloLua -p com.wcc.hellolua -l lua -d E:\coc ...
- isset 和empty 两个函数的用法
关于用php 获取当前脚本的url很多朋友会说很简单,但是要获取很详细的就要经过多次判断哦. $PHP_TIME = time();$PHP_SELF = isset($_SERVER['PHP_SE ...
- Suffix array
A suffix array is a sorted array of all suffixes of a given string. The definition is similar to Suf ...
- Session 知识点再整理(二) 自定义 Session 存储机制
对于访问量大的网站,用默认的 Session 存储方式(以文件存储)不适合,因为文件的 I/O 开销会非常大,另外 Session 机制本身使 Session 不能跨机访问,在 Web 集群中无法达到 ...
- asp.net identity 2.2.0 在WebForm下的角色启用和基本使用(二)
管理用户功能: 界面部分: <%@ Page Title="" Language="C#" MasterPageFile="~/Site.mas ...
- 实现loading动画效果
下面我就来罗列三种实现loading动画效果的方法. 方法一:使用UIImageView自带的方法来实现,这也是我推荐的实现方法. NSMutableArray *array = [[NSMutabl ...
- node crypto md5加密,并解决中文不相同的问题
在用crypto模块时碰到了加密中文不相同的问题,多谢群里面@蚂蚁指定 1:解决中文不同的问题 function md5Pay(str) { str = (new Buffer(str)).toStr ...
- JAVA Math类
public class MathTest{ public static void main(String[] args) { /*---------下面是三角运算---------*/ //将 ...