Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Невелике розчарування

with 12 comments

Все вийшло, та вийшло трохи не так як я планував. Далось в знаки те, що Python – інтерпретована мова. Я заледве за 15-20 хвилин (точно не засікав) досяг колишніх результатів:

Старі знайомі тори

Старі знайомі тори


Мій комп’ютер під час генерації мешу став вогнедишним. Зараз навіть набирати текст жарко. Процесор десь напевне в районі клавіш “234wer”. Але це далеко не дотягує до тих результатів що я колись публікував. Там всього якихось 5 мільйонів вокселів.

Формули що я опублікував виявились неправильні. Я їх не тестував. Насправді там був певний набір вкладених функцій:

def thorus(x,y,z,r,R):
	return (sqrt(x*x+y*y) - R)**2 + z*z < r*r

def thoruses(x,y,z):
	return thorus(x,y,z,0.1,0.3) or thorus(x+0.3,z,y,0.1,0.3)

def someshit(x,y,z):
	return thoruses(x*y,y*z,z*x)

Ось так. Чому тоді було швидше? Може тому, що в STL швидші структури даних (сумнівна перевага), або тому, що вказані вище функції були компільовані.

Тепер думаю як оптимізувати? Напевне треба для початку замінити деякі списки на кортежі. Бо трохи не люблю кортежі через їх незмінність. Але тримати константи – списки – трохи тупо з мого боку.

І взагалі, той пітонівський код що я пишу, можна рефакторити нескінченно. Особливо мене вразило оце:

#	 import copy 
#	 vertex=copy.copy(vertex_by_edge[v]) 
#	 vertex[0]=vertex[0]*resolution+x 
#	 vertex[1]=vertex[1]*resolution+y 
#	 vertex[2]=vertex[2]*resolution+z 
#	 f.append(tuple(vertex)) 

#Lets try some optimization 
vert=vertex_by_edge[v] 
f.append( (vert[0]*resolution+x,vert[1]*resolution+y,vert[2]*resolution+z) )

І той факт що я спростив алгоритм “marching cubes” теж трохи розчаровує:

Купа трикутників

Купа трикутників


Але виглядає так собі

Але виглядає так собі

Особливо через те, що різних розташувань площини грані в просторі всього (6+12+8)/2=13. І того результат далекий від сфери:

Якісь дивні сходинки

Якісь дивні сходинки

Тому, певне доведеться зробити ще один вкладений цикл, в якому зміщувати вершини вздовж ребер гранки, бінарним пошуком підсуваючи їх до поверхні. Думаю разів десять буде достатньо.

Якщо б ви теж хотіли погратись з блендером, та допомогти мені тестуванням скрипта, чи порадами – останню версію я буду тримати тут.

А про те, як встановити скрипт, я навіть записав маленьке відео:

Advertisements

Written by bunyk

Травень 8, 2010 at 15:24

Оприлюднено в Графіка, Кодерство

Tagged with , ,

Відповідей: 12

Subscribe to comments with RSS.

  1. Ти, мабуть, читав про JIT в пітоні -> http://habrahabr.ru/blogs/python/87364/

    А раптом?

    danbst

    Травень 8, 2010 at 19:36

  2. Танунахтреба той новий пітон, якщо можна написати новий скрипт:

    приблизно двадцять хвилин.

    Ну, просто ідеально.

    bunyk

    Травень 8, 2010 at 23:16

  3. Все ж таки, я не такий поганий програміст, як інколи думаю.

    Це явно треба опублікувати десь в англомовній спільноті. Треба лиш вияснити де.

    bunyk

    Травень 8, 2010 at 23:22

  4. Слух, може спробуєш тривимірні фрактали малювати? =)

    danbst

    Травень 9, 2010 at 15:29

  5. bunyk

    Травень 13, 2010 at 19:49

  6. Ти напиши функцію для фрактала виду f(x,y,z) -> bool, тоді може я як лабу по паралельному програмуванні напишу програму її табуляції для кластера.

    bunyk

    Травень 13, 2010 at 19:51

    • def Mandel2D(x0, y0, z0, howLongComputePoints, fractalZwidth):
      
      	# типу шоб він був худенький і плоскенький
      	if z0  fractalZwidth:
      		return False
      
      	# комп у тебе слабенький, тому я його трошки пожалію
      	q = (x-1/4)**2 + y**2
      	if q*(q+(x-1/4)) < y**2/4 || (x+1)**2+y**2 < 1/16:
      		return True
      
      	x, y, iter = 0, 0, 0
      	xtemp = 0
      	
      	while x*x + y*y <= (2*2) &&  iter < howLongComputePoints:
      		xtemp = x*x - y*y + x0
      		y = 2*x*y + y0
      		x = xtemp
      		iter += 1
      	
      	if iter == howLongComputePoints:
      		return True
      	else:
      		return False
      

      danbst

      Травень 13, 2010 at 21:13

  7. А. Треба навчитись робити анімації в Блендері.

    Тоді можна буде додати ще параметр часу, і взагалі цікаві відео:

    Ну, і звісно прочитати статтю про цю Мандельбульку.

    bunyk

    Травень 13, 2010 at 20:05

  8. О чувак. Ти відповів поки мій останній коментар сидів у спамокарцері (за зловживання ютубом), а я читав про гіперкомплексну ітерацію Мандельбульки, і дивився цікаві фільми.

    Став собі Блендер, і почувай себе тут як вдома.

    bunyk

    Травень 13, 2010 at 21:37

    • Можливо поставлю, але після сесії. зараз часу немає займатись прекрасними справами ))

      а ось про гіперкомплексну ….

      {x,y,z}^n = r^n { sin(theta*n) * cos(phi*n) , sin(theta*n) * sin(phi*n) , cos(theta*n) }
      …where:
      r = sqrt(x^2 + y^2 + z^2)
      theta = atan2( sqrt(x^2+y^2), z )
      phi = atan2(y,x)

      And the addition term in z -> z^n + c is similar to standard complex addition, and is simply defined by:

      {x,y,z}+{a,b,c} = {x+a, y+b, z+c}

      The rest of the algorithm is similar to the 2D Mandelbrot!

      Here is some pseudo code of the above:

      r = sqrt(x*x + y*y + z*z )
      theta = atan2(sqrt(x*x + y*y) , z)
      phi = atan2(y,x)

      newx = r^n * sin(theta*n) * cos(phi*n)
      newy = r^n * sin(theta*n) * sin(phi*n)
      newz = r^n * cos(theta*n)

      …where n is the order of the 3D Mandelbulb. Use n=8 to find the exact object in this article.

      danbst

      Травень 13, 2010 at 21:50

      • Як я вас розумію… 🙂

        Ну, так, я якраз про це читав на вікіпедії. Хоча не можу вияснити що ти цитуєш.

        bunyk

        Травень 13, 2010 at 22:26

  9. Ну, а я спробую твою функцію в себе. До речі, дуже за неї дякую. Може я буду мати ще прекрасніші картинки, і ніхто не зверне уваги, що в мене як код, так і курсова геть неграмотні.

    bunyk

    Травень 13, 2010 at 21:41


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: