Concept: I wanted to create a view of my home country, Bangladesh, which is filled with. hundreds of rivers, and with time the rivers are shrinking. So, I used this assignment to create something that represents the rivers from Bangladesh in a sunset light.
Code:
I’m particularly proud of the FluidSimulation and FlowingMotif parts of my code because they exemplify a thoughtful blend of creativity and technical skill. The FluidSimulation class captures the essence of fluid dynamics with its elegant use of vectors and noise functions to simulate realistic flow patterns. The display() method, with its precise rendering of flow lines, transforms abstract concepts into a visually engaging experience. This method doesn’t just draw; it visually narrates the movement of fluid in a way that is both aesthetically pleasing and scientifically intriguing.
Similarly, the getForceAt() method provides a crucial interface for interaction with the fluid simulation, enabling dynamic elements like particles to seamlessly integrate with the simulated environment. This capability is pivotal in creating a responsive and immersive visual experience.
The FlowingMotif class adds a touch of artistic flair to the simulation. By using dynamic shapes that evolve over time, it introduces an additional layer of visual interest and complexity. The carefully crafted constructor ensures that each motif is unique, with properties that allow for smooth and captivating motion. The motifs enhance the overall aesthetic of the simulation, bringing a sense of life and movement to the scene.
display() { noFill(); strokeWeight(1); for (let y = 0; y < this.rows; y++) { for (let x = 0; x < this.cols; x++) { let v = this.field[y][x]; let px = x * this.gridSize; let py = y * this.gridSize; stroke(255, 100); line(px, py, px + v.x * this.gridSize, py + v.y * this.gridSize); } } } getForceAt(x, y) { let col = floor(x / this.gridSize); let row = floor(y / this.gridSize); col = constrain(col, 0, this.cols - 1); row = constrain(row, 0, this.rows - 1); return this.field[row][col].copy(); } } // FlowingMotif class definition class FlowingMotif { constructor(x, y, size) { this.x = x; this.y = y; this.size = size; this.angleOffset = random(TWO_PI); this.frequency = random(0.01, 0.05); }
P5.js Sketch: