我正在尝试创建一个简单的界面来绘制二次拉格朗日多项式.为此,您只需要3个点(每个点都有自己的x,y,z坐标),然后使用二次拉格朗日多项式进行插值.
制作静态版本很容易,甚至可以在绘制曲线之前让用户输入3个点.但是,用户也应该可以将绘图窗口中的现有点拖动到另一个位置,然后使用此点的新位置自动重新绘制曲线!

简而言之,用户应该能够将这些黑点拖到另一个位置.之后(或拖动时),应更新曲线.
function Interact()
% Interactive stuff here
figure();
hold on;
axis([0 7 0 5])
DrawLagrange([1,1; 3,4; 6,2])
function DrawLagrange(P)
plot(P(:,1), P(:,2), 'ko--', 'MarkerSize', 10, 'MarkerFaceColor', 'k')
t = 0:.1:2;
Lagrange = [.5*t.^2 - 1.5*t + 1; -t.^2 + 2*t; .5*t.^2 - .5*t];
CurveX = P(1,1)*Lagrange(1,:) + P(2,1)*Lagrange(2,:) + P(3,1)*Lagrange(3,:);
CurveY = P(1,2)*Lagrange(1,:) + P(2,2)*Lagrange(2,:) + P(3,2)*Lagrange(3,:);
plot(CurveX, CurveY);
Run Code Online (Sandbox Code Playgroud)
我想我要么使用WindowButtonDownFcn,WindowButtonUpFcn和WindowButtonMotionFcn等函数,要么使用Image Processing Toolbox中的ImPoint.但是怎么样?
[编辑]它也应该在3D中工作,因为我想概括这个概念来张紧产品表面.
我正在寻找一种从Matlab内部启动应用程序的方法.问题是,我的Matlab脚本将一些结果保存到文件中,然后应该在关联的应用程序中打开(在本例中为Blender).
我熟悉像这样的命令
system('program_name')
Run Code Online (Sandbox Code Playgroud)
要么
!program_name
Run Code Online (Sandbox Code Playgroud)
和其他一些方法,但问题是,应用程序是从Matlab PATH开始的,所以它在Matlab目录中查找它需要的各种库.例如:
>> !blender
blender: /usr/local/MATLAB/R2011a/sys/os/glnx86/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by blender)
Run Code Online (Sandbox Code Playgroud)
有没有办法启动一个使用全局(系统)PATH的应用程序?
刚才我发现我发现了一个调整,即在Matlab中启动一个终端,带有一些参数(Blender filename.blend).
system('terminal -x blender /home/pieter/Red.blend')
Run Code Online (Sandbox Code Playgroud)
这确实工作了几次,但是现在我执行这个命令20次左右后出现错误......
>> system('terminal -x blender /home/pieter/Red.blend')
(terminal:10982): GLib-CRITICAL **: PCRE library is compiled without UTF8 support
(terminal:10982): Terminal-CRITICAL **: Failed to parse regular expression pattern 0: PCRE library is compiled without UTF8 support
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我正在使用Arch Linx.
编辑:
好吧,我只是想到了一个相当肮脏的解决方案.Matlab使用环境变量
LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
对于必要库的路径:
getenv('LD_LIBRARY_PATH')
/usr/local/MATLAB/R2011a/sys/os/glnx86:/usr/local/MATLAB/R2011a/bin/glnx86:/usr/local/MATLAB/R2011a/extern/lib/glnx86:/usr/local/MATLAB/R2011a/runtime/glnx86:/usr/local/MATLAB/R2011a/sys/java/jre/glnx86/jre/lib/i386/native_threads:/usr/local/MATLAB/R2011a/sys/java/jre/glnx86/jre/lib/i386/client:/usr/local/MATLAB/R2011a/sys/java/jre/glnx86/jre/lib/i386
Run Code Online (Sandbox Code Playgroud)
所以我可以将这些信息保存到变量(例如MatlabPath):
MatlabPath = getenv('LD_LIBRARY_PATH')
Run Code Online (Sandbox Code Playgroud)
然后在我打电话给blender之前这样做:
setenv('LD_LIBRARY_PATH',getenv('PATH'))
Run Code Online (Sandbox Code Playgroud)
这使得Matlab使用我的系统库.然后在程序启动后,将旧值重新分配给LD_LIBRARY_PATH:
setenv('LD_LIBRARY_PATH',MatlabPath)
Run Code Online (Sandbox Code Playgroud)
所以...这是一个解决方案,但如果有人知道解决问题的更简洁方法,请告诉我.
注意:描述变得比预期的要长一些.您是否知道使用此网格的此算法的可读实现?请告诉我!
我正在尝试使用Matlab 实现Catmull-Clark细分,因为稍后必须将结果与已经在Matlab中实现的其他一些东西进行比较.首先尝试使用Vertex-Face网格,算法可以工作,但效率不高,因为边缘和面需要相邻信息.因此,我现在使用的是半边网格.另见 Lutz Kettner 设计多面体表面的数据结构(该页面上的PDF链接).
我的问题在于找到Twin HalfEdges,我只是不确定如何做到这一点.下面我将描述我对实现的看法,试图保持简洁.
半边网格(使用Vertices/HalfEdges/Faces的索引):
Vertex (x,y,z,Outgoing_HalfEdge)
HalfEdge (HeadVertex (or TailVertex, which one should I use), Next, Face, Twin).
Face (HalfEdge)
Run Code Online (Sandbox Code Playgroud)
为了保持现在的简单,假设每个面都是四边形.实际网格是Vertices,HalfEdges和Faces的列表.新网格将由NewVertices,NewHalfEdges和NewFaces组成,如下所示(注意:Number _...是......的数量):
NumberNewVertices: Number_Faces + Number_HalfEdges/2 + Number_Vertices
NumberNewHalfEdges: 4 * 4 * NumberFaces
NumberNewfaces: 4 * NumberFaces
Run Code Online (Sandbox Code Playgroud)
卡特莫尔 - 克拉克:
Find the FacePoint (centroid) of each Face:
--> Just average the x,y,z values of the vertices, save as a NewVertex.
Find …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种算法(或实现)来从封闭(即没有孔)3D 三角形网格创建四面体网格。
\n\n最好的解决方案是一个开源应用程序,它可以导入网格文件(例如 OBJ、STL 和 VTK)、显示它们并提供四面体化网格的选项。但我也很喜欢命令行工具,或者只是算法的概述。
\n\n一些背景 \xe2\x80\x94 我正在 Linux 系统上使用 Blender 来设计表面网格。最终我计划在 Python 或 MATLAB 中实现四面体化算法。
\n\n我在寻找好的网格划分器时已经偶然发现了一些应用程序名称,但到目前为止我还没有任何具体的结果。因此,非常欢迎任何有关相关论文、算法或实现的信息!
\n\n到目前为止发现的应用程序:
\n\n一些相关术语:
\n\n我正在尝试使用Julia进行一些统计分析.代码由文件组成script.jl(例如数据的初始化)和algorithm.jl.
模拟的数量很大(至少100,000),因此使用并行处理是有意义的.
下面的代码只是一些伪代码来说明我的问题 -
function script(simulations::Int64)
# initialise input data
...
# initialise other variables for statistical analysis using zeros()
...
require("algorithm.jl")
@parallel for z = 1:simulations
while true
choices = algorithm(data);
if length(choices) == 0
break
else
# process choices and pick one (which alters the data)
...
end
end
end
# display results of statistical analysis
...
end
Run Code Online (Sandbox Code Playgroud)
和
function algorithm(data)
# actual algorithm
...
return choices;
end
Run Code Online (Sandbox Code Playgroud)
例如,我想知道平均有多少选择,最常见的选择是什么,等等.为此,我需要将choices(在 for循环中)的一些数据保存到统计分析变量(在 …