Я работаю над созданием трехмерного папоротника Барнсли, я получил его, но он требует слишком много итераций, поэтому он очень медленный. Я пытался реализовать мультипроцессорное решение, но я не знаю, как я могу объединить графики. Прямо сейчас он показывает несколько графиков. Можете ли вы дать мне какой-нибудь совет, как это сделать? вот мой код:
import numpy as np
import matplotlib.pyplot as plt
import os
from mpl_toolkits.mplot3d import Axes3D
from multiprocessing import Process
import dill
import pickle
f11 = [0.00, 0.00, 0.01, 0.00, 0.26, 0.00, 0.00, 0.00, 0.05, 0.00, 0.00, 0.00]
f21 = [0.20, -0.26, -0.01, 0.23, 0.22, -0.07, 0.07, 0.00, 0.24, 0.00, 0.80, 0.00]
f31 = [-0.25, 0.28, 0.01, 0.26, 0.24, -0.07, 0.07, 0.00, 0.24, 0.00, 0.22, 0.00]
f41 = [0.85, 0.04, -0.01, -0.04, 0.85, 0.09, 0.00, 0.08, 0.84, 0.00, 0.80, 0.00]
f12 = [0.05, 0.00, 0.00, 0.00, 0.60, 0.00, 0.00, 0.00, 0.05, 0.00, 0.00, 0.00]
f22 = [0.45, -0.22, 0.22, 0.22, 0.45, 0.22, -0.22, 0.22, -0.45, 0.00, 1.00, 0.00]
f32 = [-0.45, 0.22, -0.22, 0.22, 0.45, 0.22, 0.22, -0.22, 0.45, 0.00, 1.25, 0.00]
f42 = [0.49, -0.08, 0.08, 0.08, 0.49, 0.08, 0.08, -0.08, 0.49, 0.00, 2.00, 0.00]
x = [0]
y = [0]
z = [0]
def f(f,x,y,z):
val1,val2,val3 = (f[0] * x + f[1] * y + f[2] * z, f[3] * x + f[4] * y + f[5] * z + f[10],
f[6] * x + f[7] * y + f[8] * z)
return val1,val2,val3
def plotFern(iters,x,y,z):
fig = plt.figure(1)
ax = plt.axes(projection='3d')
xx,yy,zz = [],[],[]
for i in range(iters):
ran = np.random.rand(1)
if ran <=0.01:
x,y,z = f(f11,x,y,z)
if ran > 0.01 and ran <= 0.08:
x, y, z = f(f21, x, y, z)
if ran > 0.08 and ran <= 0.93:
x, y, z = f(f31, x, y, z)
if ran > 0.93 and ran <= 1:
x, y, z = f(f41, x, y, z)
xx.append(x)
yy.append(y)
zz.append(z)
print(xx,yy,zz)
ax.scatter3D(xx, yy, zz, s=0.9, edgecolor='green')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
plt.show(block=True)
if __name__ == '__main__':
iter = 100000
width, height = 300, 300
aimg = np.zeros((width, height))
x, y, z = 0, 0, 0
processes = []
#plotFern(iter, x, y, z)
for i in range(os.cpu_count()):
processes.append(Process(target=plotFern, args=(iter, x, y, z,)))
for process in processes:
process.start()
for process in processes:
process.join()