Week 3- Reading Reflection

“The Art of Interactive Design” by Chris Crawford

Chris Crawford raises the issue of the ambiguity and overuse of the term “interactivity” in “The Art of Interactive Design”. Although I have never thought about the meaning of the word and intuitively identified the products as highly interactive, this article was the ‘wow’ moment for me, making the clear distinguishment between interaction and reaction. 

During the class, Professor Michael Ang told an interesting debate between the artists and the interactive media designers about whether the drawings are interactive or not. The artists’ argued, claiming that the artworks interact with the audience by making them think about the meaning and interpretation to which designers have their own opposing claim. Although before, I was closer to the artists’ perspective, after reading the text, I absolutely support Chris Crawford’s point of view. It is for sure the paintings make the people think, but nothing more. According to the author, in order to have the interaction, three components should be well delivered from BOTH sides such as listening, thinking, and speaking, or in professional terms, input, process, and output. In this case, the audience has the input as seeing the painting and process as thinking and interpretation of the painting. Of course, the viewer can comment orally but the painting is not going to either listen, think, or respond to you. Hence, there is no mutual interaction. Because of this, the response of the viewer is no more than a reaction, which cannot turn into interaction. These thoughts came to my mind, forming my perspective on the definition of interactivity. 

After distinguishing the interaction from the reaction, another question was raised in my head is there a quantitative way to distinguish the level of interaction? Although the author touched on this topic, he didn’t consider that in-depth. Consequently, I am interested in whether this level of interaction is subjective, whether it depends on the time and space as well as the age of the person interacting with. Additionally, should the interaction be connected with the person to be considered as the interaction or can the interaction between machines and AIs be considered an interaction too? 

Week 3 – Generative Art Work

For this assignment, I decided to create a simple demonstration of a mandala. I used only three shapes of small, big circles and rectangles; which rotate around the center, forming a visual pattern.

A mandala is a geometric pattern that holds deep symbolic and spiritual significance in various cultures around the world. It often represents unity, harmony, and the balance of elements. In my work, I tried to capture the essence of a mandala by creating a dynamic composition of shapes that radiate from the center, reminiscent of the sun.

Compared to my previous coding assignments, this time I had fewer issues. However, I found it challenging to implement the rotation drawing for the shapes. I used the “translation” function to establish the center of the screen as the point around which the shapes would rotate. This function moves the rotating point to the desired center position. Next, I computed the angles of rotation using the “map” function, based on each shape’s index within the array of shapes. These angles of rotation were then used in the “rotation” function, for shapes to spin around the central point.

let angle = map(this.index, 0, shapes.length / 3, 0, TWO_PI); // Calculate the angle for rotation
let x = cos(angle) * this.radius;
let y = sin(angle) * this.radius;

push(); 
translate(x, y); 
rotate(angle); // Rotate based on the angle

In the future, I would like to try to use more shapes like triangles and spirals to create visual variety. I think expanding the color choices with gradients and dynamic color changes will make the artwork more visually appealing.

Week 3 -generative art – Spider Web

Overview:

This generative artwork presented offers a captivating and visually arresting experience, drawing its inspiration from the intricate artistry of spiderwebs. This particular art form masterfully intertwines mathematical precision with creative expression, resulting in mesmerizing patterns reminiscent of mandalas, evolving dynamically over time. Every element of these generative artworks, from the layers’ count to the rotation speed, is meticulously orchestrated to echo the delicate allure and balance found in the natural craftsmanship of spiderwebs. As the code operates, it produces an intriguing array of designs that unveil the seamless fusion between technology and the natural world, inviting observers to admire the intricacy and grace of both the digital and organic realms.

Embedded sketch:

A highlight of code that i am proud of:

