今天是因为可以用py而高兴的一天。

昨天老板淡淡地回了一句,sierpinski地毯画得挺好的。

我思考了五秒钟之后,想起来作业其实是sierpinski垫片。

 
 

三角垫片比地毯难做多了。

因为你用的像素点,其实是矩形,你可以把像素点当矩形用。

三角形,随机算法可以,你要我用传统算法来解那个三角垫片,我只想给你以窝jio。除非你给我一个三角网格。

所以在jpg里玩,没tai意nan思le。你说你解完,反不反走样。。。是吧。。。反走样很蠢,走样了很丑。

所以,我决定用.ply来存这玩意。。。话说,既然这么用,干脆搞个大新闻好了。

不然你说,在三维空间里存了一堆平面上的三角,哈哈哈哈哈次藕爆了。

可是道理我都懂,为啥底是矩形呢。。。[图片来自百度,侵删]

所以,我们要整个更好看的哈哈哈哈哈。

算法逻辑:

每个四面体生成四个小四面体并多出六个顶点。

最终是要输出三角面片,可是在这之前我一直是体在拆解啊。

所以我中间过程存储体的信息,最后一步拆成四个面就好了。

每一轮,四面体信息矩阵扩大四倍。

  每个四面体拆解都会成四个小四面体存入对应四行。

  顶点通过取中点取到六个,信息补上6个。

import numpy as np
import cv2 def beiup(x1,x2,x3,x4):
x=np.zeros((6,3),dtype=float)
for j in range(3):
x[0][j]=(x1[j]+x2[j])/2
x[1][j]=(x2[j]+x3[j])/2
x[2][j]=(x3[j]+x1[j])/2
x[3][j]=(x4[j]+x1[j])/2
x[4][j]=(x4[j]+x2[j])/2
x[5][j]=(x4[j]+x3[j])/2
return x
def yeiup(yei,jsq):
new=np.zeros((4,4),dtype=int)
new[0][0]=yei[0]
new[0][1]=jsq
new[0][2]=jsq+2
new[0][3]=jsq+3
new[1][0]=jsq
new[1][1]=yei[1]
new[1][2]=jsq+1
new[1][3]=jsq+4
new[2][0]=jsq+2
new[2][1]=jsq+1
new[2][2]=yei[2]
new[2][3]=jsq+5
new[3][0]=jsq+3
new[3][1]=jsq+4
new[3][2]=jsq+5
new[3][3]=yei[3]
jsq+=6
return new,jsq
def feiwrite(yeimat,times):
k=4**times
feimat=np.zeros((k*4,3),dtype=int)
for i in range(k):
feimat[i*4+0][0]=yeimat[i][0]
feimat[i*4+0][1]=yeimat[i][2]
feimat[i*4+0][2]=yeimat[i][1]
feimat[i*4+1][0]=yeimat[i][0]
feimat[i*4+1][1]=yeimat[i][1]
feimat[i*4+1][2]=yeimat[i][3]
feimat[i*4+2][0]=yeimat[i][0]
feimat[i*4+2][1]=yeimat[i][3]
feimat[i*4+2][2]=yeimat[i][2]
feimat[i*4+3][0]=yeimat[i][1]
feimat[i*4+3][1]=yeimat[i][2]
feimat[i*4+3][2]=yeimat[i][3]
return feimat def plywrite(fname,beimat,feimat,potnumber,trinumber):
potpiplist=np.zeros((3),dtype=float)
tripiplist=np.zeros((3),dtype=int)
fply = open(fname,'w')
fply.write('ply\n')
fply.write('format ascii 1.0\n')
fply.write('comment VCGLIB generated\n')
fply.write('element vertex '+str(potnumber)+'\n')
fply.write('property float x\n')
fply.write('property float y\n')
fply.write('property float z\n')
fply.write('element face '+str(trinumber)+'\n')
fply.write('property list uchar int vertex_indices\n')
fply.write('end_header\n')
for i in range(potnumber):
potpiplist[0]=beimat[i][0]
potpiplist[1]=beimat[i][1]
potpiplist[2]=beimat[i][2]
fply.write('%0.4f %0.4f %0.4f\n' %(potpiplist[0],potpiplist[1],potpiplist[2]))
for i in range(trinumber):
tripiplist[0]=feimat[i][0]
tripiplist[1]=feimat[i][1]
tripiplist[2]=feimat[i][2]
fply.write('%d %d %d %d\n' %(3,tripiplist[0],tripiplist[1],tripiplist[2]))
fply.close()
return fname

  

