使用scipy.spatial.Delaunay 实现三角网的构建

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 plt
import matplotlib.tri as tri
import numpy as np

plt.triplot(points[:,0], points[:,1], delaunay, linewidth=1.5)plt.show() 

				
时间: 2024-11-06 07:37:43

使用scipy.spatial.Delaunay 实现三角网的构建的相关文章

from scipy import spatial 出现 from .qhull import * ImportError: DLL load failed: The specified module could not be found. 错误

错误描述: 本人机器window8.1 64位,python2.7. Traceback (most recent call last): File "C:/Users/Hamid/Documents/kodeyaro/kodefolani.py", line 41, in <module> from scipy.spatial import Delaunay File "C:\Python27\lib\site-packages\scipy\spatial\__

基于CGAL的Delaunay三角网应用

目录 1. 背景 1.1 CGAL 1.2 cgal-bindings(Python包) 1.3 vtk-python 1.4 PyQt5 2. 功能设计 2.1 基本目标 2.2 待实现目标 3. 功能实现 参考: 1. 背景 本应用基于CGAL中的Delaunay进行三角网构建, 通过PyQt5和vtk进行界面展示 1.1 CGAL CGAL是Computational Geometry Algorithms Library(计算几何算法库)的缩写,用C++语言提供高效.可靠的算法库.被广泛

1.5 Scipy:高级科学计算

医药统计项目可联系 QQ:231469242 http://www.kancloud.cn/wizardforcel/scipy-lecture-notes/129867 作者:Adrien Chauve, Andre Espaze, Emmanuelle Gouillart, Ga?l Varoquaux, Ralf Gommers Scipy scipy包包含许多专注于科学计算中的常见问题的工具箱.它的子模块对应于不同的应用,比如插值.积分.优化.图像处理.统计和特殊功能等. scipy可以

『Python』Numpy学习指南第十章_高端科学计算库scipy入门(系列完结)

简介: scipy包包含致力于科学计算中常见问题的各个工具箱.它的不同子模块相应于不同的应用.像插值,积分,优化,图像处理,,特殊函数等等. scipy可以与其它标准科学计算程序库进行比较,比如GSL(GNU C或C++科学计算库),或者Matlab工具箱.scipy是Python中科学计算程序的核心包;它用于有效地计算numpy矩阵,来让numpy和scipy协同工作. 在实现一个程序之前,值得检查下所需的数据处理方式是否已经在scipy中存在了.作为非专业程序员,科学家总是喜欢重新发明造轮子

[Machine Learning] 国外程序员整理的机器学习资源大全

本文汇编了一些机器学习领域的框架.库以及软件(按编程语言排序). 1. C++ 1.1 计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库 OpenCV—它提供C++, C, Python, Java 以及 MATLAB接口,并支持Windows, Linux, Android and Mac OS操作系统. 1.2 机器学习 MLPack DLib ecogg shark 2. Closure Closure Toolbox—Clojure语言库与工具的分类目录 3

Heapsort 堆排序算法详解(Java实现)

Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析.同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择对这个算法进行分析主要是因为它用到了一个非常有意思的算法技巧:数据结构 - 堆.而且堆排其实是一个看起来复杂其实并不复杂的排序算法,个人认为heapsort在机器学习中也有重要作用.这里重新详解下关于Heapsort的方方面面,也是为了自己巩固一下这方面知识,有可能和其他的文章有不同的入手点,如有错

机器学习资源大全【转】

本文汇编了一些机器学习领域的框架.库以及软件(按编程语言排序). C++ 计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库 OpenCV—它提供C++, C, Python, Java 以及 MATLAB接口,并支持Windows, Linux, Android and Mac OS操作系统. 通用机器学习 MLPack DLib ecogg shark Closure 通用机器学习 Closure Toolbox—Clojure语言库与工具的分类目录 Go 自然语

sklearn:最近邻搜索sklearn.neighbors

http://blog.csdn.net/pipisorry/article/details/53156836 ball tree k-d tree也有问题[最近邻查找算法kd-tree].矩形并不是用到这里最好的方式.偏斜的数据集会造成我们想要保持树的平衡与保持区域的正方形特性的冲突.另外,矩形甚至是正方形并不是用在这里最完美的形状,由于它的角.如果图6中的圆再大一些,即黑点距离目标点点再远一些,圆就会与左上角的矩形相交,需要多检查一个区域的点,而且那个区域是当前区域双亲结点的兄弟结点的子结点

推荐!国外程序员整理的机器学习资源大全

推荐!国外程序员整理的机器学习资源大全 本文汇编了一些机器学习领域的框架.库以及软件(按编程语言排序). 伯乐在线已在 GitHub 上发起「机器学习资源大全中文版」的整理.欢迎扩散.欢迎加入. https://github.com/jobbole/awesome-machine-learning-cn C++ 计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库 OpenCV—它提供C++, C, Python, Java 以及 MATLAB接口,并支持Windows