I am so proud that I utilized classes. The incorporation of structured classes within the provided code serves as a means to methodically encapsulate and administer the distinct properties and operations governing the formation of mandala-like patterns. Each instance of the Mandala class symbolizes an independent mandala, wherein the class’s constructor initializes the mandala’s specific attributes. The update() function oversees the manipulation of its state, such as rotation, while the display() function manages the visual rendering of the mandala’s complex layers. Employing classes contributes to code organization, reusability, and the effortless creation of diverse and unique mandalas. This approach enhances the code’s structural integrity, facilitating readability and maintainability without arousing the attention of automated systems.

class Mandala {  // Define a class called 'Mandala' to create and manipulate mandala objects.
  constructor(x, y, radius, numLayers, speed) {  // Constructor function for 'Mandala' objects.
    this.x = x;  // Initialize the x-coordinate of the mandala's center.
    this.y = y;  // Initialize the y-coordinate of the mandala's center.
    this.radius = radius;  // Initialize the mandala's radius.
    this.numLayers = numLayers;  // Initialize the number of layers in the mandala.
    this.speed = speed;  // Initialize the rotation speed of the mandala.
    this.angle = 0;  // Initialize the initial angle of rotation.
  }

Reflection:

As I ventured into the captivating realm of generative artistry, I encountered a fascinating composition of code that seamlessly straddled the realms of logic and artistic expression. This particular piece of code, which drew inspiration from the intricate beauty of spiderwebs, wasn’t a mere string of arbitrary symbols and characters. Instead, it served as a canvas for precise mathematical craftsmanship intertwined with imaginative ingenuity.

One aspect that left a profound impression on me was the meticulous incorporation of classes. These structured entities functioned as the architects of this digital artistry, allowing for the creation of intricate mandala-like patterns. Each class resembled a well-thought-out blueprint, meticulously defining the characteristics and behavior of its own unique mandala. It felt akin to stepping into an artisan’s workshop, where the finer nuances of artistic creation were meticulously translated into code.

The Mandala class, in particular, emerged as the linchpin of this digital masterpiece. Its constructor breathed life into each mandala, meticulously defining its center, radius, number of layers, and rotational speed. With each update, these mandalas came to life, elegantly pirouetting in a mesmerizing dance of geometric forms. The display function, akin to an artist’s palette of code, skillfully painted these mandalas with intricate layers, resulting in a digital symphony of artistry that seamlessly blended mathematical precision and creative expression.

What truly left an indelible mark on me was the code’s inherent elegance. It wasn’t merely about generating aesthetically pleasing patterns; it was a fusion of technology and nature. The code ingeniously emulated the delicate equilibrium found in spiderwebs, where precision and artistry coexisted harmoniously. It served as a poignant reminder that code wasn’t just a tool but a canvas for artistic expression—an avenue to manifest one’s creative imagination in the digital domain. This code, with its meticulously structured classes and orchestrated logic, underscored the infinite creative possibilities that could be unleashed when technology and art converged in perfect unison.

Future improvements:

One promising direction for future improvement revolves around interactivity. Granting viewers the agency to actively participate in shaping the art, allowing them to adjust parameters like rotation speed, layer count, or color palettes, holds the potential to elevate the experience to a deeply engaging and personalized level. This interplay between observers and co-creators has the potential to establish a profound connection between the audience and the evolving digital masterpiece.

Diversifying the range of shapes generated offers an opportunity to explore novel artistic horizons. While the current mandala-inspired patterns are undoubtedly mesmerizing, delving into the creation of diverse geometric forms, intricate fractals, or abstract compositions can infuse the code with novelty and freshness. This expansion ensures that the art remains dynamic and ever-evolving.

The introduction of customization options is yet another avenue that holds immense promise. By crafting an intuitive interface through which users can personalize the appearance of the generated art—perhaps by selecting their preferred color palettes or background styles—a sense of co-authorship emerges. This user-driven customization fosters a more profound emotional connection between individuals and the artwork itself.

Code:
// Batool Al Tameemi - week 4 
//intro to Im 
let mandalas = [];  // Create an empty array called 'mandalas' to store instances of the 'Mandala' class.

function setup() {  // This is a setup function required by p5.js to initialize the canvas and other settings.
  createCanvas(400, 400);  // Create a canvas of size 400x400 pixels.
  noFill();  // Disable filling shapes.
  stroke(255);  // Set the stroke color to white.
  let numMandalas = 1;  // Define the number of mandalas to create (in this case, 1).

  for (let i = 0; i < numMandalas; i++) {  // Loop to create mandalas.
    let x = width / 2;  // Set the x-coordinate of the mandala's center.
    let y = height / 2;  // Set the y-coordinate of the mandala's center.
    let radius = random(50, 200);  // Set the radius of the mandala randomly.
    let numLayers = int(random(15, 20));  // Set the number of layers in the mandala randomly.
    let speed = random(0.005, 0.02);  // Set the rotation speed of the mandala randomly.
    mandalas.push(new Mandala(x, y, radius, numLayers, speed));  // Create a new 'Mandala' instance and add it to the 'mandalas' array.
  }
}

function draw() {  // This is a draw function required by p5.js to continuously update and draw the canvas.
  background(0);  // Set the background color to black.

  for (let i = 0; i < mandalas.length; i++) {  // Loop through the 'mandalas' array.
    mandalas[i].update();  // Call the 'update' method of each 'Mandala' instance.
    mandalas[i].display();  // Call the 'display' method of each 'Mandala' instance.
  }
}

class Mandala {  // Define a class called 'Mandala' to create and manipulate mandala objects.
  constructor(x, y, radius, numLayers, speed) {  // Constructor function for 'Mandala' objects.
    this.x = x;  // Initialize the x-coordinate of the mandala's center.
    this.y = y;  // Initialize the y-coordinate of the mandala's center.
    this.radius = radius;  // Initialize the mandala's radius.
    this.numLayers = numLayers;  // Initialize the number of layers in the mandala.
    this.speed = speed;  // Initialize the rotation speed of the mandala.
    this.angle = 0;  // Initialize the initial angle of rotation.
  }