解释一下变量名。

我最近在捣腾一个TPS的大项目。

ply文件有两个主要部分

一个是点坐标信息,beimat      顶点数*3,  float

一个是面片顶点信息,feimat   面片数*3,  int 对应beimat的第i个。

以前没有四面体一说,yeimat   体数*4   ,  int

bei是我的名字,fei是我姐上的名。

口哼哼,我不管,反正项目我最后封装掉的。

beiup解决了如何拆出六个中点;

yeiup解决了如何拆出四个体;

feiwrite解决了如何从一个体拆除四个面片。

import numpy as np
import cv2
import tps
import sie times=1
if times<4:
beimat=np.zeros((600,3),dtype=float)
if times<6:
beimat=np.zeros((2100,3),dtype=float)
if times<10:
beimat=np.zeros((9000,3),dtype=float) yeimat=np.zeros((1,4),dtype=int)
'''
0,0,0; 1,0,0; 0.5,g3/2,0 ;0.5 g3/6,g6/3)
'''
beimat[1][0]=1
beimat[2][0]=0.5
beimat[2][1]=(3**0.5)/2
beimat[3][0]=0.5
beimat[3][1]=(3**0.5)/6
beimat[3][2]=(6**0.5)/3 yeimat[0][1]=1
yeimat[0][2]=2
yeimat[0][3]=3
###end for setting jsq=4
for k in range(times):
yeinew=np.zeros((4**k*4,4),dtype=int)
for n in range(4**k):
beimat[jsq:jsq+6,:]=sie.beiup(beimat[int(yeimat[n][0])],beimat[int(yeimat[n][1])],beimat[int(yeimat[n][2])],beimat[int(yeimat[n][3])])
[yeinew[4*n:4*n+4,:],jsq]=sie.yeiup(yeimat[n],jsq)
yeimat=yeinew feimat=sie.feiwrite(yeimat,times) fname=str("sie"+str(int(times))+".ply")
print(jsq) fname=sie.plywrite(fname,beimat[0:jsq,:],feimat,jsq,4**times*4)

  

主程序有三部分:

决定beimat的大小

初始化第一个四面体(顶点坐标+编号)

主循环体+输出。

你说我不能算出来beimat应该有多大么?

毕竟是学树学的,这如果算不出来实在是无能。。。问题是,我有必要算么?

如果你要算的话,就是x=x*4-6的一个递归数列。。。可以,但没必要。

我jsq最后会告诉我有多少个坐标点的。。。我只要,一开始不把beimat设太小就好了。

这里四个是1-4次迭代;下方几个都是5/6次迭代。

嘿嘿嘿!py万岁!

