Pull to refresh

Comments 31

Шикарно! Попробую перетолмачить это на Lua для движка Instead. Спасибо!
Добрый день. А вы можете пояснить почему собираетесь использовать Instead, а не Love2d?
Потому, что мне нравится API этого движка, а Love2d — скорее фреймворк для написания поверх него своего движка. В Instead можно без мороки раскидать визуализации по разным комнатам или объектам и получить удобное меню для навигации. Дополнить текстовыми пояснениями, если надо. Кроме того, у Instead есть репозиторий, куда можно будет эту программу выложить и она точно не затеряется среди всех этих сотен энтертейнмента на итче, стиме, гоге и т.д.
Класс! Немного покопался и смог нарисовать аттрактор Aizawa. Спасибо автору за статью!
image
Не подскажите как вы сделали анимацию?
Вращаю камеру вокруг оси Z и с помощью imageio генерирую серию изображений, в конце объединяю изображения в видео.
Есть еще такая программулина как «Chaoscope», можно подглядеть режимы визуализации, для еще более красивых картинок.
Да, занимательная программа. У моей визуализации есть большой минус, который портит все впечатление — приходится каждый раз возвращаться в код, что бы изменить какой-нибудь параметр. Можно добавить виджетов и сделать интерфейс подобный «Chaoscope». Даже не знаю почему мне эта идея не пришла раньше. Но, насколько я помню, в «Chaoscope» изображение является статичным, а в Plotly его можно «вертеть» — мне это очень сильно понравилось.

Arneodo Attractor:
image
image
image
image
Там в chaoscope, кроме слайдеров, ещё можно рендерить результат с повышенным качеством:


Медленно, правда, он рендерит.
Да, нельзя + он уже 10-ть лет, как не разрабатывается, но ведь ничто не мешает взять лучшее)
Боже мой, это великолепно! Спасибо, за то, что напомнили об этом мире. (удивительном мире и самой поэзии математики)

Как бы хотелось иметь как минимум ещё одну жизнь, что бы посветить её познанию именно её (математики) безграничных горизонтов!
Она потрясающа!

Спасибо!
Да, математикой можно наслаждаться. Даже не помню, когда в последний раз смотрел какой-нибудь фильм или сериал. Все свободное время — это музыка, крепкий чай и математика.
* Подавил в себе желание написать что-то цинично-ядовитое, про любителей и про карьеру профессионалов. * I wish you luck, man.
В школе на спеки рисовал подобные вещи. Вот бы тому мне из прошлого тысячелетия рассказать, что оказывается это были аттракторы. Был бы отличный эффект бабочки.
Да, в Google Colaboratory все уже установлено — можно с ходу начинать работать. Я как-то забыл об этом. Спасибо, что напомнили.
В дополнение можно сказать, что такой код при запуске не требует подтверждения аккаунта.
Включил и нарисовало.
Еще можно:
%pip install numpy-stl
%pip install plotly --upgrade

И еще есть список на несколько листов, что можно установить.

Если данные записывать на облачный диск, тогда пару раз в день может потребовать подтверждения аккаунта.
Я когда Google Colaboratory первый раз увидел, впал в небольшой ступор. До сих пор кажется невероятным, что кто-то может вот просто-так подарить какие-то мощности для вычислений.

А когда сработал
import numba
я впал в ступор во второй раз (ничего про бесплатные GPU и TPU я тогда еще не знал).

Определенно хорошая штука. Можно работать на двух машинах, что иногда бывает ну ооочень как надо.
Я как раз такое задание давал на экзамене, только мы делали сетку начальных условий и со слайдерами.

Видео: www.youtube.com/watch?v=B9-sxUs-3wo.
Тоже питон, но не в браузере: pyqt, pyqtgraph, numba.
Вашим студентам повезло с преподавателем.
Спасибо, это студенты меня вдохновляют! Бывает, дашь им старую, изученную со всех сторон задачу из учебника – а они возьмут и решат её лучше, чем в учебнике )

Рис  Семейство из пяти аттракторов

Чтобы отобразить семейство из пяти аттракторов, позволил себе немного изменить код, и сразу хочется выразить благодарности автору за хороший код для вхождения в тему:
import numpy as np
from scipy.integrate import odeint
import plotly.graph_objects as go


##################################
###  РЕШАЕМ СИСТЕМУ УРАВНЕНИЙ  ###
##################################

# Система уравнений:
def LorenzMod1(XYZ, t, alpha, beta, xi, delta):
    x, y, z = XYZ
    x_dt = -alpha*x + y*y - z*z + alpha*xi
    y_dt = x*(y - beta*z) + delta
    z_dt = -z + x*(beta*y + z)
    return x_dt, y_dt, z_dt

# Параметры системы и начальные условия:
alpha = 0.1
beta = 4
xi = 14
delta = 0.08



#1111111111111111111111111111111
x_0, y_0, z_0 = 0, 1, 0
print ("1")


# Максимальное время и общее количество
# временных точек:
tmax, n = 100, 40000

# Интегрируем систему уравнений в каждой точке
# временного интервала t:

t = np.linspace(0, tmax, n)
c = np.linspace(0, 1, n)



f = odeint(LorenzMod1, (x_0, y_0, z_0),t,  args=(alpha, beta, xi, delta))
X, Y, Z = f.T

# Параметры системы и начальные условия:
alpha = 0.1
beta = 4
xi = 14
delta = 0.08
#111111111111111111111111111111111111111111111111111111111111111111111






#2222222222222222222222
for ii in range(100001,100005,1):

    i=ii/100000.0
    print (i)
    x_0, y_0, z_0 = 0, i, 0

    # Максимальное время и общее количество
    # временных точек:
    tmax, n = 100, 40000

    # Интегрируем систему уравнений в каждой точке
    # временного интервала t:
    t = np.linspace(0, tmax, n)
    c1 = np.linspace(0, 1, n)


    f = odeint(LorenzMod1, (x_0, y_0, z_0),t,  args=(alpha, beta, xi, delta))
    X1, Y1, Z1 = f.T

  
    X=np.hstack((X1, X))    
    Y=np.hstack((Y1, Y))    
    Z=np.hstack((Z1, Z))    
    c=np.hstack((c1, c))    
#22222222222222222222222222222222222222222222222222222222222222222222
  




#######################
###  ВИЗУАЛИЗИРУЕМ  ###
#######################

# Массив, отвечающий за изменение цвета:


                                            #c = np.linspace(0, 1, len(X))

# Готовим данные для отрисовки:
DATA = go.Scatter3d(x=X, y=Y, z=Z,
                    line=dict(color= c,
                              width=3,
                              # Выбираем цветовую палитру:
                              # Greys,YlGnBu,Greens,YlOrRd,Bluered,RdBu,
                              # Reds,Blues,Picnic,Rainbow,Portland,Jet,
                              # Hot,Blackbody,Earth,Electric,Viridis,Cividis.
                              colorscale="Cividis"),
                    #  Рисуем только линии:
                    mode='lines')

fig = go.Figure(data=DATA)    

# Задаем параметры отрисовки:
fig.update_layout(width=1000, height=1000,
                  margin=dict(r=10, l=10, b=10, t=10),
                  # Устанавливаем цвет фона:
                  paper_bgcolor='rgb(0,0,0)',
                  scene=dict(camera=dict(up=dict(x=0, y=0, z=1),
                                         eye=dict(x=0, y=1, z=1)),
                             # Устанавливаем пропорциональное
                             # соотношение осей друг к другу:
                             aspectratio = dict(x=1, y=1, z=1),
                             # Отображаем, как указано в "aspectratio"
                             aspectmode = 'manual',
                             # Скрываем оси:
                             xaxis=dict(visible=False),
                             yaxis=dict(visible=False),
                             zaxis=dict(visible=False)
                            )
                 )

######################
#!!  ВОСТОРГАЕМСЯ  !!#
######################

fig.show()

Как уже говорили выше, все считается быстро, а отображается медленно.

Аналогичная проблема существует в отображении файлов формата STL, Выходом может быть сокращение входной информации перед отображением — это сечения. Для формата STL в сечении получатся отрезки в треугольниках, а в аттракторах, это будут точки и поэтому нужно много точек, которые в сечении уже можно соединить. В данном случае это будут семейство кривых по пяти точкам. И это в другой форме будет отражать решение системы уравнений. 

Когда нужны подробности, сразу ищем карту с линиями уровня, или томограмму. Сечения это как аналог, и карты, и томограммы.


Рис   Пример вывода сечений для формата STL 

 
.    

Отображать по несколько аттракторов — очень интересная идея. Есть все шансы (без всякой иронии) получить изображения на грани высокого искусства. Одни товарищи уже напечатали такое на бумаге формата А3 и кому-то подарили.

А отображается и правда медленно. Спасибо что разъяснили почему так происходит. Я думал, что все медленно считается и уже было серьезно подумывал о покупке нового компьютера.
Вот такой вопрос возник — можно ли как-то преобразовать треки аттракторов в поверхности? Ну, например, с помошью реймаршинга и SDF-функций?
Я думаю — можно. Правда не знаю как, но используя NumPy и SciPy мне кажется все это получится сделать без всяких лишних танцев с бубном. А Plotly, кстати, очень качественно такие поверхности может отобразить.
Хорошо строятся поверхности типа колокола (без складок ), и на регулярных данных, когда соседние образующие линии имеют одинаковое количество точек и еще есть точка начала линии.

Если со складками, соседние образующие линии должны быть близко расположены.

Как раз в семействе аттракторов можно провести линии близко друг другу. И дальше может помочь формат STL. Берем две соседние линии, на каждой линии по две точки. По четырем точкам можно построить два треугольника, это и есть формат STL.

solid 
   facet normal 0.000000e+000 -9.144431e-001 4.047146e-001
      outer loop
         vertex 2.350000e+001 -1.070718e-001 1.283354e-001
         vertex 2.425000e+001 -1.070718e-001 1.283354e-001
         vertex 2.350000e+001 9.528544e-002 5.855569e-001
      endloop
   endfacet
   facet normal 0.000000e+000 -9.144431e-001 4.047146e-001
      outer loop
         vertex 2.425000e+001 9.528544e-002 5.855569e-001
         vertex 2.350000e+001 9.528544e-002 5.855569e-001
         vertex 2.425000e+001 -1.070718e-001 1.283354e-001
      endloop
   endfacet


Это и есть два треугольника.
В каждой строчке по точке

При просмотре файла, для отображения объема, берут данные нормалей из формата или нормали считают сами программы. Есть и цветные STL.

При отображении поверхности можно задать прозрачность и отобразить только видимые поверхности.

Если поверхность STL полностью замкнута, тогда программы могут рассматривать поверхность как тело и взять то же сечение, только с ограничениями по количеству треугольников. У разных программ это разные цифры.

Еще есть порядок записи точек в треугольнике, это как направление обхода точек треугольника. При отображении свет будет по разному отражаться от таких треугольников, если один треугольник светлый, второй темный, хотя треугольники расположены рядом.

Sign up to leave a comment.

Articles

Change theme settings