Blender > BLENDERMETRY (Блендерметрия)
Blender и фрактал Серпинского
sungreen:
Треугольник Серпинского — фрактал, один из двумерных аналогов множества Кантора предложенный польским математиком Серпинским в 1915 году. Также известен как «решётка» или «салфетка» Серпинского.
Суть наглядно можно представить из рисунка.
Вот такой код делает данный рисунок в Blender.
--- Код: (Python) ---import bpy
import mathutils
def make_mesh(name):
me = bpy.data.meshes.new(name)
ob = bpy.data.objects.new(name, me)
bpy.context.scene.objects.link(ob)
return ob
def add_data(ob,verts,edges,faces):
me = ob.data
me.name = ob.name +' mesh'
me.from_pydata(verts,edges,faces)
me.update()
def sierpinski(verts,edges,faces,level,v0,v1,v2):
if level==0:
last=len(verts)
verts.extend([v0,v1,v2])
faces.append([last,last+1,last+2])
else:
sierpinski(verts,edges,faces,level-1,v0,(v0+v1)/2,(v0+v2)/2)
sierpinski(verts,edges,faces,level-1,v1,(v0+v1)/2,(v1+v2)/2)
sierpinski(verts,edges,faces,level-1,v2,(v0+v2)/2,(v1+v2)/2)
return
def main():
v0=mathutils.Vector(( 0.0, 1.0, 0.0))
v1=mathutils.Vector((-0.9, -0.4, 0.0))
v2=mathutils.Vector(( 0.9, -0.4, 0.0))
verts=[]
edges=[]
faces=[]
sierpinski(verts,edges,faces,5,v0,v1,v2)
ob=make_mesh('Sierpinski')
add_data(ob,verts,edges,faces)
main()
--- Конец кода ---
[вложение удалено Администратором]
sungreen:
... а почему только один из двумерных аналогов, пусть будет и 3D фрактал Серпинского ...
... вот код скрипта ...
... для перехода из 2D в 3D добавлена обработка еще одной вершины ...
... модель с примеров во вложении ...
--- Код: (Python) ---import bpy
import mathutils
def make_mesh(name):
me = bpy.data.meshes.new(name)
ob = bpy.data.objects.new(name, me)
bpy.context.scene.objects.link(ob)
return ob
def add_data(ob,verts,edges,faces):
me = ob.data
me.name = ob.name +' mesh'
me.from_pydata(verts,edges,faces)
me.update()
def sierpinski(verts,edges,faces,level,v0,v1,v2,v3):
if level==0:
last=len(verts)
verts.extend([v0,v1,v2,v3])
faces.append([last,last+1,last+2])
faces.append([last,last+3,last+2])
faces.append([last,last+3,last+1])
faces.append([last+1,last+2,last+3])
else:
sierpinski(verts,edges,faces,level-1,v0,(v0+v1)/2,(v0+v2)/2,(v0+v3)/2)
sierpinski(verts,edges,faces,level-1,v1,(v0+v1)/2,(v1+v2)/2,(v1+v3)/2)
sierpinski(verts,edges,faces,level-1,v2,(v0+v2)/2,(v1+v2)/2,(v2+v3)/2)
sierpinski(verts,edges,faces,level-1,v3,(v0+v3)/2,(v1+v3)/2,(v2+v3)/2)
return
def main():
v0=mathutils.Vector(( 0.0, 1.0, -0.4))
v1=mathutils.Vector((-0.9, -0.4, -0.4))
v2=mathutils.Vector(( 0.9, -0.4, -0.4))
v3=mathutils.Vector(( 0.0, 0.0667, 1))
verts=[]
edges=[]
faces=[]
sierpinski(verts,edges,faces,5,v0,v1,v2,v3)
ob=make_mesh('Sierpinski')
add_data(ob,verts,edges,faces)
main()
--- Конец кода ---
[вложение удалено Администратором]
sungreen:
... фантазии на тему "фрактальное дерево" ...
--- Код: (python) ---import bpy
import mathutils
import math
def make_mesh(name):
me = bpy.data.meshes.new(name)
ob = bpy.data.objects.new(name, me)
bpy.context.scene.objects.link(ob)
return ob
def add_data(ob,verts,edges,faces):
me = ob.data
me.name = ob.name +' mesh'
me.from_pydata(verts,edges,faces)
me.update()
lv = 12
k0 = 1
eul = mathutils.Euler((0.0, 0.0, math.radians( 60.0)), 'XYZ')
def fratree(verts,edges,faces,level,v0,v1):
dv = (v1-v0)
dn = dv.copy()*k0
dn.rotate(eul)
dn[2] = 0.01*(level+2)
v2 = v0 + dn
v3 = v1 + dn
v4 = (v1+v2)/2 + dn
last=len(verts)
verts.extend([v0,v1,v3,v4,v2])
faces.append([last,last+1,last+2,last+3,last+4])
if level!=0:
fratree(verts,edges,faces,level-1,v2,v4)
fratree(verts,edges,faces,level-1,v4,v3)
return
def main():
print('debug')
v0=mathutils.Vector(( 0.0, 0.0, 0.0))
v1=mathutils.Vector(( 1.0, 0.0, 0.0))
verts=[]
edges=[]
faces=[]
fratree(verts,edges,faces,lv,v0,v1)
ob=make_mesh('fratree')
add_data(ob,verts,edges,faces)
main()
--- Конец кода ---
Николай Николаев:
... Для версии blender 2.8x необходимо править код, в том числе с учетом введенных коллекций. То есть теперь к объекту добираемся через коллекцию ...
--- Код: (Blender API) ---import bpy
import mathutils
import math
def make_mesh(name):
me = bpy.data.meshes.new(name)
ob = bpy.data.objects.new(name, me)
bpy.data.collections[0].objects.link(ob)
return ob
def add_data(ob,verts,edges,faces):
me = ob.data
me.name = ob.name +' mesh'
me.from_pydata(verts,edges,faces)
me.update()
lv = 12
k0 = 1
eul = mathutils.Euler((0.0, 0.0, math.radians( 60.0)), 'XYZ')
def fratree(verts,edges,faces,level,v0,v1):
dv = (v1-v0)
dn = dv.copy()*k0
dn.rotate(eul)
dn[2] = 0.01*(level+2)
v2 = v0 + dn
v3 = v1 + dn
v4 = (v1+v2)/2 + dn
last=len(verts)
verts.extend([v0,v1,v3,v4,v2])
faces.append([last,last+1,last+2,last+3,last+4])
if level!=0:
fratree(verts,edges,faces,level-1,v2,v4)
fratree(verts,edges,faces,level-1,v4,v3)
return
def main():
for ob in bpy.data.collections[0].objects:
bpy.data.collections[0].objects.unlink(ob)
bpy.data.collections[0].objects.remove(ob)
print('debug')
v0=mathutils.Vector(( 0.0, 0.0, 0.0))
v1=mathutils.Vector(( 1.0, 0.0, 0.0))
verts=[]
edges=[]
faces=[]
fratree(verts,edges,faces,lv,v0,v1)
ob=make_mesh('fratree')
add_data(ob,verts,edges,faces)
main()
--- Конец кода ---
sungreen:
забавное видео про треугольник серпинского https://www.youtube.com/watch?v=-a_iyHtAkew
Навигация
Перейти к полной версии