sierpinski垫片(3D)[误]
今天是因为可以用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)[误]的更多相关文章
- sierpinski地毯(II)
今天又是因为可以用py而高兴的一天. 继续咱的sierpinski地毯计划. 二,随机算法 在二十年前,磁盘容量以MB还是KB计的时候,分形解决计图的问题确实有很大的优势.存至多十来个数就好了.我要在 ...
- JavaScript图形实例:SierPinski三角形
1.SierPinski三角形 Sierpinski三角形是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集.其生成过程为: (1)取一个三角形(多数使用等边三角形): (2) ...
- Altium 分形天线设计
Altium 分形天线设计 程序运行界面 Cantor三分集 Koch雪花 Sierpinski垫片 源代码: Iter_Num = 4 'diedai PI = 3.1415926 Call ...
- JavaScript动画实例:递归分形图动态展示
在“JavaScript图形实例:SierPinski三角形” 和“JavaScript图形实例:Levy曲线及其变形”等文章中我们介绍了通过递归生成分形图形的方法.我们可以将绘制的分形图形每隔一定的 ...
- 看守所、戒毒所3D指纹门禁系统解决方案
为响应"科技强警"的战略方针,华本构建了一个完整的.集成的.可靠的.易操作的高安全性门禁系统,应用于看守所.戒毒所.公安局和部队等单位,使管理更现代化.规范化,有效地预防和制止越狱 ...
- 工厂食堂3D指纹考勤系统解决方案
指纹考勤就餐管理系统利用3D活体指纹技术完成对正式员工就餐管理.就餐者只需办理完入职手续,并登记考勤指纹,就可通过考勤指纹在工厂食堂领餐. 大多数工厂食堂就餐是福利性的,只准员工就餐,不准员工带亲戚朋 ...
- ZAM 3D 制作简单的3D字幕 流程(二)
原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...
- Qt 3D研究(九):尝试第二边缘检测方法
Qt 3D研究(九):尝试第二边缘检测方法 三维应用程序,通过FBO.将3D图像渲染成纹理,然后对渲染成的纹理进行图像处理,终于显示在屏幕上的.是风格化后的图案.上一次我使用了一种普通的图像处理方法: ...
- Directx11学习笔记【九】 【转】 3D渲染管线
原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即给定场景的描述,包括各个物体的材质.纹理.坐标等,照相 ...
随机推荐
- 解决最新Java12 安装
题外话: 因为我笔记本上的java用的版本是比较老的,从java8开始已经不再需要classpath java-home path 这几个安装界的行业规范,基本上只需要安装 然后在path路径下 ...
- 利用shell脚本快速定位日志
我们平时查日志,在测试环境,日志文件只有几个的情况下,我们可以通过找时间接近的文件然后根据关键词定位报错位置,大不了都查一遍,这都可以忍受.但是在实际的生产环境下,服务器集群部署,每天的日志非常多非常 ...
- Docker容器 MySQL中文乱码解决方案
docker exec进入容器 sudo docker exec -it 588340b778f6 bash 执行以下命令,将 character-set-server=utf8 写入mysql配置文 ...
- MongoDB for OPS 02:复制集 RS 配置
写在前面的话 对于生产环境而言,除非是非常不重要的业务,且该业务允许我们出现一定时间的停机,我们一般才会使用单节点,且该单节点必须要有完善的备份手段. RS 复制集 我们这里采取一主两从的方式搭建复制 ...
- C# Mutex to make sure only one unique application instance started
static void MutexDemo2() { string assName = Assembly.GetEntryAssembly().FullName; bool createdNew; u ...
- 对Python中函数参数类型及排序问题,三个方面的总结
Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参 ...
- Java技巧——比较两个日期相差的天数
Java技巧——比较两个日期相差的天数 摘要:本文主要记录了在Java里面如何判断两个日期相差的天数. 判断两个Date类型的日期之间的天数 通过计算毫秒数判断: public static void ...
- SpringBoot(六) SpringBoot整合Swagger2(自动化生成接口文档)
一:在上篇文章pom增加依赖: <dependency> <groupId>io.springfox</groupId> <artifactId>spr ...
- FCC---Use CSS Animation to Change the Hover State of a Button---鼠标移过,背景色变色,用0.5s的动画制作
You can use CSS @keyframes to change the color of a button in its hover state. Here's an example of ...
- vue快速复习手册
1.基本使用 <!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Vue的基本 ...