Python 中的曲面曲率 Matlab 等效项

2023-11-27

我试图计算由点数组 (x,y,z) 给出的曲面的曲率。最初我试图拟合多项式方程 z=a + bx + cx^2 + dy + exy + fy^2) 然后计算高斯曲率

$ K = \frac{F_{xx}\cdot F_{yy}-{F_{xy}}^2}{(1+{F_x}^2+{F_y}^2)^2} $

然而,如果表面很复杂,这个问题就很合适。我找到了这个 Matlab 代码来数值计算曲率。我想知道如何在 Python 中做同样的事情。

function [K,H,Pmax,Pmin] = surfature(X,Y,Z),
% SURFATURE -  COMPUTE GAUSSIAN AND MEAN CURVATURES OF A SURFACE
%   [K,H] = SURFATURE(X,Y,Z), WHERE X,Y,Z ARE 2D ARRAYS OF POINTS ON THE
%   SURFACE.  K AND H ARE THE GAUSSIAN AND MEAN CURVATURES, RESPECTIVELY.
%   SURFATURE RETURNS 2 ADDITIONAL ARGUEMENTS,
%   [K,H,Pmax,Pmin] = SURFATURE(...), WHERE Pmax AND Pmin ARE THE MINIMUM
%   AND MAXIMUM CURVATURES AT EACH POINT, RESPECTIVELY.


% First Derivatives
[Xu,Xv] = gradient(X);
[Yu,Yv] = gradient(Y);
[Zu,Zv] = gradient(Z);

% Second Derivatives
[Xuu,Xuv] = gradient(Xu);
[Yuu,Yuv] = gradient(Yu);
[Zuu,Zuv] = gradient(Zu);

[Xuv,Xvv] = gradient(Xv);
[Yuv,Yvv] = gradient(Yv);
[Zuv,Zvv] = gradient(Zv);

% Reshape 2D Arrays into Vectors
Xu = Xu(:);   Yu = Yu(:);   Zu = Zu(:); 
Xv = Xv(:);   Yv = Yv(:);   Zv = Zv(:); 
Xuu = Xuu(:); Yuu = Yuu(:); Zuu = Zuu(:); 
Xuv = Xuv(:); Yuv = Yuv(:); Zuv = Zuv(:); 
Xvv = Xvv(:); Yvv = Yvv(:); Zvv = Zvv(:); 

Xu          =   [Xu Yu Zu];
Xv          =   [Xv Yv Zv];
Xuu         =   [Xuu Yuu Zuu];
Xuv         =   [Xuv Yuv Zuv];
Xvv         =   [Xvv Yvv Zvv];

% First fundamental Coeffecients of the surface (E,F,G)
E           =   dot(Xu,Xu,2);
F           =   dot(Xu,Xv,2);
G           =   dot(Xv,Xv,2);

m           =   cross(Xu,Xv,2);
p           =   sqrt(dot(m,m,2));
n           =   m./[p p p]; 

% Second fundamental Coeffecients of the surface (L,M,N)
L           =   dot(Xuu,n,2);
M           =   dot(Xuv,n,2);
N           =   dot(Xvv,n,2);

[s,t] = size(Z);

% Gaussian Curvature
K = (L.*N - M.^2)./(E.*G - F.^2);
K = reshape(K,s,t);

% Mean Curvature
H = (E.*N + G.*L - 2.*F.*M)./(2*(E.*G - F.^2));
H = reshape(H,s,t);

% Principal Curvatures
Pmax = H + sqrt(H.^2 - K);
Pmin = H - sqrt(H.^2 - K);

我希望我来这里还不算太晚。我遇到了完全相同的问题(我工作的公司的产品)。

您必须考虑的第一件事是这些点必须代表矩形网格。 X 是二维数组,Y 是二维数组,Z 是二维数组。如果您有一个非结构化浊点,具有单个矩阵形状 Nx3(第一列是 X,第二列是 Y,第三列是 Z),那么您无法应用此 matlab 函数。

我开发了一个与此 Matlab 脚本等效的 Python 脚本,其中我只计算 Z 矩阵的平均曲率(我想您可以从该脚本中获得启发并对其进行调整以获得所有您想要的曲率),通过假设忽略 X 和 Y网格是正方形的。我认为您可以“掌握”我在做什么以及如何做,并根据您的需求进行调整:

注意:这假设您的数据点相距 1 个单位。

def mean_curvature(Z):
    Zy, Zx  = numpy.gradient(Z)
    Zxy, Zxx = numpy.gradient(Zx)
    Zyy, _ = numpy.gradient(Zy)

    H = (Zx**2 + 1)*Zyy - 2*Zx*Zy*Zxy + (Zy**2 + 1)*Zxx
    H = -H/(2*(Zx**2 + Zy**2 + 1)**(1.5))

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

Python 中的曲面曲率 Matlab 等效项 的相关文章

