一种3D空间的柱状多边形检测实现

最近无意中拓展出这个东西,基于之前写的2D多边形检测:
http://www.cnblogs.com/hont/p/6105997.html
而判断两条线相交的方法替换成了我后来写的差乘判断:
http://www.cnblogs.com/hont/p/6106043.html
应用还是比较广泛的,特别是多边形选区和地形处理上
代码实现:
using UnityEngine; public class Test : MonoBehaviour
{
public Transform testComparePoint;
public Transform[] pointsArray;
public float height = ; public bool IsInRange(Vector3 comparePoint)
{
var localComparePoint = transform.worldToLocalMatrix.MultiplyPoint3x4(comparePoint); var flag = true;
flag &= localComparePoint.y <= height;
flag &= localComparePoint.y >= -height;
flag &= IsConcaveContain2D(pointsArray, localComparePoint); if (flag)
return true; return false;
} public bool IsConcaveContain2D(Transform[] points, Vector3 compare)
{
const float VIRTUAL_RAYCAST_LEN = ; var comparePoint = (points[].localPosition + points[].localPosition) * 0.5f;
var originPoint = compare;
comparePoint += (comparePoint - originPoint).normalized * VIRTUAL_RAYCAST_LEN; int count = ;
for (int i = ; i < points.Length; i++)
{
var a = points[i % points.Length];
var b = points[(i + ) % points.Length]; var r = IsLineSegmentIntersection(a.localPosition, b.localPosition, originPoint, comparePoint); if (r) count++;
} return count % == ;
} public bool IsLineSegmentIntersection(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;
} void OnDrawGizmos()
{
if (pointsArray == null) return; if (testComparePoint != null)
{
var comparePoint = testComparePoint.transform.position;
if (IsInRange(comparePoint))
{
Gizmos.color = Color.red;
}
} var cacheMatrix = Gizmos.matrix;
Gizmos.matrix = transform.localToWorldMatrix; for (int i = ; i < pointsArray.Length; i++)
{
var a = pointsArray[i];
var b = pointsArray[(i + ) % pointsArray.Length]; if (a == null) continue;
if (b == null) continue; var minA = a.localPosition;
var minB = b.localPosition; var maxA = a.localPosition;
var maxB = b.localPosition; minA.y = -height;
minB.y = -height; maxA.y = height;
maxB.y = height; Gizmos.DrawLine(minA, minB);
Gizmos.DrawLine(maxA, maxB); Gizmos.DrawLine(minA, maxA);
Gizmos.DrawLine(minB, maxB);
} Gizmos.color = Color.clear; Gizmos.matrix = cacheMatrix;
}
}
一种3D空间的柱状多边形检测实现的更多相关文章
- Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)
Python的可视化包 – Matplotlib Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表.Matplotlib最早是为了可 ...
- NeHe OpenGL教程 第五课:3D空间
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 使用WinForm Chart控件 制作饼装,柱状,折线图
http://blog.csdn.net/dream2050csdn/article/details/53510340 chart控件的属性很多,主要用到Chart控件图表区域的属性有五个属性 1.A ...
- OpenGL学习进程(9)在3D空间的绘制实例
本节将演示在3D空间中绘制图形的几个简单实例: (1)在3D空间内绘制圆锥体: #include <GL/glut.h> #include <math.h> # ...
- 第05课 OpenGL 3D空间
3D空间: 我们使用多边形和四边形创建3D物体,在这一课里,我们把三角形变为立体的金子塔形状,把四边形变为立方体. 在上节课的内容上作些扩展,我们现在开始生成真正的3D对象,而不是象前两节课中那样3D ...
- iOS 使用Charts框架 折线,柱状,K线,饼状,雷达全攻略
我是前言: 大约几个月前我在某平台写了一篇文章, 文中简单地介绍了Charts两种图表的样式的使用, 不过有种意犹未尽的感觉, 利用周末的空闲时间再次看了看, 有了新的收获, 今天发出来,分享给大家, ...
- Direct3D 11 Tutorial 4: 3D Spaces_Direct3D 11 教程4:3D空间
概述 在上一个教程中,我们在应用程序窗口的中心成功渲染了一个三角形. 我们没有太注意我们在顶点缓冲区中拾取的顶点位置. 在本教程中,我们将深入研究3D位置和转换的细节. 本教程的结果将是渲染到屏幕的3 ...
- 视觉SLAM的数学基础 第一篇 3D空间的位置表示
视觉SLAM中的数学基础 第一篇 3D空间的位置表示 前言 转眼间一个学期又将过去,距离我上次写<一起做RGBD SLAM>已经半年之久.<一起做>系列反响很不错,主要由于它为 ...
- Android 自定义View - 柱状波形图 wave view
前言 柱状波形图是一种常见的图形.一个个柱子按顺序排列,构成一个波形图. 柱子的高度由输入数据决定.如果输入的是音频的音量,则可得到一个声波图. 在一些音频软件中,我们也可以左右拖动声波,来改变音频的 ...
随机推荐
- cocos2d-js Shader系列2:在cc.Sprite上使用Shader(黑白、灰度、造旧效果)
在Sprite中使用Shader做特殊的颜色处理比较简单,只需要把Shader程序绑定到Sprite上即可: sprite.shaderProgram = alphaTestShader; Cocos ...
- iWatch应用开发-oc篇
1.创建项目 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/di ...
- springMVC加载远程freemarker模板文件
在一个大网站里,有很多子域名,也就是有很多子系统,这些子系统由不同的团队负责,对整个网站的风格的风格至少得要是一致的(最基本的页头.页尾必须一致),这个时候得提供一份统一的页头.页尾以及公共的JS.c ...
- 怎么查看mysql的数据库编码格式
一.查看MySQL数据库服务器和数据库MySQL字符集. show variables like "%char%" 二.查看MySQL数据表(table)的MySQL字符集. sh ...
- SSM框架搭建总结(2)
一.开发环境搭建 1.本地jdk安装及配置环境变量 2.本地tomcat安装 3.本地maven安装 3.1 maven安装 3.2 maven数据仓库配置settings.xml 4.本地安装SVN ...
- loadrunner 脚本开发-参数化之将内容保存为参数、参数数组及参数值获取
转自:http://blog.sina.com.cn/s/blog_13cc013b50102v49c.html(查看原文) 在VuGen中默认使用{}的字符串称为参数 注意:参数必须在双引号中才能用 ...
- 【tp5】索引数组转成关联数组 ( $a=[],转换成 $a['aa'=>2,'bb'=>'3c'] )
概念: 索引数组 ==== >>>$arr = []; 关联数组 ====>>> $arr = [ 'orange'=>1,'apple'=>'good ...
- ios实例开发精品文章推荐(7.23)
---------------------------------------------------------------------------------------------------- ...
- PHPNow升级PHP版本为5.3.5的方法(转)
PHPNow升级PHP版本为5.3.5的方法 原文:http://sharebar.org/1142.html 在WIN上有时候需要测试一些PHP程序,又不会自行独立配置环境,那么PHPNow是非常好 ...
- Spring4+Hibernate4事务小记
学习Spring+Hibernate,非常强大的框架,为了追新,就直接从最高版本开始学习了,这要冒很大的风险,因为网上可查到的资料大多是针对旧版本的,比如Spring3,Hibernate3. 根据我 ...