首页 > 解决方案 > 为 distmesh 制作 .oct 文件

问题描述

Distmesh 是 Perrson 在 matlab 中编写的一种流行的三角测量例程。在某些情况下,Persson 使用 .mex 文件来加快计算速度。我想把它扩展到八度。我已阅读https://enacit1.epfl.ch/octave_doc/octave/octave.html/Getting-Started-with-Oct_002dFiles.html和其他教程,并成功地使这些示例工作。这是来自 distmesh 的典型代码:

function d=dpoly(p,pv)

%   Copyright (C) 2004-2012 Per-Olof Persson. See COPYRIGHT.TXT for details.

np=size(p,1);
nvs=size(pv,1)-1;

ds=dsegment(p,pv);
%ds=zeros(np,nvs);
%for iv=1:nvs
%  ds(:,iv)=donesegment(p,pv(iv:iv+1,:));
%end
d=min(ds,[],2);

d=(-1).^(inpolygon(p(:,1),p(:,2),pv(:,1),pv(:,2))).*d;

% MEXED

%function ds=donesegment(p,pv)
%
%e=ones(size(p,1),1);
%
%v=diff(pv,1);
%w=p-e*pv(1,:);
%
%c1=sum(w.*v(e,:),2);
%c2=sum(v(e,:).^2,2);
%
%ds=0*e;
%
%ix=c1<=0;
%ds(ix)=sqrt(sum((p(ix,:)-pv(1*ones(sum(ix),1),:)).^2,2));
%
%ix=c1>=c2;
%ds(ix)=sqrt(sum((p(ix,:)-pv(2*ones(sum(ix),1),:)).^2,2));
%
%ix=c1>0 & c2>c1;
%nix=sum(ix);
%if nix>0
%  Pb=ones(nix,1)*pv(1,:)+c1(ix)./c2(ix)*v;
%  ds(ix)=sqrt(sum((p(ix,:)-Pb).^2,2));
%end

将函数 d=donesegment(p,v)(% MEXED 行下的所有内容)转换为 .oct 文件的任务。我既不是 ac 也不是 cpp 程序员,所以我不知道需要包含哪些标头,或者包含它们所需的语句。

标签: octavetriangulation

解决方案


John Burkhardt 的站点有一个distmesh 的副本,其中已经包含用 C++ 编写的例程的纯 matlab 版本。特别是dsegment.m在那里可用。我已经distmesh使用该文件以八度音阶运行;它有点慢,但对于中小型案例是可以接受的。


推荐阅读