24小时热门版块排行榜    

查看: 3560  |  回复: 9
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

nagami

木虫 (正式写手)

[交流] 2D凸包Delaunay三角剖分程序 已有3人参与

之前用Python写的网格程序,速度实在太慢。没有办法,花了几天时间用C++重写了一次,虽然还有很多瑕疵,不过用用已经可以了,一段实现如下剖分的代码和效果:
资料地址:http://persson.berkeley.edu/distmesh/
程序代码:
#include "nr.h"                          //简易向量矩阵类
#include "distmesh_2d.h"         //参考persson的论文写的基于力平衡的网格程序
#include "delaunay.h"              //随机增量算法Delaunay三角剖分(效果一般)
#include "dfunction.h"            //一般区域的符号距离函数

struct Ftor{
        vector<Point<2>> poly;
        Ftor(vector<Point<2>> &polyy):poly(polyy){}
        Doub fd(const Point<2> &p){
                Doub d1=dcircle(p,0.0,0.0,0.5);                      //圆的符号距离函数
                Doub d2=dpoly(p,poly);                                //多边形的符号距离函数
                return ddiff(d2,d1);                                       //区域做差(挖空圆)
        }
        Doub fh(const Point<2> &p){
                return 0.05+0.3*dcircle(p,0.0,0.0,0.5);           //密度函数,内圆处加密
        }
};
int main(){
        ofstream fp("p.txt";                                              //输出点分布
        ofstream ft("t.txt";                                               //输出三角形节点编号
        Doub pi=3.1415926;                                             
        Box<2> box;                                                       //包围区域初始化剖分点
        box.lo.x[0]=-1.0;box.lo.x[1]=-1.0;
        box.hi.x[0]=1.0;box.hi.x[1]=1.0;

        vector<Point<2>> pfix(6);                               //生成多边形+固定剖分点
        for(int i=0;i<6;i++){                                          //正六变形生成
                Doub theta=pi/3.0;
                pfix.x[0]=cos(theta*i);
                pfix.x[1]=sin(theta*i);
        }
       
        Ftor Fun(pfix);;                                              //距离函数和密度函数初始化
        Distmesh2d<Ftor> mesh(Fun,0.1,box,pfix);  //调用网格程序

      //以下输出,Matlab数组是1偏的,三角形编号+1处理
        fp<<fixed<<setprecision(4);     
        ft<<fixed<<setprecision(6);
        int n=mesh.p.size();
        for(int i=0;i<n;i++){
                fp<<setw(4)<<mesh.p.x[0]<<setw(10)<<mesh.p.x[1]<<endl;
        }
        int k=mesh.tri.size();
        for(int i=0;i<k;i++){
                ft<<setw(10)<<mesh.tri.p[0]+1
                  <<setw(10)<<mesh.tri.p[1]+1
                  <<setw(10)<<mesh.tri.p[2]+1<<endl;
        }
        fp.close();
        ft.close();
        cin.get();
        return 0;
}
2D凸包Delaunay三角剖分程序
密度控制.jpg
2D凸包Delaunay三角剖分程序-1
1.jpg


2D凸包Delaunay三角剖分程序-2
2.jpg



[ Last edited by nagami on 2015-1-16 at 21:30 ]
回复此楼
女靠衣装;男靠金装
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

18353248802

捐助贵宾 (小有名气)

★
小木虫: 金币+0.5, 给个红包,谢谢回帖
能否分享一下MATLAB 的源程序呢?多谢啦
9楼2016-11-26 16:00:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 10 个回答

nagami

木虫 (正式写手)

跑了个随机生成的小圆,缺了个角,我了个擦勒。而且感觉很不靠谱的样子
这可能是什么原因造成的?用matlab的triplot画的,输出脚本应该没问题的。
2D凸包Delaunay三角剖分程序-3
错误了.jpg
女靠衣装;男靠金装
2楼2015-01-08 20:30:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

nagami

木虫 (正式写手)

原因找到了:在边翻转操作程序里的指标出现重叠,这种重叠居然造成缺边的现象。
现在看着像合法的三角剖分了
2D凸包Delaunay三角剖分程序-4
P[K8PXQ5`S)EB4LXDOPN6LT.jpg

女靠衣装;男靠金装
3楼2015-01-08 21:57:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

人走茶不凉

银虫 (职业作家)

★
小木虫: 金币+0.5, 给个红包,谢谢回帖
不错,楼主的能力比较强,写的很快!只是好像你随机产生的数据点分布不太均匀。
4楼2015-01-09 00:45:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 龙 兔 虎 猫 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +5 5sJFDKp2kwuI 2026-11-06 11/550 2026-11-09 04:16 by l48hFd8Nwae2
[论文投稿] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +3 5sJFDKp2kwuI 2026-11-06 11/550 2026-11-09 04:09 by l48hFd8Nwae2
[硕博家园] 售SCI一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +4 5sJFDKp2kwuI 2026-11-06 13/650 2026-11-09 04:09 by l48hFd8Nwae2
[考博] 售SCI文章,我:8O.5.5.1O.54,科目全,可十急 +4 5sJFDKp2kwuI 2026-11-06 12/600 2026-11-09 04:05 by l48hFd8Nwae2
[考研] 售SCI一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +3 5sJFDKp2kwuI 2026-11-06 10/500 2026-11-09 03:58 by l48hFd8Nwae2
[教师之家] 售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急 +5 5sJFDKp2kwuI 2026-11-06 9/450 2026-11-08 22:46 by l48hFd8Nwae2
[硕博家园] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +3 5sJFDKp2kwuI 2026-11-06 9/450 2026-11-08 21:29 by l48hFd8Nwae2
[考博] 售SCI一区文章,我:8.O.55.1.O.54,科目齐全,可伽急 +10 ncTVBM6AOJHF 2026-11-04 22/1100 2026-11-06 17:18 by 5sJFDKp2kwuI
[考研] 售SCI一区T0P文章,我:8.O55.1.O.54,科目全,可十急 +4 ELBZ6WwEaRj6 2026-11-05 7/350 2026-11-06 16:43 by 5sJFDKp2kwuI
[考博] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +6 ELBZ6WwEaRj6 2026-11-05 8/400 2026-11-06 16:34 by 5sJFDKp2kwuI
[公派出国] 售SCI一区T0P文章,我:8.O.55.1.O.54,科目齐全,可+急 +5 ttH3f1oA6ace 2026-11-04 10/500 2026-11-06 16:12 by 5sJFDKp2kwuI
[公派出国] 售SCI一区文章,我:8.O.551.O.5.4,科目全,可伽急 +6 ttH3f1oA6ace 2026-11-04 12/600 2026-11-06 16:10 by 5sJFDKp2kwuI
[考研] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +8 ncTVBM6AOJHF 2026-11-04 18/900 2026-11-06 13:36 by BkA9Bi5cMhkD
[公派出国] 售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急 +5 kvewwGtKktqB 2026-11-04 14/700 2026-11-06 05:10 by qL1cU46YIdK0
[硕博家园] 售SCI一区T0P文章,我:8O.55.1.O.5.4,科目齐全,可+急 +6 kvewwGtKktqB 2026-11-04 16/800 2026-11-06 05:00 by qL1cU46YIdK0
[硕博家园] 售SCI一区文章,我:8O5.5.1.O5.4,科目全,可伽急 +4 ncTVBM6AOJHF 2026-11-04 12/600 2026-11-06 04:47 by qL1cU46YIdK0
[硕博家园] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +4 ELBZ6WwEaRj6 2026-11-04 8/400 2026-11-06 02:24 by qL1cU46YIdK0
[硕博家园] 售SCI-T0P文章,我:8O.5.5.1.O.54,科目齐全,可+急 +3 ttH3f1oA6ace 2026-11-04 9/450 2026-11-06 02:02 by qL1cU46YIdK0
[考研] 售一区SCI文章T0P,我:8O.551.O54,科目全,可十急 +5 ncTVBM6AOJHF 2026-11-04 12/600 2026-11-06 01:42 by qL1cU46YIdK0
[教师之家] 售SCI一区T0P文章,我:8O.55.1.O.54,科目全,可伽急 +4 ncTVBM6AOJHF 2026-11-04 12/600 2026-11-05 11:10 by PYZmcHr5kSaq
信息提示
请填处理意见