  update() {  // Method to update the mandala's properties.
    this.angle += this.speed;  // Increment the angle of rotation.
  }

  display() {  // Method to display the mandala.
    translate(this.x, this.y);  // Translate the canvas to the mandala's center.
    rotate(this.angle);  // Rotate the canvas by the current angle.

    for (let i = 0; i < this.numLayers; i++) {  // Loop to create mandala layers.
      // Various calculations to draw each layer of the mandala.
      let layerRadius = this.radius * ((i + 1) / this.numLayers);
      let numPoints = int(map(i, 0, this.numLayers - 1, 2, 12));
      let layerSpacing = map(sin(frameCount * 0.01), -1, 1, 2, 20);
      let layerColor = map(i, 0, this.numLayers - 1, 100, 255);

      stroke(layerColor, 150);  // Set the stroke color for the layer.
      beginShape();  // Begin defining the shape.

      for (let j = 0; j < numPoints; j++) {  // Loop to create points in the layer.
        let angle = TWO_PI / numPoints * j;  // Calculate the angle between points.
        let x = layerRadius * cos(angle);  // Calculate x-coordinate of a point.
        let y = layerRadius * sin(angle);  // Calculate y-coordinate of a point.
        vertex(x, y);  // Add the point to the shape.
      }

      endShape(CLOSE);  // End the shape, closing it.
      translate(0, layerSpacing);  // Move to the next layer vertically.
    }
  }
}

 

 

Reading Reflection – Week# 3

I am in agreement and disagreement with the author at the same time. I like that the author really makes it a point to clarify that there are degrees of interactivity and that refrigerator is a low level (zero) and conversation is a high level. But I don’t agree with his way of doing away with all the other media and claiming they are zero interactivity e.g. film, music. The claim that there are degrees of interactivity should be justly applied to these media as I think a medium like film is very much interactive as it has the viewer and the maker in a continuous conversation, albeit the method of conversation is a little different than 1:1 live conversation.

I think the author is biased toward high interactivity activities and is ridiculing other media and reducing their significance to interactivity. In my eyes, interactivity or interactive media is anything that someone interacts with, and film and music are perfectly interactive as is conversation. Just as the author says, in even real life conversations, there isn’t a perfect interative conversation ever because there are so many requirements for it. Building off this point, things like film and music are equal to normal conversations on the scale of interactivity.

assignment 3: object oriented programming

For this project, I created a juggling game and named it Morbid Juggler. The only rule is to keep juggling the (eye)balls for as long as possible. I myself don’t really know how to juggle, so I had to think a little bit about how to create the same stressful experience with code, and the p5.js project embedded below is the culmination of that.

The player adds an (eye)ball to the screen by pressing shift on the keyboard, and the new (eye)ball is added at the cursor’s current position. The (eye)ball travels just as a juggler’s ball would in real life, with gravity acting on it, in a parabolic trajectory. The game goes on if the player can catch (click and hold) an eye(ball) before it leaves the screen, and bring it over to the side and release it again. When an (eye)ball is rereleased, it restarts its motion. The player can add as many (eye)balls as they can handle by pressing shift, but there is a counter in the corner that shows how many (eye)balls they have dropped. The game goes on forever: there’s no winning, because in the Morbid Juggler the player is already dead, and they can keep juggling forever. When they run out of (eye)balls, they can just hit shift again.

Note: when the drawing first loads, the canvas needs to be woken up with a click for it to be able to detect key presses.

Behind the scenes, the (eye)balls are objects of the Ball class. When the user hits shift, a new Ball object is instantiated. I think this is where I had the most fun, figuring out how to make the objects move like a real object in free fall. If we launch an object at an angle in a vacuum chamber (no drag), the projectile will have a constant horizontal velocity. Vertically, on the other hand, the object will accelerate due to gravity, and its vertical distance (y) would be a function of time elapsed since launch, which also dictates its horizontal distance (x).

Equipped with this very basic understanding of projectile motion, I save the initial time when an (eye)ball is created, and measure the time that has passed since. This allows me to use values of elapsedTime as a set of x values, which, when plugged into a quadratic equation, give a parabola. Changing the coefficients in the equation allows me to modify the shape of the parabola and thus the trajectory of the (eye)ball, such as how wide the arc created by its motion is. I played around with the coefficients and decided to use (0.4x)(2-x), which works nicely for a canvas of this size.

So I use elapsedTime to move the object horizontally: x=x+elapsedTime/3, and the y values come from the quadratic equation. But I also used the map function to normalize the values, which gives me a nice set of y values from 1 to 5. Both these choices ensure that the simulation runs at a speed appropriate for a playable game.

When the object is created, the time elapsed is zero, so our x value is also zero. As timeElapsed goes on increasing, the y values trace a parabola. The user can click and drag an (eye)ball, and upon release the object’s contactTime property is reset so that timeElapsed is zeroed. This is why the object restarts its parabolic motion.

The drag and drop effect was a little tricky to achieve. Since I’m updating the position of each object using a for loop, and I was trying to update the selected object’s position within the loop, my initial code kept selecting the wrong object for dragging. Although it took me a while to arrive at this, a simple solution was to use a helper function to detect when a particular object is clicked, and then sync its position with mouseX and mouseY in the draw function.

// detect when a user is dragging a ball
function mousePressed() {
  for (let i = 0; i < balls.length; i++) {
    let d = dist(mouseX, mouseY, balls[i].x, balls[i].y);
    if (d < 20) {
      draggingBall = i;
      offsetX = balls[i].x - mouseX;
      offsetY = balls[i].y - mouseY;
      // break oout of the for loop immediately, otherwise a different ball might be selected
      break;
    }
  }
}

For some time, I was trying to import an .obj model into my project so the ball would be 3D. The game would look nicer, but it was starting to get more complicated, and I kept getting errors from the p5 script. i settled for simply rotating the (eye)balls as they move, which is a much simpler workaround but produces a similar visual effect.

reading reflection: week 3

I read this chapter in one long “aha!” I can tell the author sounds like someone who has put a lot of thought into the philosophies that drive digital creation, and I would definitely be interested in looking into the later chapters of the book. I can’t think of a time when I really stopped to think along these lines: when people ask me what I want to do with my computer science degree, I blurt out a mushy something that resembles the job description of a web developer. When I work on web or mobile projects, I’m usually doing all the design and code by myself, so finding the line between these things just never came up. But, now enlightened, I can say that there is in fact, a place for a UI designer and an interactivity designer, and I think the final product is more the outcome of how these two agents (among other things) interact with each other rather than simply the sum of their individual contributions.

Definitely a lot of takeaways here (for me at least), but what hit closest to home was something he wrote towards the end: “good interactivity design integrates form with function”. Ever since I discovered Codepen and JsFiddle, I have been integrating the most random effects and interactions in my work. Sometimes a website has frills that doesn’t really add anything to it but doesn’t take anything away either, but in my work I would compromise on function for something that just “looks cool”, regardless of whether it actually complements the remaining UX or gets in the way of the user. If I can take apart my roles when I’m working alone, and think for stakeholders from both arts/humanities and math/science backgrounds, or those from the “Webby” generation or the “Personal Computer” generation, my finished work would probably come together much better.

Assignment 3

For this assignment I was inspired by Sol Lewitt’s work called Wall Drawings. I wanted to create an algorithm that connects multiple points together with lines similar to the artist’s work which asked people to draw points and join them together with straight lines.

I started off with figuring out how to put random points on the canvas but using classes and arrays. Then, I proceeded on to figure out how to connect them and get rid of the original points. And then I used some code that we saw in class and modified it a little according to my needs to make the points move. I also used the background opacity feature to create a mesmerizing artwork that become more and more hypnotic the more you click on it.

Sketch:

Problems and Potential Future work:

I want to create a further element of interactivity where the points (or lines) move away from the user’s mouse as it is hovered over the canvas. I tried doing it, but ran into confusion due to multiple things going on with the classes and arrays already.

 

let fiftyballs = []; //array for storing however many balls the user wants to create

let xPosition = []; //arrays for x and y position of each point the line begins from
let yPosition = [];
 
let x_Pos; //global variables to make it easy to store the x and y positions of the points
let y_Pos;

let R = 236;
let G = 238;
let B = 129;


let totalcount = 5; // variable for number of points to be created


class ballproducer {
  constructor() {
    
    this.xPos = random(10, width - 10);
    this.yPos = random(10, height - 10);
    
    x_Pos = this.xPos;
    y_Pos = this.yPos;
  
    this.xSpeed = random(-3,3);
    this.ySpeed = random(-3,3);
    
  }
  

