#!/usr/bin/python
# -*- coding: utf-8 -*-   ## Baustelle: MUSS 1. oder 2. Zeile sein
# name mb_multiprocessing          # MRies, 09/2015
 
__author__ = 'ries'

import numpy as np 
import matplotlib.pyplot as plt
import multiprocessing

def mb_iteration(x, y):
	c = complex(x,y)      # x+yj
	z = 0+0j
	for iteration in range(255):
		z = z*z + c
		if abs( z ) >= 2:
			return  iteration 
	return 255
	
def mb_matrix_t(x_min, x_max, y_min, y_max, bild, procs, p_nr):
	zeilen_zahl  = bild.shape[0]
	spalten_zahl = bild.shape[1]
	delta_x = (x_max - x_min) / spalten_zahl
	delta_y = (y_max - y_min) / zeilen_zahl
	zeilen_start = p_nr  * zeilen_zahl/procs 
	zeilen_ende  = zeilen_start + zeilen_zahl/procs
	for zeile_i in range(zeilen_start, zeilen_ende):
		y_pix = y_min + zeile_i * delta_y
		for spalte_j in range(spalten_zahl):      # Teilen ueber die zeilen wg python
			x_pix = x_min + spalte_j * delta_x    # fortran besser spaltenbloecke
			bild[(zeilen_zahl-1)-zeile_i, spalte_j] = \
				 mb_iteration(x_pix, y_pix)       # bild auf dem Kopf
	return bild

if __name__ == '__main__':
	bild = np.zeros((400, 400), dtype=np.uint8) # 400 400

	procs = 4
	pool = multiprocessing.Pool(processes = procs)
	results = [ pool.apply_async(mb_matrix_t, \
		#args = (-2.0, 1.0, -2.0,1.5, bild, \
		args = (-0.088, -0.085, 0.855, 0.858, bild, \
		procs,p_nr) ) for p_nr in range(procs) ]
	pool.close()
	pool.join()
	bb = [ p.get() for p in results ] 
	bild = bb[0] #  np.zeros((400, 400), dtype=np.uint8)
	for i in range(1, procs):
		bild = bild + bb[i]  # besser: einzelne Zeilen-Scheiben 

	plt.imshow(bild)  
	plt.jet() # jet() # hsv() # hot() # gray()                     
	plt.show()