3d форум по Blender

Blender => Другое => BLENDERMETRY (Блендерметрия) => Тема начата: sungreen от 27 Февраль 2012, 19:16:01

Название: Blender и фрактал Серпинского
Отправлено: sungreen от 27 Февраль 2012, 19:16:01
Треугольник Серпинского — фрактал, один из двумерных аналогов множества Кантора предложенный польским математиком Серпинским в 1915 году. Также известен как «решётка» или «салфетка» Серпинского.

Суть наглядно можно представить из рисунка.
(http://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/SierpinskiTriangle.PNG/220px-SierpinskiTriangle.PNG)

Вот такой код делает данный рисунок в 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()


[вложение удалено Администратором]
Название: Re: Blender и фрактал Серпинского
Отправлено: sungreen от 24 Февраль 2015, 05:21:09
... а почему только один из двумерных аналогов, пусть будет и 3D фрактал Серпинского ...

(http://content-25.foto.my.mail.ru/mail/unixinfo/_myphoto/s-731.png)

... вот код скрипта ...
... для перехода из 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()

[вложение удалено Администратором]
Название: Re: Blender и фрактал Серпинского
Отправлено: sungreen от 08 Январь 2017, 17:51:04
... фантазии на тему "фрактальное дерево" ...
(https://content-22.foto.my.mail.ru/mail/unixinfo/717/b-950.png)

Код: 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()
Название: Re: Blender и фрактал Серпинского
Отправлено: Николай Николаев от 11 Апрель 2020, 20:10:38
... Для версии 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()
Название: Re: Blender и фрактал Серпинского
Отправлено: sungreen от 25 Ноябрь 2023, 14:29:23
забавное видео про треугольник серпинского https://www.youtube.com/watch?v=-a_iyHtAkew (https://www.youtube.com/watch?v=-a_iyHtAkew)
Название: Re: Blender и фрактал Серпинского
Отправлено: Samovar от 30 Ноябрь 2023, 08:47:36
забавное видео про треугольник серпинского https://www.youtube.com/watch?v=-a_iyHtAkew (https://www.youtube.com/watch?v=-a_iyHtAkew)

Благодарю за ссылку. Очень интересно!

В копилку:
ВВС: История математики (4 серии)
https://www.youtube.com/playlist?list=PLjgAy-o1xYoLklqU3tkpeS-qqanOwNY-1 (https://www.youtube.com/playlist?list=PLjgAy-o1xYoLklqU3tkpeS-qqanOwNY-1)
Название: Re: Blender и фрактал Серпинского
Отправлено: sungreen от 30 Ноябрь 2023, 08:57:07
забавное видео про треугольник серпинского https://www.youtube.com/watch?v=-a_iyHtAkew (https://www.youtube.com/watch?v=-a_iyHtAkew)

Благодарю за ссылку. Очень интересно!

В копилку:
ВВС: История математики (4 серии)
https://www.youtube.com/playlist?list=PLjgAy-o1xYoLklqU3tkpeS-qqanOwNY-1 (https://www.youtube.com/playlist?list=PLjgAy-o1xYoLklqU3tkpeS-qqanOwNY-1)

алаверды