Voronoi泰森多边形的实现
实现几何计算,然后实现凸包、Delaunay三角和Voronoi多边形。使用node运行。
几何计算实现点,直线一般式方程、两点式方程、点截式方程、直线交点、点与直线关系,三角形、矩形外接三角形,矩形,圆、三角形外接圆、点与圆关系计算。
凸包算法
graham() {let vs = this.children.filter(e=>e.getClass() == "Vertex");// find p0-y vectexlet p0 = vs[0];for (let v of vs) {if ( (v.y < p0.y) || (v.y==p0.y && v.x<p0.x))p0 = v;}vs.sort(function(a,b) {let d1 = Math.atan2( a.y-p0.y , a.x-p0.x ) * (180 / Math.PI);if (d1 < 0) d1 += 180;let d2 = Math.atan2( b.y-p0.y , b.x-p0.x ) * (180 / Math.PI);if (d2 < 0) d2 += 180;if (d1 < d2)return -1;else if (d1 > d2)return 1;else {p0.getDistance(a) - p0.getDistance(b) > 0 ? 1 : -1;}});let ps = [].concat(vs);let stack = new Array(ps.shift(), ps.shift());for (let current of ps) {let d;do {let top = stack.peek();let sec = stack[stack.length-2];let line = Line.TwoPoint(sec,top);d = line.position(current);if (d>0)top = stack.pop();} while (d > 0);stack.push(current);}
}
显示如下:
德洛内三角
DelaunayBowyer() {let indices = this.children.filter(e=>e.getClass() == "Vertex").sort((a,b)=>{return a.x == b.x ? 0 : (a.x < b.x ? -1 : 1);});let maxx = 0, maxy = 0, minx = Number.MAX_SAFE_INTEGER, miny = Number.MAX_SAFE_INTEGER;indices.forEach(v=>{if (v.x < minx) minx = v.x;if (v.x > maxx) maxx = v.x;if (v.y < miny) miny = v.y;if (v.y > maxy) maxy = v.y;});let r = new Rectangle(new Point(minx, miny), new Point(maxx, maxy));let supert = Triangle.ExternalTriangleFromRectangle(r);let vs = indices.concat([ supert.p0, supert.p1, supert.p2 ]); let ts =[ supert ]; for (let v of vs) {let edge = new CountArray();let i = ts.length - 1;while (i>=0) {let t = ts[i--]; let c = Circle.Circumcircle(t);let position = c.test(v);if (position == "out") {continue ;}else { edge.push(new Pair(t.p0, t.p1));edge.push(new Pair(t.p1, t.p2));edge.push(new Pair(t.p2, t.p0));ts.remove(t);}}let nedge = edge.getArray();for (let i=0; i<nedge.length; i++) {if (v.equals(nedge[i].v1) || v.equals(nedge[i].v2) || nedge[i].v1.equals(nedge[i].v2)) {continue ;}let t = new Triangular(v, nedge[i].v1, nedge[i].v2);ts.push(t);}}for (let i=ts.length-1; i>=0; i--) {let t = ts[i];if (t.p0.getClass() == "Point" || t.p1.getClass() == "Point" || t.p2.getClass() == "Point") {ts.remove(t);continue ;}this.children.push(t);}return ts;}
显示如下,未上色和和上色的:
泰森多边形:
Voronoi() {let vs = this.children.filter(e=>e.getClass() == "Vertex");let ts = this.children.filter(e=>e.getClass() == "Triangular");let gl = [];for (let v of vs) {let bounds = [];for (let t of ts)if (t.p0 == v || t.p1 == v || t.p2 == v)bounds.push(t);let sort = [];let e = bounds[0].exclude(v)[0];let t;while (bounds.length > 0) {let bFound = false;for (t of bounds) {if (t.hasEdge(v, e)) {e = t.exclude(v, e)[0];bFound = true;break;}}if (bFound) {bounds.remove(t);sort.push(t);}else {break ;}}if (bounds.length == 0)gl.push(sort);}for (let g of gl) {let cps = [];for (let s of g) {let c = Circle.Circumcircle(s);if (c.x <= 0 && c.y <= 0)return ;cps.push(c.p);}let p = new Path(cps);this.children.push(p);}}
显示如下,带背景和去掉背景的:
Voronoi泰森多边形的实现相关推荐
- matlab voronoi 多晶体程序,【干货】二维及三维voronoi泰森多边形生成及其批量cohesive的插入...
原标题:[干货]二维及三维voronoi泰森多边形生成及其批量cohesive的插入 目前voronoi晶粒模型已经被广泛应用,材料的穿晶断裂和沿晶断裂是失效的两种主要表现形式,建立晶粒模型是分析材料 ...
- 读取文本节点_总结语录|Part1:Dynamo节点介绍
记得点蓝色关注 想必开始接触Dynamo的小伙伴清楚 在2017版前Revit,没有Dynamo附带在插件里面,只能单独安装Dynamo,在2018Revit之后就会有Dynamo的插件,那么两者有什 ...
- ShadeGraph教程之节点详解6:Procedural Nodes
本文首发于洪流学堂微信公众号. 洪流学堂,学Unity快人几步 洪流学堂公众号回复节点,获取ShaderGraph节点详解PDF文件(带目录). Procedural Nodes 程序化节点 通过程序 ...
- Unity 之 ShaderGraph Procedural节点解析汇总
Unity 之 ShaderGraph Procedural节点解析汇总 一,Noise 噪音节点 1.1 Gradient Noise, Simple Noise, Voronoi 1.2 使用示例 ...
- ShaderGraph节点大全
最近事情比较杂乱学习的内容也比较零散,所以也没怎么拿出来和大家分享.之前一直是代码编写Shader,ShaderGraph出了很久了,一直被我无视了,最近学习了一下ShaderGraph感觉真的让我又 ...
- 解读Unity2018中 ShaderGraph 示例: Procedural
相关文章 <Unity着色器Procedural绘图简介(非Node/代码逻辑)> ShaderGraph 使您可以直观地构建着色器. 您可以在图形网络中创建和连接节点,而不是手写代码. ...
- 泰森多边形(Voronoi diagram)
泰森多边形(Voronoi diagram) 荷兰气候学家A•H•Thiessen提出了一种根据离散分布的气象站的降雨量来计算平均降雨量的方法,即将所有相邻气象站连成三角形,作这些三角形 ...
- 泰森多边形(Voronoi彩图)的matlab绘制——2
泰森多边形(Voronoi图)的matlab绘制--彩图版 1 Voronoi图简介 泰森多边形是对空间平面的一种剖分,其特点是多边形内的任何位置离该多边形的样点(如居民点)的距离最近,离相邻多边形内 ...
- 泰森多边形(Voronoi图)
二维Delaunay(德洛内)三角网剖分的matlab实现 https://blog.csdn.net/weixin_42943114/article/details/82262122 泰森多边形(V ...
最新文章
- Linux 运维常用命令 find、awk、sed、grep、vi、ps、lsof、rpm
- 聊聊前后端分离的接口规范
- [School Life - Study] 有哪些每天坚持效果显著的高中学习习惯?
- day29Struts 类型转换和自定义类型转换,input视图
- 通过bootstrap来学习less
- 年终总结 | 2021红包点赞?(文末有刺激的福利哦)
- 计算机道德 英语作文,公共道德英语作文
- 关于windows消息机制的猜想
- 使用优化的基于模糊规则的特征选择技术和基于树的集成方法进行山洪敏感性建模--文献阅读
- ASP.net的地址重写(URLRewriter)实现原理及代码示例
- “壕”无人性!黄金版iPhone 13 Pro售价27万元起
- Fiddler实现手机抓包
- 如何提升 CSS 性能的小知识
- 通信原理之数字调制原理
- PS小知识(四)——影像出图调色及去除薄雾薄云
- 摩托车结构与维修视频教程
- mathematics中如何计算排列组合
- 如何恢复计算机系统,电脑系统还原,手把手教你电脑系统怎么还原
- 00后表示真干不过,部门新来的00后网络安全工程师已把我卷崩溃,想离职了...
- SI4455程序调试问题总结
热门文章
- zabbix 监控 windows 服务器
- Android 8.1开启Bluetooth A2DP sink
- 别学东学西了,先建立自己的知识体系吧
- python中loc什么意思_python中loc函数的用法是什么?
- 对常见的三个免费数据库软件的一些个人看法
- MediaPlayer SeekTo 不准确的解决方案
- SQLAlchemy设置默认值
- Java初级键盘录入之三国游戏
- 使用fiddler修改IP访问
- SQL server显示instance name ‘MSSQLSERVER‘is already in use. To continue,specify a unique instance name