Blender > BLENDERMETRY (Блендерметрия)

Blender и фрактал Серпинского

(1/2) > >>

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

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии