PyVista 中的 3D 表面未正确生成。我试图避免关闭中心开口,但不知道该怎么做

2023-12-08

PyVista 填充开口出现不应填充的问题

import math
import numpy as np
import matplotlib as mpl
import pyvista as pv


mpl.use("Qt5Agg")
mpl.rcParams["toolbar"] = "None"  # Get rid of toolbar


def xy_waveguide_contour(throat, x_waveguide, ellipse_x):
    x_initial = (throat + (x_waveguide * (ellipse_x - throat))) / 2

    return x_initial


def xy_waveguide_contour_x2(throat, x_waveguide, ellipse_x):
    x_initial = (throat + (x_waveguide * (ellipse_x - throat)))

    return x_initial


def z_waveguide_contour(x_array, depth_factor, angle_factor, throat):
    angle_factor = angle_factor / 10000

    x_prime = x_array - (throat / 2)

    z = (x_prime / angle_factor) ** (1 / depth_factor)

    return z


def ellipse_contour(a, b):
    a = a / 2
    b = b / 2
    ellipse_steps = np.linspace(0, 0.5 * math.pi, 100)
    x_ellipse_array = np.array([])
    y_ellipse_array = np.array([])
    for h in range(100):
        x_ellipse_array = np.append(x_ellipse_array, a * np.cos(ellipse_steps[h]))
        y_ellipse_array = np.append(y_ellipse_array, b * np.sin(ellipse_steps[h]))
    return x_ellipse_array, y_ellipse_array


def circle_contour(throat):
    throat = (throat / 2)
    circle_steps = np.linspace(0, 0.5 * math.pi, 100)
    x_circle_array = np.array([])
    y_circle_array = np.array([])
    for j in range(100):
        x_circle_array = np.append(x_circle_array, throat * np.cos(circle_steps[j]))
        y_circle_array = np.append(y_circle_array, throat * np.sin(circle_steps[j]))
    return x_circle_array, y_circle_array


waveguide_throat = 30

ellipse_x = 250
ellipse_y = 150
depth_fact = 4
angle_fact = 40

# Total steps = 100
array_length = 100

xy_steps = np.linspace(0, 1, array_length)

# initialize x, y, z, and zero array
x_array = np.array([])
y_array = np.array([])
z_array = np.array([])
xsub_array = np.array([])
ysub_array = np.array([])
zero_array = np.zeros([array_length])

# calculate hor(x), ver(y), and height(z) contour data and add into array
for i in range(array_length):
    x_array = np.append(x_array, xy_waveguide_contour(waveguide_throat, xy_steps[i], ellipse_x))
    y_array = np.append(y_array, xy_waveguide_contour(waveguide_throat, xy_steps[i], ellipse_y))

    z_array = np.append(z_array, z_waveguide_contour(x_array[i], depth_fact, angle_fact, waveguide_throat))

# calculate data for ellipse
x_ellipse_data, y_ellipse_data = ellipse_contour(ellipse_x, ellipse_y)

# grab last point from z_array and make entire array same value to define height of ellipse/waveguide
ellipse_height = z_array[array_length - 1]

ellipse_z = np.full(shape=array_length, fill_value=ellipse_height)

# Calculate data for throat
circle_x, circle_y = circle_contour(waveguide_throat)


for j in range(0, array_length, 20):
    for i in range(array_length):

        xsub_array = np.append(xsub_array, xy_waveguide_contour_x2(circle_x[j], xy_steps[i], x_ellipse_data[j]))
        ysub_array = np.append(ysub_array, xy_waveguide_contour_x2(circle_y[j], xy_steps[i], y_ellipse_data[j]))

# X = np.concatenate((circle_x, x_ellipse_data, x_array, zero_array))
# Y = np.concatenate((circle_y, y_ellipse_data, zero_array, y_array))
# Z = np.concatenate((zero_array, ellipse_z, z_array, z_array))

# Reshape arrays into 1 column, multiple rows
x_array = x_array.reshape(-1, 1)
y_array = y_array.reshape(-1, 1)
z_array = z_array.reshape(-1, 1)
ellipse_z = ellipse_z.reshape(-1, 1)
x_ellipse_data = x_ellipse_data.reshape(-1, 1)
y_ellipse_data = y_ellipse_data.reshape(-1, 1)
circle_x = circle_x.reshape(-1, 1)
circle_y = circle_y.reshape(-1, 1)
zero_array = zero_array.reshape(-1, 1)
xsub_array = xsub_array.reshape(-1, 1)
ysub_array = ysub_array.reshape(-1, 1)

# save arrays to text

X = np.concatenate((circle_x, x_ellipse_data, x_array, zero_array, xsub_array), axis=0)
Y = np.concatenate((circle_y, y_ellipse_data, zero_array, y_array, ysub_array), axis=0)
Z = np.concatenate((zero_array, ellipse_z, z_array, z_array, z_array, z_array, z_array, z_array, z_array), axis=0)


xyz = np.concatenate((X, Y, Z), axis=1)

cloud = pv.PolyData(xyz)
surf = cloud.delaunay_2d()
surf.plot()

我正在尝试使用 pyvista 创建 3D 表面(也尝试过 Mayavi),每当我执行 delaunay_2D 网格来创建表面时,它都会关闭该表面应仍打开的“嘴”开口。我提供了一张显示需要修复哪些部分的图像,以及生成数据并重现当前问题的代码副本。我非常感谢任何人就这个问题提供的帮助。


正如我在您的问题的先前版本下的评论中指出的那样,我找不到一种简单的方法来解决您当前的方法。

  1. 你可以通过alpha=cloud.length/10 to delaunay_2d()这已经足够接近了,但这仍然会在波导的边缘留下杂散条纹。
  2. 如果能够使用挤压来创建波导,那就太好了,但我不知道这如何适用于这里。

所以我唯一能想到的就是改变你的整个方法:通过参数化你的表面,将你的波导创建为二维结构网格。这实际上是可能的,而且不太难:

  1. 在二维中,你有一个圆和一个椭圆,以及两者之间的线性插值。这意味着以以下形式获取积分(r*cos(phi), r*sin(phi))并插值到点(a*cos(phi), b*sin(phi))。这很简单。
  2. In the z方向你有一个根函数,它取决于二维网格的“径向”坐标。

执行此操作的方法如下:

import numpy as np
import pyvista as pv

# parameters for the waveguide
# diameter of the inner circle
waveguide_throat = 30
# axes of the outer ellipse
ellipse_x = 250
ellipse_y = 150
# shape parameters for the z profile
depth_factor = 4
angle_factor = 40
# number of grid points in radial and angular direction
array_length = 100

# now create the actual structured grid
# 2d circular grid
r, phi = np.mgrid[0:1:array_length*1j, 0:np.pi/2:array_length*1j]

# transform to ellipse on the outside, circle on the inside
x = (ellipse_x/2 * r + waveguide_throat/2 * (1 - r))*np.cos(phi)
y = (ellipse_y/2 * r + waveguide_throat/2 * (1 - r))*np.sin(phi)

# compute z profile
angle_factor = angle_factor / 10000
z = (ellipse_x / 2 * r / angle_factor) ** (1 / depth_factor)

waveguide = pv.StructuredGrid(x, y, z)
waveguide.plot(show_edges=True)

这将为您提供形成波导的密集二维网格。无论您需要对该表面执行什么操作,都可以使用结构化网格执行。

Here's the structured grid, with your point cloud laid over it to show they are the same: image with blue surface, red points of the original point cloud overlaid

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

PyVista 中的 3D 表面未正确生成。我试图避免关闭中心开口,但不知道该怎么做 的相关文章

  • python中的编码检测库[重复]

    这个问题在这里已经有答案了 这在某种程度上与我的问题有关here https stackoverflow com questions 2305997 unicodedecodeerror problem with mechanize 我处理
  • 在 python + openCV 中使用网络摄像头的问题

    我正在使用以下代码使用 openCV python 访问我的网络摄像头 import cv cv NamedWindow webcam feed cv CV WINDOW AUTOSIZE cam cv CaptureFromCAM 1 然
  • 关于使用Python启动SSH隧道的问题

    我在从用 Python 编写的 HTTP RPC 服务器启动 SSH 隧道时遇到了麻烦 基于Python的BaseHTTPServer 有一个用Python编写的简单的HTTP RPC服务器 作为其中一项服务的一部分 我想启动从 RPC 服
  • 如何测试顶级窗口是否打开?

    我感觉 Python 编程可能不是我的菜 我创建了一个 tkinter GUI 它使用按钮回调来打开另一个窗口 其他搜索说这个窗口应该是顶级窗口 并且它工作得很好 但是每次按下按钮时它都会打开另一个相同的窗口 如据我所知 窗口 问题 如何测
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 使用 GeoDjango 在坐标系之间进行转换

    我正在尝试将坐标信息添加到我的数据库中 添加django contrib gis支持我的应用程序 我正在写一个south数据迁移 从数据库中获取地址 并向 Google 询问坐标 到目前为止 我认为我最好的选择是使用geopy为了这 接下来
  • 在一张图中同时绘制两个截面强度

    我有一个形状数组 512 512 看起来像 行 x 列 y 密度 z 数组的数量 0 012825 0 020408 0 022976 0 015938 0 02165 0 024357 0 036332 0 031904 0 025462
  • 如何编写高效的配对算法?

    我需要一种算法的帮助 该算法可以有效地将人们分组 并确保以前的配对不会重复 例如 假设我们有 10 位候选人 candidates 0 1 2 3 4 5 6 7 8 9 并假设我们有一个先前匹配的字典 这样每个键值对即candidate
  • 01 无效令牌[重复]

    这个问题在这里已经有答案了 嘿 学习 python3有一段时间了 遇到字典和dictionary name get 方法并尝试获取随机键值 问题 data data get key 1 它有效并且返回 1 但如果我使用data get ke
  • Python - 为什么这段代码被视为生成器?

    我有一个名为 mb 的列表 其格式为 Company Name Rep Mth 1 Calls Mth 1 Inv Totals Mth 1 Inv Vol Mth 2 等等 在下面的代码中 我只是添加了一个包含 38 个 0 的新列表 这
  • 使用 Pandas 查找自滚动高点以来的周期数

    我在 Pandas 中使用rolling max函数 http pandas pydata org pandas docs stable computation html moving rolling statistics moments
  • python 语言环境奇怪的错误。这究竟是怎么回事?

    所以今天我升级到了 bazaar 2 0 2 我开始收到这条消息 顺便说一句 我在雪豹上 bzr warning unknown locale UTF 8 Could not determine what text encoding to
  • 获取 zeep.exceptions.ValidationError:缺少与 suds 一起使用的方法的元素

    我正在移植开发的代码suds 0 6到zeep 2 4 0 以前的泡沫代码 client Client WSDLfile proxy proxy faults True config client factory create perUse
  • 将 ASCII 字符转换为“”unicode 表示法的脚本

    我正在对 Linux 区域设置文件进行一些更改 usr share i18n locales like pt BR 并且需要格式化字符串 例如 d m Y H M 必须以 Unicode 指定 其中每个 在本例中为 ASCII 字符表示为
  • pandas apply:函数名是否带引号的区别

    简单数据框定义示例 df pd DataFrame A 2 4 1 B 8 4 1 C 6 2 7 df A B C 0 2 8 6 1 4 4 2 2 1 1 7 尝试理解以下块中函数参数调用的差异 df apply sum df app
  • Python:使用列表创建二叉搜索树

    我的代码的目标是从 txt 文件中获取每个单独的单词并将其放入列表中 然后使用该列表创建二叉搜索树来计算每个单词的频率 并按字母顺序打印每个单词及其频率 中的每个单词只能包含字母 数字 或 我无法用我的初学者编程知识来做的部分是使用我拥有的
  • Pandas - 分割大的Excel文件

    我有一个大约有 500 000 行的 Excel 文件 我想将其拆分为多个 Excel 文件 每个文件有 50 000 行 我想用熊猫来做 这样它会是最快和最简单的 有什么想法如何制作吗 感谢您的帮助 假设您的 Excel 文件只有一个 第
  • tweepy 流到 sqlite 数据库 - 语法错误[重复]

    这个问题在这里已经有答案了 可能的重复 tweepy 流到 sqlite 数据库 语法无效 https stackoverflow com questions 9434205 tweepy stream to sqlite database
  • 如何在 Python 中解析损坏的 XML?

    我无法影响的服务器发送的 XML 非常损坏 具体来说 Unicode WHITE STAR 将被编码为 UTF 8 E2 98 86 然后使用 Latin 1 转换为 HTML 实体表 我得到的是 acirc 98 86 9 个字节 位于声
  • 升级后 pip 损坏

    我做了 pip install U easyinstall 然后 pip install U pip 来升级我的 pip 但是 当我尝试使用 pip 时 我现在收到此错误 root d8fb98fc3a66 which pip usr lo

随机推荐

  • 显示所有文件的键盘快捷键

    有没有人在解决方案资源管理器中找到 显示所有文件 的键盘快捷键 还有一个相关的问题 是否有任何工具可以显示您在 VS 中执行的任何操作的键盘快捷键 Cheers SteveC 默认情况下没有 但 转到工具 选项 环境 键盘 在 显示包含的命
  • ICommand方法执行参数值

    我尝试理解 wpf 中的 ICommand 在我的 Event 类中 我实现了 ICommand 及其方法 一种方法是执行 public void Execute object parameter Do something 现在是我的问题
  • Office 365 REST API 可以发送包含纯文本和 HTML 正文的电子邮件吗?

    我正在查看 API 文档 看起来您只能指定一个Body in a Message 发送消息 https msdn microsoft com en us office office365 api mail rest operations S
  • 对象实例可以安全地清空指向自身的“this”指针吗?

    Class A public NullIt this NULL Foo NullIt A a new A a gt Foo assert a should assert here 除了内存泄漏之外 有没有办法达到这种效果 您到底想达到什么效
  • 使用接口引用访问 java Object 类方法

    让我们考虑以下示例 public interface SimpleInterface public void simpleMethod public class SimpleClass implements SimpleInterface
  • Envoy 的 Jwt 验证失败

    我有一个 Laravel Lumen 登录 API 它使用 HS256 生成 JWT 然后我将不记名令牌发送到 Envoy Gateway 并从 Envoy 获取 JWT验证失败 在官方 JWT 解码网站上 我可以成功解码并验证我的不记名令
  • jquery 手风琴防止冒泡/允许默认链接操作

    我有一个手风琴设置如下 shortheadline accordion active false header headline autoHeight false animated slowslide changestart functio
  • 如何使用set来改变shell变量?

    我正在使用 GNU bash 版本 4 3 11 1 release x86 64 pc linux gnu set grep SHELL SHELL bin bash SHELLOPTS braceexpand emacs hashall
  • 检查一个日期是否落在日期范围-Linq 查询之间

    我正在数据库中存储员工的休假信息 从和到日期将存储在数据库中 我想阻止员工在已申请的休假范围内申请休假 例如 假设一名员工已在 01 01 2015 至 05 01 2015 之间申请休假 i if user again try to ap
  • 验证 JSF 中的小数输入

    我想将输入验证为整数 因此 任何带有小数的值都应该被过滤 但我不知道如何实现这一目标 我已经尝试了很多方法 但是使用下面的代码 如果输入是 61 2 则该值将转换为61 只是截断小数部分 但我想强制验证错误 我确信我可以在没有自定义验证器的
  • 不兼容的数据透视类型 SQL

    我已经获得了一个数据库 我需要执行PIVOT在 我的枢轴工作得很好 但是 我需要在 SELECT 中执行的列之一是text类型 但是 PIVOT 命令不能使用此数据类型 我该如何解决这个问题 我个人的偏好是将列类型转换为VARCHAR MA
  • BeautifulSoup 的 Python 内存问题

    我已经解决了这个问题 但我想知道为什么会导致这个问题 我使用 BeautifulSoup 从网页中识别出这个跨度 span span Ally s Sizzlers span 然后我分配这个变量 restaurant name span c
  • 按每个子列表的第一个元素对列表列表进行排序[重复]

    这个问题在这里已经有答案了 如何根据每个列表的第一个元素对列表列表进行排序 例如 给出这个未排序的列表 1 4 7 3 6 9 2 59 8 排序后的结果应该是 1 4 7 2 59 8 3 6 9 使用排序函数并将匿名函数作为值传递给键参
  • XML 文件作为 django 项目的模型

    我有一个由其他程序管理的 XML 文件 我正在编写一个 Web 服务 以便用户能够查询该文件 本质上 我使用基于 xml 的数据库 而不是使用 sql 作为 Django 中的模型数据库 我该怎么做呢 我发现的所有教程都在后端使用 SQL
  • ASP.NET“特殊”标签

    像这样的 特殊 ASP NET 标记的官方名称是什么 我似乎无法弄清楚这些的概念或众所周知的名称 所以我在搜索更多信息时遇到了困难 作为奖励 任何人都可以给我一个所有可能的 特殊标签 的快速概要以及它们每个标签的作用 或向我指出一种资源 正
  • 如何将自定义 JAR 添加到“eclipse-pmd”插件?

    安装了Eclipse PMD 插件 由菲利普 格拉夫 from here 我尝试关联自定义 PMD 规则类 JAR 但找不到它的规定 该 JAR 包含自定义规则类 即extends AbstractJavaRule间接 那么有什么办法可以配
  • Windows VC++ 获取机器型号名称

    谁能告诉我如何获取 Windows 机器的型号名称 我是 Windows VC 的新手 例如 我有一台在 Windows 上运行的 IBM ThinkCenter M50 这里的型号名称是 Think Center M50 我想使用一些 A
  • Visual Studio 代码自动导入

    我正在从 Webstorm 迁移到 Visual Studio Code Webstorm 的性能很糟糕 Visual Studio 代码对于查找我需要的依赖项并导入它们并不是很有帮助 到目前为止 我一直在手动执行此操作 但说实话 我宁愿等
  • Flex 换行扫描野牛

    我想使用相同的 flex bison 扫描仪 解析器作为解释器并加载要解释的文件 在这两种情况下我都无法让换行符解析正常工作 解释器 有一个提示 我可以输入按 ENTER 终止的命令 文件 这是一个示例输入文件 切 begin print
  • PyVista 中的 3D 表面未正确生成。我试图避免关闭中心开口,但不知道该怎么做

    PyVista 填充开口出现不应填充的问题 import math import numpy as np import matplotlib as mpl import pyvista as pv mpl use Qt5Agg mpl rc