博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用scipy.spatial.Delaunay 三角网的构建
阅读量:5360 次
发布时间:2019-06-15

本文共 3179 字,大约阅读时间需要 10 分钟。

1. 前言

  众所周知,Delaunay三角剖分算法在测绘工程中有着重要的应用。如果你是使用C#,Java之流的编程语言,不好意思你得自己去实现这个算法。好在python有着非常强大的开源库,python+numpy+scipy+matplotlib可谓科学计算”黄金搭档“,当然诸如pandas之流的高性能数据分析库,掌握他们你就不必重复造轮子了。

2. 进入正题

  这篇随笔主要介绍如何使用Python+scipy+numpy+matplotlib来演示Delaunay三角网的构建并最终以图形显示出来。

  •   首先先贴一下主要的数据结构代码:
class Vector2d():    def __init__(self, x, y, name=""):        self.name = name        self.x = x        self.y = y        self.rnx_path = None    # 重载运算符    def __eq__(self, other):        if isinstance(other, types.NoneType) or not isinstance(other, Vector2d):            raise ValueError('Expected type of: %s' % (type(Vector2d)))        else:            return (other.x == self.x) and (other.y == self.y)    def __add__(self, other):        if isinstance(other, types.NoneType) or not isinstance(other, Vector2d):            raise ValueError('Expected type of: %s' % (type(Vector2d)))        else:            return Vector2d(self.x + other.x, self.y + other.y)    def __sub__(self, other):        if isinstance(other, types.NoneType) or not isinstance(other, Vector2d):            raise ValueError('Expected type of: %s' % (type(Vector2d)))        else:            return Vector2d(self.x - other.x, self.y - other.y)    # 将乘法重载为叉积    def __mul__(self, other):        if isinstance(other, types.NoneType) or not isinstance(other, Vector2d):            raise ValueError('Expected type of: %s' % (type(Vector2d)))        else:            return other.x * self.y - self.x * other.y    @property    def length(self):        return math.sqrt(self.x ** 2 + self.y ** 2) def __str__(self):        return '(%s,%s,%s)' % (self.name, self.x, self.y)

  这个类的主要作用就是来表示二维向量,你也可以理解为二维点。在实现主要是重载了几个操作符。

class Triangle():    '''    形参point的类型均为 Vector2d    '''    def __init__(self, point1, point2, point3):        self.p1 = point1        self.p2 = point2        self.p3 = point3    def __str__(self):        return '%s->%s->%s' % (self.p1.name, self.p2.name, self.p3.name)    def is_in_triangle(self, point):        if isinstance(point, types.NoneType) or not isinstance(point, Vector2d):            raise ValueError('Expected type of: %s' % (type(Vector2d)))        else:            o2a = self.p1 - point            o2b = self.p2 - point            o2c = self.p3 - point            return ((o2a * o2b > 0 and o2b * o2c > 0 and o2c * o2a > 0) or (o2a * o2b < 0 and o2b * o2c < 0 and o2c * o2a < 0))

  这个类主要是用来表示三角单元的,不用多说。

  •   下面就是关键的生成三角网部分的代码,首先你必须先导入Delaunay
from scipy.spatial import Delaunay
def triangulate(vertex):    '''    Get delauney triangles from points    :param vertex: list of Vector2d    :return: Delauney triangles    '''    triangles = []    delauney = Delaunay([[pt.x, pt.y] for pt in vertex]).simplices.copy()    for tri in delauney:        triangles.append(Triangle(vertex[tri[0]], vertex[tri[1]], vertex[tri[2]]))    return triangles,delauney

  triangulate方法的形参为Vector2d类的列表类型。 方法返回了所有的三角单元和delaunay对象。delaunay在使用matplotlib绘图的时候需要用到。

  •   绘图
points = np.array([[pt.x, pt.y] for pt in vertex])
import matplotlib.pyplot as pltimport matplotlib.tri as triimport numpy as npplt.triplot(points[:,0], points[:,1], delaunay, linewidth=1.5) plt.show() 
 

转载于:https://www.cnblogs.com/AllStarGIS/p/5143562.html

你可能感兴趣的文章
a标签添加点击事件
查看>>
Context.startActivity出现AndroidRuntimeException
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I &amp; II 读书笔记
查看>>
thinkphp3.2接入支付宝支付接口(PC端)
查看>>
response和request
查看>>
【转】在Eclipse中安装和使用TFS插件
查看>>
回到顶部浮窗设计
查看>>
C#中Monitor和Lock以及区别
查看>>
【NOIP2017】奶酪
查看>>
$ 一步一步学Matlab(3)——Matlab中的数据类型
查看>>
5.6.3.7 localeCompare() 方法
查看>>
Linux下好用的简单实用命令
查看>>
描绘应用程序级的信息
查看>>