【Python】平面多边形Wachspress坐标、中值坐标的计算及其等高线

2023-10-26

平面多边形Wachspress坐标、中值坐标的计算及其等高线

  • 代码仅供参考,复杂度极高,暂时无优化…

1. Wachspress坐标等高线绘制

1.1 程序
# 计算有向面积
def dir_acr(point1,point2,point3):
    result1 = np.linalg.det([[1, 1, 1], point1[0],point1[1]])
    result2 = np.linalg.det([[1, 1, 1], point2[0],point2[1]])
    result3 = np.linalg.det([[1, 1, 1], point3[0],point3[1]])
    return result1,result2,result3


# 射线法判断点是否在给定区域内
def is_in_poly(p, poly):
    """
    :param p: [x, y]
    :param poly: [[], [], [], [], ...]
    :return:
    """
    px, py = p
    is_in = False
    for i, corner in enumerate(poly):
        next_i = i + 1 if i + 1 < len(poly) else 0
        x1, y1 = corner
        x2, y2 = poly[next_i]
        if (x1 == px and y1 == py) or (x2 == px and y2 == py):  # if point is on vertex
            is_in = True
            break
        if min(y1, y2) < py <= max(y1, y2):  # find horizontal edges of polygon
            x = x1 + (py - y1) * (x2 - x1) / (y2 - y1)
            if x == px:  # if point is on edge
                is_in = True
                break
            elif x > px:  # if point is on left-side of line
                is_in = not is_in
    return is_in
points = [[1.0,3.0,4.0,0.0], [0.0,0.0,3.0,2.0]]
n = len(points[0])
x_min = min(points[0])
x_max = max(points[0])
y_min = min(points[1])
y_max = max(points[1])
x = np.arange(x_min,x_max,0.01)
y = np.arange(y_min,y_max,0.01)
# X,Y = np.meshgrid(x,y)
Z=[]
# 记v为内点
for k in y:
    for j in x:
        v = [j,k]
        w = []
        if not is_in_poly(v, np.array(points).T.tolist()):  # 判断点是否为内点
            Z.append(np.nan)
            continue
        for i in range(n):
            if i==0:
                p_x = [points[0][-1]]+points[0][0:2]
                p_y = [points[1][-1]]+points[1][0:2]
            elif i==3:
                p_x = points[0][i-1:i+1]+[points[0][0]]
                p_y = points[1][i-1:i+1]+[points[1][0]]
            else:
                p_x = points[0][i-1:i+2]
                p_y = points[1][i-1:i+2]
            
            p = [p_x]+[p_y]
            px_v1 = p_x[0:2]+[v[0]]
            py_v1 = p_y[0:2]+[v[1]]
            p_v1 = [px_v1]+[py_v1]
            
            px_v2 = p_x[1:3]+[v[0]]
            py_v2 = p_y[1:3]+[v[1]]
            p_v2 = [px_v2]+[py_v2]
            
            a1,a2,a3 = dir_acr(p,p_v1,p_v2)
            wi = a1/(a2*a3)
            w.append(wi)
            if i==3:
                w2 = wi
        lambda2 = w2/sum(w)
        Z.append(lambda2)
X,Y = np.meshgrid(x,y)
# Z = 
#设置打开画布大小,长10,宽6
plt.figure(figsize=(10,6))
#填充颜色,f即filled
plt.plot(points[0]+[1],points[1]+[0])
# plt.contourf(X,Y,Z)
#画等高线
z = np.mat(Z)              
z = np.array(z)
z.shape = (300,400)
contour = plt.contour(X,Y,z,[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])
# plt.clabel(contour,fontsize=10,colors=('k'))
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.中值坐标等高线绘制

2.1 步骤及原理
  • 知识储备:numpy的三角函数,np.cos(),np.sin(),np.tan(),反三角函数,np.arccos(),np.arcsin(),np.arctan()
  • λ i = ω i ∑ j = 1 k ω j , ω j = tan ⁡ α i − 1 2 + tan ⁡ α i 2 ∣ ∣ v i − v ∣ ∣ \lambda_i = \frac{\omega_i}{\sum_{j=1}^k\omega_j},\omega_j=\frac{\tan{\frac{\alpha_{i-1}}{2}}+\tan{\frac{\alpha_{i}}{2}}}{||v_i-v||} λi=j=1kωjωi,ωj=vivtan2αi1+tan2αi
2.2 程序
def distance(point1,point2): # 计算点与点之间的距离
    # 如果传入的是列表,则需要转化为np.array()数组,因为列表无法进行加减法
    d_xy = np.array(point1)-np.array(point2)
    d_xy = np.sum(np.power(d_xy,2))
    d = np.sqrt(d_xy)
    return d

