快速成型中的自动分段算法

方块与球_完整.png
曲面_完整.png
圆柱与球_完整.png

需求:


需求说明.png

效果说明.png

程序如下:

import copy
from stl import stl
import mpl_toolkits.mplot3d as a3
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
from mpl_toolkits.mplot3d import Axes3D

#加载stl函数
def load_stl(stl_name):
    for i in range(len(stl_name)):
        mesh = stl.StlMesh('./'+stl_name[i]+'.stl')
        dot_matrix=np.zeros((len(mesh),3,3))
        #将每个三角面的三个顶点坐标存在矩阵dot_original中
        for i in range(len(mesh)):
            s1=mesh.points[i]
            s2=s1.reshape(3,3)
            dot_matrix[i]=s2
    #返回每个面片三个顶点的坐标以及法相量
    return dot_matrix,mesh.normals

#画出图像
def plot_stl(dot_matrix):
    fig = plt.figure()
    ax = Axes3D(fig)
    kwargs = {'alpha': 0.8,'color':'blue'}
    for i in np.arange(len(dot_matrix)):
        dot_m=np.vstack((dot_matrix[i],dot_matrix[i][0]))
        ax.plot3D(dot_m[:,0].tolist(),dot_m[:,1].tolist(),dot_m[:,2].tolist(),linewidth=0.5,**kwargs)
    plt.show()

#判断两个三角面是否有公共点,如果有则将share_dot_num计数器加1
def topology(m1,m2):
    return share_dot_num

#生成拓扑关系
def topology_creation(dot_matrix):
    #记录图谱
    topology_list=[]
    return topology_list

#计算两个向量之间的夹角
def vector_angle(x,y):
    Lx=np.sqrt(x.dot(x))
    Ly=np.sqrt(y.dot(y))
    if Lx*Ly==0:
        angle2=90
    else:
        #相当于勾股定理,求得斜线的长度
        cos_angle=x.dot(y)/(Lx*Ly)
        if cos_angle>1:
            angle2=0
        else:
            #求得cos_sita的值再反过来计算,绝对长度乘以cos角度为矢量长度,初中知识。。
            angle=np.arccos(cos_angle)
            angle2=round(angle*180/np.pi,0)
    # print(angle2)
        #变为角度
    return angle2

#计算每个三角面片与水平面夹角
def nvhp_angle_cal(nv_matrix):
    nvhp_angle_list=[]
    for i in np.arange(len(nv_matrix)):
        nv_vector=nv_matrix[i]
        hp_vector=copy.deepcopy(nv_matrix[i])
        hp_vector[2]=0
        nvhp_angle_list.append(vector_angle(nv_vector,hp_vector))
    return nvhp_angle_list

#计算夹角变化率
def change_rate_cal(topology_relation,nvhp_angle):
    change_rate_matrix=np.zeros((len(topology_relation),3))
    return change_rate_matrix

#这个需求的核心,针对yuanhuyuqiu效果最好,针对方块与球效果一般,针对qumian效果差           

def change_rate_stl1(change_r,topology_r,nvhp_a):
    special_list=[]
    return special_list

def change_rate_stl2(change_r,topology_r,nvhp_a):
    special_list=[]
    return special_list

def main():
    #加载stl数据
    dot_matrix,nv_matrix=load_stl(['fangkuaiyuqiu'])
    #求拓扑关系
    topology_relation=topology_creation(dot_matrix)
    #计算每个法相量与水平面夹角
    nvhp_angle=nvhp_angle_cal(nv_matrix)
    #计算具有拓扑关系的三角面片法向量夹角的变化率
    change_rate=change_rate_cal(topology_relation,nvhp_angle)
    # print(change_rate)
    special_list1=change_rate_stl1(change_rate,topology_relation,nvhp_angle)
    special_list2=change_rate_stl2(change_rate,topology_relation,nvhp_angle)
    print(special_list1)
    #画出完整的图
    print(len(dot_matrix))
    plot_stl(dot_matrix)
    plot_stl(dot_matrix[special_list1])
    plot_stl(dot_matrix[special_list2])
    #画出分割的图

main()

效果如下:

方块与球_分开.png
方块与球_分开.png
曲面_分开.png
曲面_分开.png
圆柱与球_分开.png
圆柱与球_分开.png

补充说明:
说明:
本代码是在python3.8环境下运行,部分python包为第三方包,如:
from stl import stl
import mpl_toolkits.mplot3d as a3
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
from mpl_toolkits.mplot3d import Axes3D
安装方法(以stl为例):pip install stl,其他类似。
该程序由9个函数组成分别为:
1.load_stl(stl_name):输入stl名称,返回每个三角面片的顶点(3x3矩阵)以及每个三角面片的法相量
2.plot_stl(dot_matrix):输入每个三角面片的顶点,输出三角面片图像
3.topology_creation(dot_matrix):输入三角面片顶点,输出拓扑关系topology_list
4.topology(m1,m2):输入两个三角面片,判断它们有几个共同点,被topology_creation调用
5.vector_angle(x,y):计算两个向量x,y之间的夹角,输入两个向量,输出向量之间的夹角
6.nvhp_angle_cal(nv_matrix):计算每个三角面片法相量与水平面之间的夹角,输入为法相量,输出为夹角
7.change_rate_cal(topology_relation,nvhp_angle):计算夹角的变化率,输入为拓扑关系和法相量与平面的夹角,输出为夹角变化率
8.change_rate_stl1和change_rate_stl2:将法相量与平面夹角的变化率呈现不同规律的的面片找出来,三角面片与相邻三角面片法相量夹角变化率小于零同时本身的法相量不等于0;另一个是三角面片与相邻三角面片法相量夹角变化率大于等于零同时本身的法相量等于0,实现曲面与直角面的分割,这个比较粗糙,不具有普适性,还需要进一步研究
9.main():主函数入口,负责调用上述函数

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351