Автор Тема: Blender и фрактал Серпинского  (Прочитано 8223 раз)

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Blender и фрактал Серпинского
« : 27 Февраль 2012, 19:16:01 »
Треугольник Серпинского — фрактал, один из двумерных аналогов множества Кантора предложенный польским математиком Серпинским в 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

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: Blender и фрактал Серпинского
« Ответ #1 : 24 Февраль 2015, 05:21:09 »
... а почему только один из двумерных аналогов, пусть будет и 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()

[вложение удалено Администратором]
« Последнее редактирование: 24 Февраль 2015, 07:27:42 от sungreen »
Для Кота

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: Blender и фрактал Серпинского
« Ответ #2 : 08 Январь 2017, 17:51:04 »
... фантазии на тему "фрактальное дерево" ...


Код: 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()
Для Кота

Оффлайн Николай Николаев

  • Житель
  • emerge --keep-going
Re: Blender и фрактал Серпинского
« Ответ #3 : 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()

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: Blender и фрактал Серпинского
« Ответ #4 : 25 Ноябрь 2023, 14:29:23 »
забавное видео про треугольник серпинского https://www.youtube.com/watch?v=-a_iyHtAkew
Для Кота

Оффлайн Samovar

  • Житель
Re: Blender и фрактал Серпинского
« Ответ #5 : 30 Ноябрь 2023, 08:47:36 »
забавное видео про треугольник серпинского https://www.youtube.com/watch?v=-a_iyHtAkew

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

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

Оффлайн sungreen

  • ...
  • Житель
  • Kostroma mon amour
    • sungreen.github.io
Re: Blender и фрактал Серпинского
« Ответ #6 : 30 Ноябрь 2023, 08:57:07 »
забавное видео про треугольник серпинского https://www.youtube.com/watch?v=-a_iyHtAkew

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

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

алаверды
Для Кота

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 68
Автор: LEXA ANЭGROWND
blender.png
Скачано: 78
Автор: ipv2007
4.png
Скачано: 100
Автор: hiroyukiss
2.png
Скачано: 122
Автор: hiroyukiss

Скачано: 112
Автор: Dilifa12