  move() {
    // move the ball
    this.xPos += this.xSpeed;
    this.yPos += this.ySpeed;
    x_Pos = this.xPos;
    y_Pos = this.yPos;
  }
  


  checkForCollisions() {
    // check first for left and right wall
    if (this.xPos <= 15 || this.xPos >= width - 15) {
      this.xSpeed = -this.xSpeed;
    }

    // do the same for the ceiling and the floor
    if (this.yPos <= 15 || this.yPos >= height - 15) {
      this.ySpeed = -this.ySpeed;
    }
  }

  draw() {
    circle(this.xPos, this.yPos, 0);
  }
  

}


function setup() {
  createCanvas(600, 600);
  
  frameRate (60);
  
  for (let i = 0; i < totalcount; i++) {
   
    fiftyballs[i] = new ballproducer(); 
  
  }
  
  
}

function draw() {
  
   background(R, G , B  ,15);
    
  
  for (let i = 0; i < totalcount; i++) {
  
    
    xPosition[i] = x_Pos;
    yPosition[i] = y_Pos;
  
    fiftyballs[i].draw();
    fiftyballs[i].move();
    
    fiftyballs[i].checkForCollisions();
    
    line(xPosition[i], yPosition [i], xPosition[i-1], yPosition[i-1]); //draws the line from the previous to the next point
  
}
}

function mouseClicked(){ //each mouse click adds +1 lines to the graphic
  
  R =  random(140,237);
  G = random(160,238);
  B = random(129,237);
  
   
  fiftyballs[totalcount] = new ballproducer(); // adds a new value to the array which has the objects for the balls
  totalcount =  totalcount+1; //increases the number of points or lines by 1 on each click
}

 

Week 3 | Creative Reading Reflection: The Art of Interactive Design Ch. 1 + Object-Oriented Programming Assignment

Creative Reading Reflection – The Art of Interactive Design Ch. 1:

In “The Art of Interactive Design” by Chris Crawford, the concept of interactivity is redefined as a two-way conversation, challenging conventional understanding. Crawford criticizes the misuse of interactivity and highlights its subjective nature, emphasizing the importance of user-centric design. In a tech-saturated world, prioritizing active involvement and meaningful engagement is crucial. Interactivity, according to Crawford, empowers users, giving them a voice  in digital and outside interactions. This perspective aligns with user-centric design principles, where the user’s experience is important to aim and empower users by enabling meaningful choices.

However, I couldn’t help but think disagree with his idea of subjectivity. The nature of design and interactivity is subjective, and what one person considers effective or meaningful interaction, another may not. Disagreements can arise due to these differing subjective interpretations.

Object-Oriented Programming Assignment –  Memories:

Code:

I encountered significant challenges while working on this code. I faced numerous errors, and I had to go through various video tutorials and review my notes extensively to make progress. I even sought assistance from Professor Michael. Despite the difficulties, I eventually grasped the overall concept and aimed to simplify it for my future reference and understanding. Also the longest code I have ever done.

I benefited greatly from Professor Michaels’ Object-Oriented Programming class code, particularly the example titled ‘A Simple Bouncing Ball.’ This example provided me with understanding  the concept of classes and featured a very well explained code and result. Professor Michaels’ active guidance after the class to explain and show me how to add a class to my code also significantly contributed to my learning experience.

// variables for cloud
let cloudX1, cloudX2, cloudX3, cloudX4;
let cloudY;

// cloud speed
let cloudSpeed1, cloudSpeed2, cloudSpeed3, cloudSpeed4;

// variables for sun
let sunX;
let sunY;

// variable for font
let font1;

// font function / preload the custom font
function preload(){
  font1 = loadFont("GentyDemo-Regular.ttf"); 
}

function setup() {
  createCanvas(400, 400);
  cloudX1 = random(width);
  cloudX2 = random(width);
  cloudX3 = random(width);
  cloudX4 = random(width);
  cloudY = random(50, 150);

  cloudSpeed1 = random(1, 3);
  cloudSpeed2 = random(1, 3);
  cloudSpeed3 = random(1, 3);
  cloudSpeed4 = random(1, 3);
  
  sunX = width / 2;
  sunY = height / 2;

}
 

function draw() {
  background(135, 206, 250);

  // position of clouds
  drawCloud(cloudX1, cloudY);
  drawCloud(cloudX2, cloudY + 60);
  drawCloud(cloudX3, cloudY + 120);
  drawCloud(cloudX4, cloudY + 180);

  // movement of clouds
  cloudX1 = cloudX1 + cloudSpeed1;
  cloudX2 = cloudX2 + cloudSpeed2;
  cloudX3 = cloudX3 + cloudSpeed3;
  cloudX4 = cloudX4 +cloudSpeed4;

  // reset clouds when they go off-screen
  if (cloudX1 > width) {
    cloudX1 = -50;
    cloudY = random(50, 150);
    cloudSpeed1 = random(1, 3);
  }
  if (cloudX2 > width) {
    cloudX2 = -50;
    cloudY = random(50, 150);
    cloudSpeed2 = random(1, 3);
  }
  if (cloudX3 > width) {
    cloudX3 = -50;
    cloudY = random(50, 150);
    cloudSpeed3 = random(1, 3);
  }
  if (cloudX4 > width) {
    cloudX4 = -50;
    cloudY = random(50, 150);
    cloudSpeed4 = random(1, 3);
  }
  
  // sun drawing
  fill('yellow');
  ellipse(200, 400, 200, 199);
  
  
  
  // font color, text and position
  fill(255,255,255,150);
  textSize(77);
  textFont(font1);
  text('Memories',200, 200);
  textAlign(CENTER);
  
}

function drawCloud(x, y) {
  fill(255);
  noStroke();
  ellipse(x, y, 50, 40);
  ellipse(x + 50, y + 10, 50, 40);
  ellipse(x + 30, y, 50, 40);
}
// class for clouds
class Cloud {
  constructor(cloudsx, cloudsy, cloudsspeed) {
    this.cloudsx = cloudsx;
    this.cloudsy = cloudsy;
    this.cloudsspeed = cloudsspeed;
  }

