24小时热门版块排行榜    

查看: 3362  |  回复: 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的回帖

人走茶不凉

银虫 (职业作家)


小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
5楼: Originally posted by nagami at 2015-01-09 09:11:10
呵呵,要是产生的网格正确,我也不担心这个。准备在此基础上,做点的平衡分布或者Laplace smoothing,产生高质量的网格。但还有瑕疵,比如插入点在三角形线上就会出现外接圆三点共线的可能问题,会使程序自动推出。 ...

我也做过三角剖分的东西,但是也没有太深入研究。
6楼2015-01-10 08:03:54
已阅   回复此楼   关注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的回帖
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 欢迎发来filecode的Mz6后的代码验证其规律 +23 医学老男孩 2026-08-13 49/2450 2026-08-14 20:02 by zhaifei
[基金申请] 咱们一起用铁证分析2026国家社科基金中标与否 +6 启萌科技 2026-08-12 21/1050 2026-08-14 19:48 by 启萌科技
[基金申请] 奇怪,两个人的filecode固定段从头到尾一模一样 +8 布布和一二 2026-08-10 11/550 2026-08-14 14:58 by Equinoxhua
[基金申请] 应该是93bebmhtak前后十一个字符比较关键 +23 Lanmanbaby 2026-08-09 37/1850 2026-08-14 13:40 by Equinoxhua
[硕博家园] 读博的好处 +4 lnee 2026-08-11 4/200 2026-08-14 10:20 by ahsoarli
[基金申请] filecode +15 documentary 2026-08-10 17/850 2026-08-14 10:08 by kissu88
[基金申请] 我的国基提前知道中了,可是同事的操作让我实在接受不了,怎么会有这样的人 +10 家与远方 2026-08-10 15/750 2026-08-14 02:08 by 绵羊哥哥
[基金申请] 关于Filecode分析方法 +9 majunge000 2026-08-10 12/600 2026-08-13 23:20 by iwuli
[硕博家园] 一作与独作在应聘高校教师时区别大吗 +3 mbygzh 2026-08-08 4/200 2026-08-13 19:31 by 龙-樱
[基金申请] 重要来源:本周末出结果 +10 瞬息宇宙 2026-08-12 10/500 2026-08-13 15:46 by likettle
[基金申请] 不应该看fileCode +7 且听虎啸 2026-08-12 9/450 2026-08-13 14:27 by flydreamws
[基金申请] Filecode 又变了,巨变 +3 WH3796 2026-08-12 4/200 2026-08-13 14:13 by 小木虫6752397
[基金申请] 2019年青年基金涵评意见,大家看看几个A,几个B? +11 Tide man 2026-08-11 11/550 2026-08-13 07:35 by 撸猫猫
[基金申请] 综述论文作为代表作会不会影响评审专家的印象分? +11 yufeiwaner 2026-08-09 13/650 2026-08-12 08:17 by yufeiwaner
[基金申请] 是这周出结果还是下周出结果? +3 yuleib84 2026-08-11 3/150 2026-08-11 21:53 by jnhyjjm
[基金申请] 为什么网上很多人说本周 12号出结果 +6 瞬息宇宙 2026-08-10 7/350 2026-08-11 19:25 by Tide man
[基金申请] 确定了,国自然21号放榜 +6 布布和一二 2026-08-10 7/350 2026-08-10 19:15 by 2000zf36392
[基金申请] 国自然结果 +4 Vierhys 2026-08-10 8/400 2026-08-10 15:06 by Vierhys
[基金申请] 面上项目filecode邪修 +5 西山十月 2026-08-09 7/350 2026-08-10 07:32 by 仁砚薪传
[基金申请] 关于filecode,很负责任的告诉大家 +6 爱看书的可乐 2026-08-08 7/350 2026-08-08 22:13 by a_niu
信息提示
请填处理意见