我有兴趣阅读和理解2D网格算法.在Google上进行的搜索显示了大量的论文和来源,但大多数都是学术性的,在初学者方面并不多.
那么,这里有人会推荐任何阅读资源(适合初学者),或者我可以从一开始就学习的开源实现吗?谢谢.
此外,与三角网格生成相比,我对四边形网格和混合网格(四元组合和三元组合)更感兴趣.
我有一个常规的训练值网格(向量x和y,各自的网格xmesh和ymesh以及zmesh的已知值),但是要插值的散乱/不规则/不规则值组(向量xI和yI,我们对zI感兴趣) [0] = f(xI [0],yI [0])... zI [N-1] = f(xI [N-1],yI [N-1]).这种插值将被称为数百万时间作为优化问题的一部分,因此性能太重要,不能简单地使用制作网格并获取跟踪的方法.
到目前为止,我已经能够找到一个接近我想要的scipy.interpolate函数,即Bpf函数.然而,因为它传达了一个分散的输入,我认为它没有良好的性能,我想测试它对样条线性,线性和最近邻插值方法,我理解得更好,我希望会更快.实现这些的所有方法,我可以找到将常规网格作为训练数据(如RectBivariateSpline)似乎也需要常规网格来插值的值.
这段代码有希望弄清楚我在问什么.
import numpy as np
import scipy as sp
import scipy.interpolate as interp
x = np.arange(0,2*np.pi,.1)
y = x
xmesh,ymesh = np.meshgrid(x,y)
zmesh = np.sin(xmesh)+np.cos(ymesh)
rbf = interp.Rbf(xmesh, ymesh, zmesh, epsilon=2)
xI = np.arange(0,np.pi,.05)
yI = xI
XI, YI = np.meshgrid(xI,yI)
# Notice how this is happy to take a vector or grid as input
zI = rbf(xI, yI)
ZI = rbf(XI,YI) # equiv. to zImesh
myspline …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种接收3d表面网格的算法(即由三维三角形组成,这些三角形是某些流形的离散化)并在网格体积内生成四面体.
也就是说,我希望3d相当于这个2d问题:给定一个闭合曲线,对它的内部进行三角测量.
如果不清楚,我很抱歉,这是我能想到解释它的最佳方式.
对于第二种情况,有三角形.对于3d情况,我找不到.
我正在计划通过带两个嘴的凹形双对称六边形流动的可视化.
边d1的长度等于边d2的另一长度的示例:
我在这里首先讨论的关于不规则六边形的命名.
有标准的网格工具,你可以绘制自己的网格,但我想有一些标准库,以便我可以与其他人更好地合作,以后的流程模拟.我没有找到任何网库在MathCentral文件交换六边形这里.
是否有任何标准的网格库用于不规则的六边形形状?我也对任何其他语言开放,因为我可以阅读代码并将这些标准转换为Matlab库.
geometry mesh convex-optimization finite-element-analysis non-convex
给定三个X,Y和Z坐标的1D阵列,如何使用numpy转换为3D网格路径?
我设法使用numpy(即没有for循环)为2D做这个:
import numpy
def path_2d_numpy(x, y):
m1, m2 = numpy.meshgrid(x, y)
m1[1::2] = m1[1::2,::-1]
r = numpy.append(m1, m2)
r.shape = 2,-1
return r.T
from matplotlib import lines
from matplotlib import pyplot
def plot_path_2d(path):
x, y = path.T
pyplot.plot(x, y, '-ro', lw=3)
pyplot.show()
x = numpy.linspace(4, 1, 4)
y = numpy.linspace(1, 5, 5)
path = path_2d_numpy(x, y)
plot_path_2d(path)
Run Code Online (Sandbox Code Playgroud)
哪个输出:
...但是无法为3D做到这一点.显示纯python解决方案(即没有numpy):
import numpy
def path_3d(x, y, z):
nb_points =len(x)*len(y)*len(z)
path = numpy.empty((nb_points, 3))
xord, yord, i = True, True, 0
for …
Run Code Online (Sandbox Code Playgroud) 我正在为特定的流体问题编写CFD解算器。到目前为止,每次运行模拟时都会生成网格,并且当更改几何形状和流体属性时,需要重新编译程序。
对于单元数较少的小型问题,它工作得很好。但是对于细胞数超过一百万的情况,需要非常频繁地更改流体性质,效率很低。
显然,我们需要将模拟设置数据存储在配置文件中,并将几何信息存储在格式化的网格文件中。
% Dimension: 2D or 3D
N_Dimension= 2
% Number of fluid phases
N_Phases= 1
% Fluid density (kg/m3)
Density_Phase1= 1000.0
Density_Phase2= 1.0
% Kinematic viscosity (m^2/s)
Viscosity_Phase1= 1e-6
Viscosity_Phase2= 1.48e-05
...
Run Code Online (Sandbox Code Playgroud)
% Dimension: 2D or 3D
N_Dimension= 2
% Points (index: x, y, z)
N_Points= 100
x0 y0
x1 y1
...
x99 y99
% Faces (Lines in 2D: P1->p2)
N_Faces= 55
0 2
3 4
...
% Cells (polygons in 2D: Cell-Type and Points clock-wise). …
Run Code Online (Sandbox Code Playgroud) 我在Java中实现了一个基于A*pathfindinder的基本网格.我想制作一个基于导航网格/多边形的探路者,但我遇到的问题是:
如果我找到橙色路线,那么我可以使用类似漏斗算法的东西来拉直它以获得所需的路线(蓝色).但是,如果程序计算每条路线的成本,红色和橙色,那么它会说红色路线的价格更便宜.如何编程我的A*算法和/或创建我的网格,以便不会发生这种情况.
使用Meshlab将纹理图像映射到裸3D网格顶部的最简单方法是什么?在哪里尚未指定UV纹理坐标?
我正在创建一个带有THREE.Geometry实例的网格,然后动态填充几何体vertices
和faces
数组.迭代地细化几何体,在每次迭代时添加额外的顶点和面.如果在将网格物体添加到场景之前优化几何体,则会正确渲染.但是,如果我将网格物体添加到场景并渲染它,然后修改它,则只显示初始N面朝向第一个渲染所包含的几何体.对这些面使用的顶点位置的更改将受到尊重,但只会渲染那些N面.
几何实例被标记dynamic = true
了,我设置verticesNeedUpdate
,elementsNeedUpdate
并buffersNeedUpdate
修改几何后各一次.我也试过设置所有其他'脏'标志,虽然我只希望设置这三个(即便如此,我不确定我应该需要buffersNeedUpdate).
据我所知,几何体geometryGroup
和geometryGroupList
属性是从第一次渲染网格时存在的面构建和填充的,但是没有被重建以包含随后添加的面.
我究竟做错了什么?
我正在尝试使用trimesh
函数在Matlab中绘制一个大网格,顶点的z坐标控制颜色.不幸的是,当网格的大小超过120个三角形时,Matlab会停止正确插值颜色.这是一张展示问题的图片,左边是120个三角形,右边是121个三角形.
如您所见,对于大网格,Matlab直接从一个顶点的颜色插值到另一个顶点的颜色.这可能是出于性能原因而做的,但我正在尝试为我的论文生成漂亮的图片,而我并不关心计算它们需要多长时间.有没有办法禁用这种近似值?
这是生成图片的代码:
function test(n)
%%% Generate a mesh with n triangles.
oneTriVerts = [0 0 0;
1 0 0;
1 0 1];
offset = [0 (1/n) 0;
0 (1/n) 0;
0 (1/n) 0];
verts = zeros(0,3);
tris = zeros(0,3);
for i = 0:(n-1)
verts = [verts; (oneTriVerts + i * offset)];
tris = [tris; i*3+1, i*3+2, i*3+3];
end
%%% Draw the mesh, with color corresponding to the z coordinate.
trimesh(tris, verts(:,1), verts(:,2), verts(:,3), verts(:,3));
title(sprintf('n = %d', …
Run Code Online (Sandbox Code Playgroud)