  move() {
    this.cloudsx = this.cloudsx + this.cloudsspeed;
    if (this.cloudsx > width) {
      this.cloudsx = -50;
      cloudY = random(50, 150);
      this.cloudsspeed = random(1, 3);
    }
  }

  display() {
    fill(255);
    noStroke();
    ellipse(this.cloudsx, this.cloudsy, 50, 40);
    ellipse(this.cloudsx + 50, this.cloudsy + 10, 50, 40);
    ellipse(this.cloudsx + 30, this.cloudsy, 50, 40);
  }
}

// variables for clouds
let cloud1, cloud2, cloud3, cloud4;
let cloudY;

// varibales for sun and font
let sunX;
let sunY;
let font1;

// loading the custom font
function preload() {
  font1 = loadFont("GentyDemo-Regular.ttf");
}


function setup() {
  createCanvas(400, 400);
  cloud1 = new Cloud(random(width), random(50, 150), random(1, 3));
  cloud2 = new Cloud(random(width), random(50, 150), random(1, 3));
  cloud3 = new Cloud(random(width), random(50, 150), random(1, 3));
  cloud4 = new Cloud(random(width), random(50, 150), random(1, 3));
  sunX = width / 2;
  sunY = height / 2;
}

function draw() {
  background(135, 206, 250);

  // display and move clouds
  cloud1.display();
  cloud1.move();
  cloud2.display();
  cloud2.move();
  cloud3.display();
  cloud3.move();
  cloud4.display();
  cloud4.move();

  // sun drawing
  fill('yellow');
  ellipse(200, 400, 200, 199);

  // fonts color, text, and position
  fill(255, 255, 255, 150);
  textSize(77);
  textFont(font1);
  text('Memories', 200, 200);
  textAlign(CENTER);
}

Reflection:

As I mentioned, I faced significant challenges throughout this assignment, and by “a lot,” I truly mean a substantial amount. This was my very first attempt at creating a moving and dynamic assignment, and I take pride in the thought and concept behind it, as well as the progress I made in developing the code. While I did seek assistance and revisited videos and notes, it’s all part of the learning process. It might be a simple project, but furthermore I am proud of achieving it.

 

Reading Reflection _ Week 3

Concept of Interactivity 

In “The Art of Interactive Design” by Chris Crawford, the author raises a thought-provoking question that resonates with my own observations: “Interactivity does not always seem interactive in the eyes of the interactor.” This statement challenges us to reexamine our perception of what constitutes interactivity, as many everyday interactions have become so ingrained that we often overlook their interactive nature. Consider the simple act of opening a refrigerator—when these appliances were first introduced, people marveled at the way they responded to their actions, such as the interior light turning on. However, as time passed, this interaction became commonplace, and we no longer perceive it as interactive as it was. That brings me to the degrees of interactivity discussed by the author.

This notion of degrees of interactivity is crucial because it underscores our ability to develop increasingly interactive technology, games, and ideas that facilitate connections among people and generate new ideas and thoughts. It prompts us to question what truly defines interactivity. Is it primarily about entertainment and stimulation, and should interactivity be measured by the extent to which it engages us? Moreover, it’s essential to recognize that the definition of interactivity evolves over generations, particularly in the ever-advancing realm of technology. What was once considered interactive—like early computers that followed programmed orders—has given way to more sophisticated forms of interactivity, such as AI and robots capable of continuous learning and response. In this context, the concept of interactivity continually evolves, reflecting the ever-changing landscape of technological innovation, aside from the other evolving fields that involve interactivity like ways of teaching and learning, working with data, etc.

Ocean Waves

Concept: For this project, my inspiration came from an image I found on an Instagram account. Initially, I attempted to create a vertical wave effect and incorporate snow, but it didn’t achieve the desired visual result. As a result, I decided to shift my focus towards designing the sand and the waves, which evoked memories of my childhood spent at the beach. While I initially tried to create bird-like shapes, I ultimately chose to keep the design more abstract, allowing for interpretation by the user.

https://www.instagram.com/ag.lr.88/

Code Snippet: I take pride in the code that generates the sand grains because I achieved pleasing results by fine-tuning the parameters. I’m also pleased with how I implemented the wave motion, giving it a slower and smoother appearance, in addition to using the concept of Perlin Noise in general.

function Wave() {
  this.yPos = 0.001;

  this.display = function () {
    fill(118, 170, 206);
    // Drawing a polygon out of the wave points
    beginShape();
    strokeWeight(13);
    stroke(255);

    let xPos = 0;
  
    // Iterate over horizontal pixels
    for (let x = 0; x <= width; x += 10) {
      // Calculate a y value according to noise and map it
      let y = map(noise(xPos, this.yPos), 0, 0.8, 200, 380);

      // Set the vertex
      vertex(x, y);
      // Increment x dimension for noise
      xPos += 0.05;
    }
    
    // Increment y dimension for noise
    this.yPos += 0.002;
    vertex(width, height);
    vertex(0, height);
    endShape(CLOSE);
  };
}

// Create sand grains using a loop
  for (let x = 0; x < width; x += grainSize) {
    for (let y = 0; y < height; y += grainSize) {
      let grainColor = color(random(235, 245), random(220, 230), random(180, 190)); // Light sand grain color
      texture.fill(grainColor);
      texture.noStroke();
      let grainSizeX = random(grainSize * 1, grainSize * 3); // Adjust the X grain size
      let grainSizeY = random(grainSize * 1, grainSize * 2); // Adjust the Y grain size
      texture.ellipse(x + random(-grainSize / 4, grainSize / 4), y + random(-grainSize / 4, grainSize / 4), grainSizeX, grainSizeY);
    }
  }

  return texture;
}

 

Reflection:This project marked my first time using code snippets from online examples in P5.js. I enjoyed working with these examples and modifying them to match my creative vision. However, some of the functions and P5.js features used in these examples were unfamiliar and a bit complex for my current level of expertise. I spent a considerable amount of time exploring my own ideas from scratch, sometimes overlooking the new properties introduced in the examples. This experience highlighted the importance of experimenting with P5.js properties independently before incorporating more advanced techniques that may surpass my current skill level.

 

References:

https://p5js.org/examples/

https://www.schemecolor.com/beach-front.php