def alpha(a,b,c): # 角度alpha的计算
    cos_alpha = (np.power(b,2)+np.power(c,2)-np.power(a,2))/(2*b*c)
    alpha = np.arccos(cos_alpha)
    return alpha

# 给定一个多边形顶点points,记长度为n,随机选一个内点v
# 首先计算内点v到p_{i-1},pi,p_{i+1}的长度,然后再计算 p_{i-1}pi,pip_{i+1}的长度a1,a2,另外三条线记为l1,l2,l3
# 根据求得的长度计算角度,然后求正切值

points = [[1.0,3.0,4.0,0.0], [0.0,0.0,3.0,2.0]]
n = len(points[0])
x_min = min(points[0])
x_max = max(points[0])
y_min = min(points[1])
y_max = max(points[1])
x = np.arange(x_min,x_max,0.01)
y = np.arange(y_min,y_max,0.01)
# X,Y = np.meshgrid(x,y)
Z_2=[]
for k in y:
    for j in x:
        v = [j,k]  # v为内点
        w = []
        if not is_in_poly(v, np.array(points).T.tolist()):  # 判断点是否为内点
            Z_2.append(np.nan)
            continue
        for i in range(n):
            if i==0:
                p_x = [points[0][-1]]+points[0][0:2]
                p_y = [points[1][-1]]+points[1][0:2]
            elif i==3:
                p_x = points[0][i-1:i+1]+[points[0][0]]
                p_y = points[1][i-1:i+1]+[points[1][0]]
            else:
                p_x = points[0][i-1:i+2]
                p_y = points[1][i-1:i+2]
            p = [p_x]+[p_y]
        #     print(p)
            l1_point = [p_x[0],p_y[0]]
            l2_point = [p_x[1],p_y[1]]
            l3_point = [p_x[2],p_y[2]]
            l1 = distance(l1_point,v)
            l2 = distance(l2_point,v)
            l3 = distance(l3_point,v)
            a1 = distance(l1_point,l2_point)
            a2= distance(l3_point,l2_point)
            alpha1 = alpha(a1,l1,l2)
            alpha2 = alpha(a2,l2,l3)
            wi = (np.tan(alpha1/2)+np.tan(alpha2/2))/l2
            w.append(wi)
            if i == 3:  # 修改需要进行计算的坐标顶点
                w2 = wi
        lambda_ = w2/sum(w)
        Z_2.append(lambda_)