sierpinski垫片(3D)[误]的更多相关文章

  1. sierpinski地毯(II)

    今天又是因为可以用py而高兴的一天. 继续咱的sierpinski地毯计划. 二,随机算法 在二十年前,磁盘容量以MB还是KB计的时候,分形解决计图的问题确实有很大的优势.存至多十来个数就好了.我要在 ...

  2. JavaScript图形实例:SierPinski三角形

    1.SierPinski三角形 Sierpinski三角形是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集.其生成过程为: (1)取一个三角形(多数使用等边三角形): (2) ...

  3. Altium 分形天线设计

    Altium 分形天线设计 程序运行界面 Cantor三分集 Koch雪花 Sierpinski垫片 源代码: Iter_Num = 4     'diedai PI = 3.1415926 Call ...

  4. JavaScript动画实例:递归分形图动态展示

    在“JavaScript图形实例:SierPinski三角形” 和“JavaScript图形实例:Levy曲线及其变形”等文章中我们介绍了通过递归生成分形图形的方法.我们可以将绘制的分形图形每隔一定的 ...

  5. 看守所、戒毒所3D指纹门禁系统解决方案

    为响应"科技强警"的战略方针,华本构建了一个完整的.集成的.可靠的.易操作的高安全性门禁系统,应用于看守所.戒毒所.公安局和部队等单位,使管理更现代化.规范化,有效地预防和制止越狱 ...

  6. 工厂食堂3D指纹考勤系统解决方案

    指纹考勤就餐管理系统利用3D活体指纹技术完成对正式员工就餐管理.就餐者只需办理完入职手续,并登记考勤指纹,就可通过考勤指纹在工厂食堂领餐. 大多数工厂食堂就餐是福利性的,只准员工就餐,不准员工带亲戚朋 ...

  7. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  8. Qt 3D研究(九):尝试第二边缘检测方法

    Qt 3D研究(九):尝试第二边缘检测方法 三维应用程序,通过FBO.将3D图像渲染成纹理,然后对渲染成的纹理进行图像处理,终于显示在屏幕上的.是风格化后的图案.上一次我使用了一种普通的图像处理方法: ...

  9. Directx11学习笔记【九】 【转】 3D渲染管线

    原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即给定场景的描述,包括各个物体的材质.纹理.坐标等,照相 ...

随机推荐

  1. 解决centos下tomcat启动太慢 & JDBC连接oracle太慢的问题

    近期遇到一个非常奇怪的问题,也不知道改了什么,tomcat启动非常慢,以前几秒就启动好了,现在要30秒左右. 而且,通过jdbc连接oracle数据库也非常慢,以前建立一个连接只要几十毫秒,现在也要1 ...

  2. 【mysql】You must reset your password using ALTER USER statement before executing this statement. 报错处理

    1.问题:登陆mysql以后,不管运行任何命令,总是提示这个 mysql> select user,authentication from mysql.user; ERROR 1820 (HY0 ...

  3. 【Java线程与内存分析工具】VisualVM与MAT简明教程

    目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...

  4. 通过 SCQA 的框架来讲故事

    SCQA:Situation情景.Complication冲突.Question疑问. Answer回答   SCQA模型是一个"结构化表达"工具,是麦肯锡咨询顾问芭芭拉·明托在& ...

  5. Springmvc配置定时任务注解开发

    1.添加命名空间和xsd约束 xmlns:task="http://www.springframework.org/schema/task" http://www.springfr ...

  6. Git分布式版本控制器使用

    前言: 使用Git版本控制器差不多有一年多的时间了,在这一年多的时间里对这个传说的的分布式版本控制工具有了一定的了解.在实战项目开发中,对关于如何在通过Git提交项目,以及如何使用Git命令对提交的文 ...

  7. node.js如何批量赋值

    1. 数组解析赋值 let a = 1; let b = 2; let c = 3; 等同于 let [a, b, c] = [1, 2, 3]; 默认值 let [a, b = "B&qu ...

  8. SQL常用函数之STR()

    使用str函数   :STR 函数由数字数据转换来的字符数据.   语法      STR    (    float_expression    [    ,    length    [    , ...

  9. 使用dapper遇到的问题及解决方法

    在使用dapper进行数据查询时遇到的一个问题,今天进行问题重现做一个记录,免得忘记以后又犯同样的错误. 自己要实现的是:select * from tablename where id in(1,2 ...

  10. 如何访问到静态的文件,如jpg,js,css.

    如果你的DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题. 如果你的DispatcherServlet拦截"/&qu ...