【此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺】

这一篇文章我讲一下多边打印的问题,多边打印是切片引擎的一项关键的技术。

图1 双边打印



首先。它能够保证打印实体表面免受内部填充的冲击,保证外观的真实度;其次,在上层在相对于下层倾斜较大时。多边打印能够非常好的起到支撑的作用,避免上层塌陷。

但是,眼下来说,我的多边打印还不够普适,对一些不规范的模型,以及模型中非常尖锐的特征效果并不好,对绝大部分的较为平滑的模型是全然没有问题的。

以下就简单说一下它的原理:如果边界中的随意相邻的向量AB和BC,这里要找的是点d(角ABC中心线上的一点),看下图:



找出边界环中每个相邻向量的d点。工作就基本完毕了。

所以原理非常easy,仅仅只是是非常多琐碎的细节须要处理好,比方说向量Bd的方向问题。B点和d点的欧氏距离等等,不能再说了。再说就有误导人之嫌。事实上这段时间细想。我的切片引擎的这些想法并无优秀可言。但是还是想把那段时间的工作记录下来。仅此而已。闲话说几句。这段时间在做与測绘相关的算法,本来觉得能够写成博文与大家分享的东西,结果硬是变成了核心期刊上的论文了,哎,仅仅是觉得那个东西离论文水平的创新还有不小的距离啊,看来,国内的论文质量……。呵呵。以下呈上代码,当中getInnerBoundary函数有些不够规范。用了goto跳转,并且一些细节也不是最科学,当初主要是赶进度,为了适应公司的建模能力不足。

void getAngularBisector(float3 &bisector,float3 point,float3 leftPoint,float3 rightPoint)
{
float3 v1,v2; float norm1,norm2,angle; get_vector_diff(v1,leftPoint,point); get_vector_diff(v2,rightPoint,point); if(v1[0]*v2[1]==v1[1]*v2[0])
{
if(v1[1]==v2[1])
{
bisector[0]=0; bisector[1]=1; bisector[2]=0;
}
else if(v1[0]==v2[0])
{
bisector[0]=1; bisector[1]=0; bisector[2]=0;
}
else
{
bisector[0]=point[0]-1; bisector[1]=((v1[0]-v2[0])+(v1[1]-v2[1])*point[1])/(v1[1]-v2[1]); bisector[2]=0;
} }
else
{
getNormalizeVector(v1); getNormalizeVector(v2); if(v1[0]*v2[1]==v1[1]*v2[0])
{
if(v1[1]==v2[1])
{
bisector[0]=0; bisector[1]=1; bisector[2]=0;
}
else if(v1[0]==v2[0])
{
bisector[0]=1; bisector[1]=0; bisector[2]=0;
}
else
{
bisector[0]=point[0]-1; bisector[1]=((v1[0]-v2[0])+(v1[1]-v2[1])*point[1])/(v1[1]-v2[1]); bisector[2]=0;
} }
else
{
get_vector_sum(bisector,v1,v2);
}
}
} void getInnerPoint(float3 &innerPoint,float3 point,float3 leftPoint,float3 rightPoint,float margin)
{
float3 bisector; float distance,rate; distance=margin; getAngularBisector(bisector,point,leftPoint,rightPoint); rate=distance/sqrt(pow(bisector[0],2)+pow(bisector[1],2)+pow(bisector[2],2)); innerPoint[0]=point[0]+bisector[0]*rate; innerPoint[1]=point[1]+bisector[1]*rate; innerPoint[2]=point[2]+bisector[2]*rate; if(get_vector3_det(point,rightPoint,innerPoint)<0)
{ innerPoint[0]=point[0]-bisector[0]*rate; innerPoint[1]=point[1]-bisector[1]*rate; innerPoint[2]=point[2]-bisector[2]*rate;
}
} void getInnerPoint(Phasor *innerPhasor,Phasor *phasor,Phasor*leftPhasor,Phasor *rightPhasor,float margin,int fillMaterial)
{
getInnerPoint(innerPhasor->beginPoint,phasor->beginPoint,leftPhasor->beginPoint,phasor->endPoint,margin); getInnerPoint(innerPhasor->endPoint,phasor->endPoint,phasor->beginPoint,rightPhasor->endPoint,margin); innerPhasor->material=fillMaterial;
} void getInnerBoundary(Phasor *&innerPhasors,Phasor *phasors,int phasor_num,vector<vector<int> > &closedSet
,float lineHeight,int fillMaterial,bool *innerBoundaryStatus)
{
innerPhasors=new Phasor[phasor_num]; int index,indexMain,phasorIndex,phasorIndexLeft,phasorIndexRight; float margin=lineHeight; againScan: if(margin<0.1)
{
*innerBoundaryStatus=false; innerPhasors=NULL; return;
} for(indexMain=0;indexMain!=closedSet.size();++indexMain)
{
int count=0; for(index=0;index!=closedSet[indexMain].size();++index)
{ phasorIndex=closedSet[indexMain][index]; if(index>0)
{
phasorIndexLeft=closedSet[indexMain][index-1];
}
else
{
phasorIndexLeft=closedSet[indexMain][closedSet[indexMain].size()-1];
} phasorIndexRight=closedSet[indexMain][(index+1)%closedSet[indexMain].size()]; getInnerPoint(innerPhasors+phasorIndex
,phasors+phasorIndex
,phasors+phasorIndexLeft
,phasors+phasorIndexRight
,margin,fillMaterial); for(int i=0;i!=phasor_num;++i)
{ if(i==phasorIndex)
{
continue;
} if(get_vector_distance2(innerPhasors[phasorIndex].beginPoint,phasors[phasorIndex].beginPoint)>
get_vector_distance2(innerPhasors[phasorIndex].beginPoint,phasors[i].beginPoint))
{
count++; break;
}
} if(count>closedSet[indexMain].size()/5+1)
{
margin-=0.05; goto againScan;
}
}
}
}

3D打印技术之切片引擎(4)的更多相关文章

  1. 3D打印技术之切片引擎(5)

    [此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺] 从这一篇文章開始,就開始说填充.在3D打印切片技术中,填充算法是最核心的部分.3D打印技术的经常使 ...

  2. 3D打印技术之切片引擎(6)

    [此系列文章基于熔融沉积( fused depostion modeling, FDM )成形工艺] 这一篇文章说一下填充算法中的网格填充.网格填充在现有的较为成熟的引擎中是非常普遍的:skeinfo ...

  3. 3D打印技术在医疗上的实际应用与实验室研究

    2018-01-17 Chris 免费3D打印模型资源站 预计阅读时间:5-10分钟 关键字:3D打印髋关节.脊柱置换产品,3D打印技术辅助精准截骨,义齿,生物墨水(BioInk),干细胞   随着& ...

  4. 3D打印技术的火爆,真的会让传统模具行业没落吗?

    当一种新生事物出现时,人们除了赞美它带来的新畅想外,往往还会对"旧事物"贬低几分--各种淘汰观点总是不绝于耳.但可惜的是,新生事物取代旧事物的事儿并不会必然发生.比如,直到现在广播 ...

  5. 3D打印技术的学习

    1. 我们使用3D建模软件:123Ddesign来设计 123D design软件保存格式有2种,分别为123dx和stl格式 123dx格式:选择菜单栏中“Save”下的“To my compute ...

  6. 通过three.js实现简易3D打印模型切片展示

    现在的页面展示要求越来越高,美的展示总能吸引更多的访客.最近在学习3D打印中的切片算法,刚刚入门,发现通过three.js框架可以很好展示出3D切片细节(虽然我做的比较简单). //========= ...

  7. 3D打印:三维智能数字化创造(全彩)

    3D打印:三维智能数字化创造(全彩)(全球第一本系统阐述3D打印与3D智能数字化的专业著作) 吴怀宇 编   ISBN 978-7-121-22063-0 2014年1月出版 定价:99.00元 42 ...

  8. 《3D打印:三维智能数字化创造(全彩)》

    <3D打印:三维智能数字化创造(全彩)> 基本信息 作者: 吴怀宇 出版社:电子工业出版社 ISBN:9787121220630 上架时间:2014-1-13 出版日期:2014 年1月 ...

  9. 进阶篇:3.9)3d打印件设计

    本章目的:了解3d打印,购买3d打印机. 1.3d打印基础知识: 现在主流的3d打印技术有4种:①FDM:②SLA:③SLS:④3DP.具体如下: ①熔融沉积造型(Fused deposition m ...

随机推荐

  1. Eclipse调试程序及项目的导入导出

    Eclipse调试程序 调试概述: ①   调试就是测试程序的方法,主要的目的就是解决程序的逻辑问题,流程是:发现问题.修改问题.正确执行; ②   以前我们可以使用System.out.printl ...

  2. CentOS7下RabbitMQ服务安装配置胜多负少

    RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.RabbitMQ据说具有良 ...

  3. 【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛

    题目描述 给下N,M,K.求 输入 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. 输出 如题 ...

  4. 【CCF】网络延时 树搜索

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  5. MGW——美团点评高性能四层负载均衡

    转自美团点评技术博客:https://tech.meituan.com/MGW.html 前言 在高速发展的移动互联网时代,负载均衡有着举足轻重的地位,它是应用流量的入口,对应用的可靠性和性能起着决定 ...

  6. Road(bzoj 2750)

    Description C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同.我 ...

  7. Python日志(logging)模块使用方法简介

    A logger is configured to have a log level. This log level describes the severity of the messages th ...

  8. 如何让div中的文字只显示一行,多余的文字隐藏并加上省略号(超链接形式)

    写页面的时候遇到了一个小小的问题,如何让div中一行超链接文字只显示一行,多余的文字隐藏并加上省略号,悬浮时隐藏的文字显示出来?解决问题时发现了css3的一个新标签  text-overflow  , ...

  9. python pyd 加密相关

    Dockerfile RUN 同时执行多条命令 Dokcerfile中的命令每执行一条即产生一个新的镜像,当前命令总是在最新的镜像上执行.如下Dockerfile: RUN cd /usr/share ...

  10. AC日记——Sign on Fence Codeforces 484e

    E. Sign on Fence time limit per test 4 seconds memory limit per test 256 megabytes input standard in ...