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

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн 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()
Для Кота

 

* По форуму

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

Sizes.jpg
Скачано: 6
Автор: Dmi3ryd
paticles.jpg
Скачано: 3
Автор: Dmi3ryd
Снимок 1.PNG
Скачано: 3
Автор: atmk
Снимок.PNG
Скачано: 3
Автор: atmk
Screw.jpg
Скачано: 6
Автор: Dmi3ryd