随机推荐

  • 关闭 stdout 和 stdin 文件描述符后重新打开它们

    我正在编写一个函数 给定一个参数 该函数会将标准输出重定向到文件或从文件读取标准输入 为此 我关闭与 stdout 或 stdin 关联的文件描述符 以便当我打开文件时 它会在我刚刚关闭的描述符下打开 这是可行的 但问题是一旦完成 我需要将
  • 计算船只到海岸或海岸线的距离

    对于船只的 200M GPS 经度 纬度 坐标数据集 我想计算到最近陆地或海岸线的近似距离 作为一个名为 distance to shore 的函数 它将返回该海岸的距离和国家 地区 我使用的国家边界和海岸线形状文件来自 http www
  • 在这种情况下SQLite线程安全吗?

    我需要通过一个拥有数据库连接的单例对象从多个线程进行数据库访问操作 我从 SQLite3 的网站上读到 它说 sqlite3 结构只能在调用 sqlite3 open 来创建它的同一线程中使用 您无法在一个线程中打开数据库 然后将句柄传递给
  • 为什么在使用 Model.copy() 后出现“GurobiError:变量不在模型中”?

    我需要优化具有不同约束集的模型 但这些约束的子集对于每个模型都是相同的 我的想法是构建一个包含每次都需要的所有变量和所有约束的基本模型 但是 它看起来并不像 Gurobi Model copy 方法按照我想象的方式复制变量 这是我希望做的事
  • 安装旧版本的 R 包

    我正在尝试使用 Rpy2 和 ggplot2 但出现错误 经过网上一些搜索错误 我发现发生错误是因为ggplot2包中存在尚未反映在Rpy2中的更改 例如 参见这个帖子 编辑 链接现已失效 所以我现在需要安装旧版本的 ggplot2 这是我
  • .NET Core 相当于 Thread.Abort

    背景 我有一个Service抽象 每个服务都有自己的WorkItem 工作项能够从一些数据开始 该服务正在限制执行时间WorkItem 假设单个工作项最多可能需要 60 秒 在此之后 Service应该杀掉它 这段代码从 NET Frame
  • Android TimePickerDialog材质设计颜色

    我在我的应用程序中使用时间选择器对话框 我还使用 appcompat 来为我的应用程序提供材料设计主题 然而 该对话框保留默认的青色强调色 我的强调色是浅蓝色 所以在我的代码中我尝试将对话框主题设置为我自己的并且它可以工作接受它使其全屏显示
  • 获取 java.util.List 的泛型类型

    I have List
  • 如何使用 Node.js“执行”HTML+Javascript 页面

    这样 我就有了 Node js 脚本 我有一些 HTML 页面 其中包含带有 JavaScript jquery 的 HTML 如何加载它并获取该页面上 JavaScript 的执行结果 你可以检查zombie js项目 http zomb
  • (React) CSSTransition 与 css 模块

    我正在尝试在我的项目中实现 CSSTransition 到模式 问题是我正在使用 css 模块 我的模态的渲染方法 render return
  • 检测 html 表单是否被编辑的通用方法

    我有一个选项卡式 html 表单 从一个选项卡导航到另一选项卡时 即使数据没有更改 当前选项卡的数据也会保留 在数据库上 我想仅在编辑表单时才进行持久性调用 该表单可以包含任何类型的控件 不一定要通过键入一些文本来弄脏表单 但在日历控件中选
  • 如果为空则创建新实例的简写?

    在 Javascript 中我可以这样做 var myVar returnNull new MyObject 在 C 中 我目前正在这样做 var myVar returnObjectOrNull if myVar null myVar n
  • 在 mongodb 中存储赞成票/反对票

    我有一个收藏Posts and Users用户可以对每个帖子投赞成票 反对票 将其存储在 mongodb 数据库中以确保用户不能多次为给定文档投票的最佳方法是什么 我想出的最简单的 nosql ish 解决方案是存储在每个内部投票的 use
  • 跨平台网络 API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道是否有一个 API 可以在 Windows Mac 和 Linux 上运行网络 我想做一个2人可以通过TCP连接玩的纸牌游戏 有几个选项可以
  • 使用ngrx一次获取store的当前状态

    您好 我想知道是否有人知道如何在无需订阅的情况下获取商店的当前状态 我目前正在使用 ngrx 订阅商店并访问其状态以设置组件的属性 但由于我订阅了该属性 所以它会不断刷新 因此 我正在寻找一种仅获取此属性一次的方法 以便我可以显示数据而无需
  • Android 滑动布局来关闭

    我正在尝试制作一个可滑动的布局 这样你就可以像现在在谷歌中一样滑动它来关闭 我设法使用以下代码让它在诸如按钮之类的视图上工作 SwipeDismissTouchListener public class SwipeDismissTouchL
  • 为什么 C# 似乎部分未转义命令行参数?

    我试图将多个路径作为参数传递给控制台应用程序 但收到 路径中的非法字符 错误 参数的最后两个字符似乎出现了错误 C test 对于转义的双引号 例如 如果我用 C 创建一个新的空控制台应用程序 如下所示 static void Main s
  • 命令光标的对象不可下标

    我是 Python 和 MongoDB 的新手 我正在使用 Flask python 和 MongoDB 开始一个新项目 当我尝试使用返回数据时aggregate 函数 它给我以下错误 命令光标的对象不可下标 这是我的查询代码 Data d
  • 使用 contenteditable div 而不是 textarea 的自动完成似乎不起作用

    我正在使用 Andrew Whitaker 的自动完成插件 这个问题也提到了 jquery 自动完成 mention 如果我使用 contenteditable div 而不是文本区域 这将不起作用 这是我的代码 div div MyTex
  • Python 中的曲面曲率 Matlab 等效项

    我试图计算由点数组 x y z 给出的曲面的曲率 最初我试图拟合多项式方程 z a bx cx 2 dy exy fy 2 然后计算高斯曲率 K frac F xx cdot F yy F xy 2 1 F x 2 F y 2 2 然而 如