# 第1个坐标顶点的等高线
X,Y = np.meshgrid(x,y)
#设置打开画布大小,长10,宽6
plt.figure(figsize=(10,6))
#填充颜色,f即filled
plt.plot(points[0]+[1],points[1]+[0])
# plt.contourf(X,Y,Z)
#画等高线
z2 = np.mat(Z_2)              
z2 = np.array(z2)
z2.shape = (300,400)
contour = plt.contour(X,Y,z2,[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])
# plt.clabel(contour,fontsize=10,colors=('k'))
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】平面多边形Wachspress坐标、中值坐标的计算及其等高线 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • Django 的内联管理:一个“预填充”字段

    我正在开发我的第一个 Django 项目 我希望用户能够在管理中创建自定义表单 并向其中添加字段当他或她需要它们时 为此 我在我的项目中添加了一个可重用的应用程序 可在 github 上找到 https github com stephen
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 需要在python中找到print或printf的源代码[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在做一些我不能完全谈论的事情 我
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 如何使用 pybrain 黑盒优化训练神经网络来处理监督数据集?

    我玩了一下 pybrain 了解如何生成具有自定义架构的神经网络 并使用反向传播算法将它们训练为监督数据集 然而 我对优化算法以及任务 学习代理和环境的概念感到困惑 例如 我将如何实现一个神经网络 例如 1 以使用 pybrain 遗传算法
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • 为什么 Pickle 协议 4 中的 Pickle 文件是协议 3 中的两倍,而速度却没有任何提升?

    我正在测试 Python 3 4 我注意到 pickle 模块有一个新协议 因此 我对 2 个协议进行了基准测试 def test1 pickle3 open pickle3 wb for i in range 1000000 pickle
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • TortoiseSVN客户端用法

    从图中可以看到 涉及SVN的选项有3个 1 SVN Update 从服务器更新到本地 2 SVN Commit 从本地提交到服务器 3 TortoiseSVN 查看详细的SVN选项 一 更新 更新使用SVN Update选项 点击SVN U
  • 【微信小程序】小程序项目之上传视频实践

    人狠话不多 看代码 wxml
  • 利用iframe跨域请求

    跨域是系统与系统之间信息交流的一种方式 为了获取另外一个地方的信息 经常会出现跨域 总结一下利用iframe跨域进行请求 网上关于跨域的信息很多 只做一下备忘
  • JavaDay08

    定义一个方法 根据成绩 返回对应的等级 package com bjpowernode demo01 exercise import java util Scanner 定义一个方法 根据成绩 返回对应的等级 public class De
  • Kruskal算法

    Kruskal算法 Kruskal算法是一种用来查找最小生成树的算法 由Joseph Kruskal在1956年发表 用来解决同样问题的还有Prim算法和Boruvka算法等 三种算法都是贪心算法的应用 和Boruvka算法不同的地方是 K
  • 网管实战(6):忘记交换机密码的处理(HUAWEI S5735)

    今天拿到一台华为S5735的交换机 有密码进不去 网上找资料进入了 记录下来以备后查 利用交换机的BootROM提供了清除Console口密码的功能 在用户使用Console口登录的时候跳过密码检查 进入交换机后修改Console口密码 然
  • String类常见构造方法大全(Java)

    目录 字符串 String 1 字符串的拼接与反转 2 金额转换 字符串 StringBuilder 字符串 StringJoiner 综合练习 字符串 String 构造方法摘要 字符串的内容是不会发生改变的 他的对象在创建后不能被更改
  • sql server 备份还原(相关文章很凌乱)

    1 首先安装Microsoft SQL Server Management Studio 下载 SQL Server Management Studio SSMS SQL Server Management Studio SSMS Micr
  • 反编译--jadx的下载使用与配置

    下载与安装 git clone https github com skylot jadx git cd jadx gradlew dist 找到 jadx gui bat文件双击安装即可
  • 基于综合指标的冬小麦长势无人机遥感监测

    用于描述作物长势的指标 苗情 作物密度 叶面积指数 LAI 生物量 干物质量 光合色素含量 目前有关小麦长势监测的研究 多数是以LAI 叶片叶绿素含量 氮素含量 水分含量 生物量单个指标反映小麦长势 本文尝试将LAI 叶片叶绿素含量 氮素含
  • nvm安装与使用

    一 介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工具 方便切换不同版本的Node js 二 使用 nvm 的使用非常的简单 跟 npm 的使用方法类似 2 1 下载安装 首先先下载 n
  • 6.7行为型---中介者模式

    在现实生活中 常常会出现好多对象之间存在复杂的交互关系 这种交互关系常常是 网状结构 它要求每个对象都必须知道它需要交互的对象 例如 每个人必须记住他 她 所有朋友的电话 而且 朋友中如果有人的电话修改了 他 她 必须告诉其他所有的朋友修改
  • float和double的范围和精度

    float与double的范围和精度 1 范围 float和double的范围是由指数的位数来决定的 float的指数位有8位 而double的指数位有11位 分布如下 float 1bit 符号位 8bits 指数位 23bits 尾数位
  • MySQL --- 常用函数 - 字符串函数

    函数 MySQL 函数会对传递进来的参数进行处理 并返回一个处理结果 也就是返回一个值 MySQL 包含了大量并且丰富的函数 咱们讲解几十个常用的 剩下的比较罕见的函数我们可以到 MySQL 参考手册 查询 字符串函数 函数 作用 UPPE
  • STM32 Keil:warning: #223-D: function "LED_Init" declared implicitly

    include stm32f10x h include led h int main LED Init while 1 GPIO SetBits GPIOD GPIO Pin 6 运行时警告 warning 223 D function L
  • 【Android】dumpsys activity package $packagename

    具体作用后续跟进检讨补全
  • 线性代数的本质(一)

    文章目录 向量空间 向量及其性质 基与维数 向量的坐标运算 线性代数的本质 3blue1brown 高中数学A版选修4 2 矩阵与变换 线性代数及其应用 第五版 高等代数简明教程 蓝以中 向量空间 In the beginning Gran
  • 机器学习第五课--广告点击率预测项目以及特征选择的介绍

    这个项目的主要的目的是通过给定的广告信息和用户信息来预测一个广告被点击与否 如果广告有很大概率被点击就展示广告 如果概率低 就不展示 因为如果广告没有被点击 对双方 广告主 平台 来讲都没有好处 所以预测这个概率非常重要 也是此项目的目标
  • Description Resource Path Location Type Java compiler level does not match the version of the instal

    解决办法 在项目上右键Properties Project Facets 在打开的Project Facets页面中的Java下拉列表中 选择相应版本 有可能是java1 6 改成java6之类的
  • 【Python】平面多边形Wachspress坐标、中值坐标的计算及其等高线

    平面多边形Wachspress坐标 中值坐标的计算及其等高线 代码仅供参考 复杂度极高 暂时无优化 1 Wachspress坐标等高线绘制 1 1 程序 计算有向面积 def dir acr point1 point2 point3 res