【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 BigQuery 存储。并行读取多个流

    我有以下玩具代码 import pandas as pd from google cloud import bigquery storage v1beta1 import os import google auth os environ G
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • DreamPie 不适用于 Python 3.2

    我最喜欢的 Python shell 是DreamPie http dreampie sourceforge net 我想将它与 Python 3 2 一起使用 我使用了 添加解释器 DreamPie 应用程序并添加了 Python 3 2
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • IRichBolt 在storm-1.0.0 和 pyleus-0.3.0 上运行拓扑时出错

    我正在运行风暴拓扑 pyleus verbose local xyz topology jar using storm 1 0 0 pyleus 0 3 0 centos 6 6并得到错误 线程 main java lang NoClass
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • Pandas Dataframe 中 bool 值的条件前向填充

    问题 如何转发 fill boolTruepandas 数据框中的值 如果是当天的第一个条目 True 到一天结束时 请参阅以下示例和所需的输出 Data import pandas as pd import numpy as np df
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • Python 3 中“map”类型的对象没有 len()

    我在使用 Python 3 时遇到问题 我得到了 Python 2 7 代码 目前我正在尝试更新它 我收到错误 类型错误 map 类型的对象没有 len 在这部分 str len seed candidates 在我像这样初始化它之前 se
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 如何使用google colab在jupyter笔记本中显示GIF?

    我正在使用 google colab 想嵌入一个 gif 有谁知道如何做到这一点 我正在使用下面的代码 它并没有在笔记本中为 gif 制作动画 我希望笔记本是交互式的 这样人们就可以看到代码的动画效果 而无需运行它 我发现很多方法在 Goo
  • 您可以在 Python 类型注释中指定方差吗?

    你能发现下面代码中的错误吗 米皮不能 from typing import Dict Any def add items d Dict str Any gt None d foo 5 d Dict str str add items d f
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar
  • Spark.read 在 Databricks 中给出 KrbException

    我正在尝试从 databricks 笔记本连接到 SQL 数据库 以下是我的代码 jdbcDF spark read format com microsoft sqlserver jdbc spark option url jdbc sql
  • 改变字典的哈希函数

    按照此question https stackoverflow com questions 37100390 towards understanding dictionaries 我们知道两个不同的字典 dict 1 and dict 2例
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data

随机推荐

  • 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