/*https://editor.p5js.org/p5/sketches/Interaction:_kaleidoscope
* @name Kaleidoscope
* @description A kaleidoscope is an optical instrument with two or more reflecting surfaces tilted to each other in an angle. This example tries to replicate the behavior of a kaleidoscope. Set the number of reflections at the symmetry variable and start drawing on the screen. Adjust the brush size with the help of the slider. The clear screen as it says clears the screen. The save button will download a .jpg file of the art that you have created.
*/
AB.removeRunHeader(); // div in foreground interferes with slider elements
// Symmetry corresponding to the number of reflections. Change the number for different number of reflections
let symmetry = 6;
let angle = 360 / symmetry;
let saveButton, clearButton, mouseButton, keyboardButton;
let slider;
function setup() {
createCanvas(710, 710);
angleMode(DEGREES);
background(127);
// Creating the save button for the file
saveButton = createButton('save');
saveButton.mousePressed(saveFile);
// Creating the clear screen button
clearButton = createButton('clear');
clearButton.mousePressed(clearScreen);
// Creating the button for Full Screen
fullscreenButton = createButton('Full Screen');
fullscreenButton.mousePressed(screenFull);
// Setting up the slider for the thickness of the brush
brushSizeSlider = createButton('Brush Size Slider');
sizeSlider = createSlider(1, 32, 4, 0.1);
}
// Save File Function
function saveFile() {
save('design.jpg');
}
// Clear Screen function
function clearScreen() {
background(127);
}
// Full Screen Function
function screenFull() {
let fs = fullscreen();
fullscreen(!fs);
}
function draw() {
translate(width / 2, height / 2);
if (mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) {
let mx = mouseX - width / 2;
let my = mouseY - height / 2;
let pmx = pmouseX - width / 2;
let pmy = pmouseY - height / 2;
if (mouseIsPressed) {
for (let i = 0; i < symmetry; i++) {
rotate(angle);
let sw = sizeSlider.value();
strokeWeight(sw);
line(mx, my, pmx, pmy);
push();
scale(1, -1);
line(mx, my, pmx, pmy);
pop();
}
}
}
}