# coding: utf-8 import numpy as np import field import filtering import cv2 width = 640 height = 480 kernel_radius = 50 kernel_hole = 10 threshold = 1000 bclick_radius = 50 wclick_radius = 50 ca = np.zeros((height, width), np.float) zero_circle_pos = None one_circle_pos = None def set_threshold(x): global threshold threshold = x def set_bclick_radius(x): global bclick_radius bclick_radius = x def set_wclick_radius(x): global wclick_radius wclick_radius = x def on_click(event, x, y, flags, param): global ca global zero_circle_pos global one_circle_pos if event == cv2.EVENT_LBUTTONDBLCLK: one_circle_pos = (x,y) elif event == cv2.EVENT_RBUTTONDBLCLK: zero_circle_pos = (x,y) elif event == cv2.EVENT_LBUTTONDOWN: one_circle_pos = None elif event == cv2.EVENT_RBUTTONDOWN: zero_circle_pos = None elif event == cv2.EVENT_MBUTTONDOWN: ca = field.set_noise(ca, 1, 0, 1) kernel = np.ones((), dtype=float) kernel_size = 2*kernel_radius + 1 kernel = np.zeros((kernel_size,kernel_size), dtype=float) cv2.circle(kernel, (kernel_radius, kernel_radius), kernel_radius, 1, -1) cv2.circle(kernel, (kernel_radius, kernel_radius), kernel_hole, 0, -1) summator = filtering.Convolution(kernel, (height, width)) cv2.namedWindow('Turing instabilities') cv2.namedWindow('Kernel') cv2.createTrackbar('threshold', 'Turing instabilities', threshold, 6000, set_threshold ) cv2.createTrackbar('white click radius','Turing instabilities', wclick_radius, 500, set_wclick_radius) cv2.createTrackbar('black click radius','Turing instabilities', bclick_radius, 500, set_bclick_radius) cv2.setMouseCallback('Turing instabilities',on_click) ca = field.set_noise(ca, 1, 0, 1) cv2.imshow('Turing instabilities', ca) cv2.imshow('Kernel', kernel) cv2.waitKey(1000) do_computation = False print print('press to toggle computation, ESC to abort') print while True: if do_computation : surround = summator(ca) ca[surround > threshold] -= .1 ca[surround < threshold] += .1 ca = field.add_noise(ca, .1, 0, .1) ca = np.clip(ca, 0., 1.) if zero_circle_pos is not None : cv2.circle(ca, zero_circle_pos, bclick_radius, 0, -1) if one_circle_pos is not None : cv2.circle(ca, one_circle_pos, wclick_radius, 1, -1) cv2.imshow('Turing instabilities', ca) key = cv2.waitKey(10) & 0xFF if key is 27: break; elif key is 32: do_computation = not do_computation