Reading Reflection – Week 3

The Art of Interactive Design, Ch. 1

As an Interactive Media and Business major, I certainly agree with the author that “interactivity” is a word thrown around so much that it might as well be “dead” – as evidenced by how hard it is to come up with a succinct explanation of the IM major.

I think Crawford’s definition of interactivity as involving two actors, and more specifically two purposeful creatures, and as existing on a continuum, is what makes this definition stand out. This reading changed my belief that interactivity was a boolean value, and I will now be more mindful of viewing interactions with objects (or even humans) on a scale of low to high, as he suggests. I do wish that he gave more examples of what would count as high interactivity, especially in the digital space.

Now to raise a question, are acoustic instruments interactive? They do not “think,” but they appear like they do because they react (speak), and their reaction causes a change in the (listening) player, thus fulfilling all 3 requirements of interaction laid out by the author. For example, if I am playing my guitar, I will first “speak” by plucking the strings and applying a certain level of pressure. The guitar strings “listen” and then “speak” in (sometimes unexpected) ways, which causes me to adjust the pressure I apply or change the position of my fingers on the fret board. Even more interesting is the question of digital instruments and “smart” instruments, which can make autonomous (?) decisions – where do these sit on the scale of interactivity?

Assignment 3 – “welcome to fish school!”

Concept

So, my concept was primarily inspired by Coding Train’s video on the starfield. Initially, it was just a practice video for me to learn how to create a starfield. As I worked on it, I came across other starfield videos, such as the one by Barney Codes, which helped me understand the intricacies and complex techniques involved in creating a starfield. These techniques included pushing and popping elements from arrays, using velocity increments, and adjusting background opacity to achieve the famous trail effect.

To add a unique twist to the concept, I decided to make the movement more angular and dependent on the mouse, introducing interactivity. This led to the idea of creating a generative art piece resembling a school of fish, where the movement of the mouse also influences the way the fish move.

Fish School

The code that I am most proud of is the way I added angular movement to the “fish trail”. Despite not having done math in a while, I refreshed my knowledge of trigonometry before experimenting with the arctan function and mouse coordinates (mouseX/Y) to create dynamic angles between the origin, previous position, and current position. This resulted in a fish-like movement that works well when moving the mouse around.

// for more dynamic angular movement of fish i.e velx vely and the inverse tan function with mouseX and mouseY values
    this.velx = map(mouseX,0, width, 0,5)
    this.vely = map(mouseY,0,height,-3,5)
    
    this.vel = createVector(this.velx, this.vely);
    
    this.ang = atan2(y - (mouseY/2), x - (mouseX/2) );

 

Reflection:

I feel more confident in using mathematical functions and coding with p5.js in general. I’ve realized that it’s not always necessary to start from scratch when writing code. Instead, I can be inspired by existing functions, adapt them for my own use case, and come up with new concepts. Even the more challenging math aspects can be intimidating at first, but once I figure out an equation, it becomes enjoyable to tweak and play with the values. Sometimes, I don’t even know where the project will end up, which adds to the fun. As for the project itself, I plan to find a way to give the initial screen a fish-like quality from the beginning, rather than it only appearing once mouse movement starts. Currently, it looks like a regular starfield until then, which can be jarring.

Response to Video – Week 2

I think that the reading really challenged my idea of computer-generated art and how much meaning does it have. I didn’t associate much meaning to algorithmically generated art as I thought it’s just a bunch of code, but after seeing this lecture I find it to be way more meaningful. It is essentially a study of how randomness gives meaning to things in nature, as in nature we see things that follow certain rules, but with slight variation just like how Casey Reas mentions in his lecture.
I am also intrigued by the idea that the universe was all random and chaotic before a God or almighty power brought order to it, as Casey mentions in the beginning of the lecture. I want to relate it to the concept of entropy, which entails that the universe is constantly moving towards a state of randomness; it’s going toward chaos from a state of orderliness. If a certain part is cold and another hot, the laws of physics are making sure that it all becomes equal in temperature everywhere. My questions are:
Is the existence of life and current state of the universe the most likely state that the universe can be in? If entropy is a real thing, is the current state of the universe the most likely scenario, the most homogenous it can get? Or is it merely a stage in the process?

Week 3 – Reflection Assignment

Based on the content from “The Art of Interactive Design” by Chris Crawford, the author examines the concept of interactivity and its definition. He argues that interactivity should be characterized as a conversation between two actors who alternately listen, think, and talk. He emphasizes the significance of all three components (hearing, thinking, and speaking) in the interactive process, implying that excellent interactivity requires each person to perform these processes effectively. The author also distinguishes between interactivity and reaction, emphasizing that true interactivity requires two actors to engage in a cyclic process.

Reflecting on the reading, I find the author’s definition of interaction to be both interesting and useful. His emphasis on the three fundamental components of interactivity – hearing, thinking, and speaking – aligns with the notion that effective communication requires engagement from all parties involved. This perspective aligns with what I believe that meaningful interactions, whether in human-to-human or human-computer interfaces, require a reciprocal exchange of information and ideas. The author’s difference between interactivity and reactivity raises concerns about the depth and quality of interactions in various circumstances, leading me to investigate how genuine interactivity may be achieved.

In terms of bias, the author does not appear to be biased in this work. He expresses his concepts and ideas clearly and uses examples to back up his point. The reading did not greatly alter my opinions, but it did emphasize the significance of addressing all aspects of interaction, especially in design and communication. It makes me think about the function of interactivity in many technical and communication contexts, as well as how it may be enhanced for better user experiences. The reading also raised concerns regarding the practical application of interactivity and the difficulties that come with building truly interactive systems.

Week 2: Exploding Colors

Concept:

This assignment was more exciting for me to create than the first one. At first, I couldn’t think of a specific idea I wanted to implement, so I just went in blindly. I started coding random stuff using for loops until it hit me what I actually wanted to do.

As I mentioned before in my previous blog post, I love colorful things, so I decided to create a color wheel that has some element of randomness in it. I wanted to make it messy, but also in a way organized. I designed it in a way that it changes size and arrangement according to where the mouse is. At first, it’s a rather small organized color wheel of lines centered in the canvas, but as you move the mouse to the right (along the x-axis), it increases in size, taking up the whole canvas but maintaining its organization, giving a visual of a train going through a tunnel at full speed, kind of. As you move the mouse downwards (along the y-axis), the lines become uncentered and spaced out giving a more chaotic visual. 

I wanted to add a dynamic background to my canvas because it looked too dull in my opinion. A very random thought was to make it somewhat resembling a fingerprint, But the curves were too much with the color wheel, so I decided to make it more low-key by replacing the curves with lines. The following picture was in a way what I had imagined the background to look like in the beginning. 

A highlight I’m proud of:

I am proud of the way I got the background to look. I did not have that much high expectations for it but it worked out perfectly. At first, I couldn’t figure out how to make parts of the diagonal lines change stroke weight without changing the whole line, but then I changed it to be various small lines instead of one long line. 

for(let i = 1; i<width; i += 10){
  for(let j = 1; j< height; j+= 10){
    stroke(0);
    frameRate(5);                                 
    strokeWeight(random(5));
    line(i,j,i+10,j+10);
  }
}

Reflection and ideas for future work or improvements:

For now, I am glad with the outcome, but I would like to practice creating more advanced sketches with more interactivity. Additionally, I would like to work on using other functions and techniques as well, because I tend to stick to the ones I already know.

On another note, for this assignment I tried my best to make my code as brief as possible while delivering a cool piece of artwork.

Week 3 – OOP Graphic Art

Concept: Errors

My idea of this work comes from the situation we probably all have run into, when our computer gives many errors, or even worse when the entire system crushed down. I remember facing this kind of situations a lot back to my childhood when the computer first became popular. The system was not looking good and not stable at all. It can easily crush or be attacked. Therefore, I used to see these errors very often. Now, the computer system has improved so much that I personally rarely face similar situations of so many errors now. My work thus aims at giving a retrospect to the early days of computers and technology. But now, you can simply click to take all the warnings down!

Highlight of the code

The main body of the code is the triangle warning sign class. The other elements of each warning window is anchored to these triangles, as seen in the code:

class TriWarning {
  constructor(xPos, yPos, triHeight) {
    this.xPos = xPos;
    this.yPos = yPos;
    this.height = triHeight;
    this.side = triHeight / sqrt(3); // all the triagnles are equilateral
  }

  // this method draws the entire triangle warning signs and windows
  drawTriWarning() {
    fill("rgba(210,206,206,0.48)");
    rect(this.xPos - 50, this.yPos - 5, 220, 70);
    strokeWeight(2);
    line(this.xPos + 80, this.yPos + 5, this.xPos + 120, this.yPos + 5);
    line(this.xPos + 50, this.yPos + 25, this.xPos + 150, this.yPos + 25);
    line(this.xPos + 50, this.yPos + 40, this.xPos + 150, this.yPos + 40);
    line(this.xPos + 50, this.yPos + 55, this.xPos + 150, this.yPos + 55);
    noFill();
    fill("rgb(239,195,122)");
    noStroke();
    triangle(
      this.xPos,
      this.yPos,
      this.xPos - this.side,
      this.yPos + this.height,
      this.xPos + this.side,
      this.yPos + this.height
    );
    fill(0);
    textSize(40);
    text("!", this.xPos - 7, this.yPos + 55);
    stroke(0);
  }
}

I use mouseClicked() function to start the loop of draw() function as the draw() function mainly affects the falling down of the generated warning windows and I don’t want them to start falling if the user doesn’t click on the canvas.

function mouseClicked() { // this will trigger the falling of the warning windows
  loop();
}

The falling down is realized by adding the y-position of each warning window by a certain speed each time draw() runs. It stops when the windows touch the base of the canvas.

function draw() {
  for (let i = 0; i < 10; i++) {
    if (!(triArray[i].yPos > 335)) {
      background("rgba(158,179,224,0.93)");
      triArray[i].yPos += speed;
    }
  } // triangles in the array will 'fall down' to the bottom of the canvas
  for (let i = 0; i < 10; i++) {
    triArray[i].drawTriWarning();
  }
  print(triArray);
}

Reflections and improvements

Another way to do this is to make the warning windows constantly move within the canvas. But I think this does not contribute to the main idea of my work, which is reimagining the time where computers usually ran into all kinds of warnings. However, I do think that the falling of the warning windows could be more dramatic and dynamic than the current one, but I am not sure what could work best.

 

Reading Reflection – Week 2

In Casey Rea’s talk of chance operation in digital art, a central theme that stood out was the delicate balance between structure and randomness. What caught my attention was a specific example he shared. He took simple visualizations of hypothetical neuron vehicle movements within the animal kingdom and used them to create unique patterns in his artwork. This approach fascinated me because it transformed scientific data into art, making complex information visually appealing.

I also appreciated Rea’s insight that even in complete chaos, there’s an underlying structure and delicate geometry. This idea adds depth and intrigue to digital art.

Rea’s talk challenged traditional artistic norms and encouraged breaking free from conventional constraints. His emphasis on embracing randomness as a creative catalyst raised questions about finding the right balance between chaos and order in art. I found myself wondering if there are specific techniques or guidelines for achieving this balance in the creative process.

In conclusion, Casey Rea’s exploration of chance operation in digital art has inspired me to push my creative boundaries. I believe that incorporating elements of chance into my own art could lead to exciting breakthroughs and help me move beyond my artistic understanding.

Week 3 – Response: Interactive Design

What is interactivity? What are some essential qualifiers to be interactive? This is the essential question the author starts with. The answer he gives is a combination of three metaphorical steps: listening, thinking, and speaking. He also argues that interactivity might not be a dichotomy; instead, it could be described with degrees. I agree with most of the author’s points that in order for something to be interactive, it must proactively give responses to another’s actions or inputs. However, as the author also mentions, the degree of interactivity among things that are interactive could vary, and therefore, I am thinking about the value of interactivity.

Referring the author’s example of having conversations with another person, the thinking part plays an important role. For human beings, it’s easy to imagine how the lack of thinking of either party of the conversation could destroy the entire meaning of the conversation. But what about machines and computers? Nowadays, most of the human-computer interactions rely on the same codes that run over and over again whenever the computer receives an input from the human. This is surely interactive, but is the computer in this case a good thinker as in the conversation? Instead of active thinking, the computer merely processes the input in a preset procedure and gives out its output. But it works perfectly, just as we expect it to do so. Then does interactivity matters? One example would be Siri. Surely it is cool to speak to this “virtual personal assistant” and it will help you settle things down. But do you remember how many times they can fail you? At least for me, sometimes I feel that it seems to be more convenient just to go back to traditional way of clicking. By definition, Siri might be of a higher degree of interactivity. but its actual value of being this interactive is not so definite. Therefore, I think that computers for now are still just preprogrammed machines that complete some tasks, and that its interactivity is indeed significant but a substantial improvement in its interactivity and its resulting efficiency still need more and more technological innovations.

And at this point, I think the author makes a good point in the collaboration of interaction designers and interface designers. Interaction design is definitely a new area, instead of an extension of traditional interface design, and requires new skill sets. And to achieve new technological innovations that can lead to a higher level of efficient interaction, the collaboration and exchange of ideas between these two area are crucial and necessary.

Week 2- Generative Artwork- Visual Art themed

overview

This generative artwork, inspired by Wassily Kandinsky’s “Circles in Circles,” showcases a vibrant and dynamic composition. The canvas size is set to 600×600 pixels with a beige background and a black-bordered transparent circle at the center. Colorful animated circles, each with random positions, sizes, colors, and movement patterns, create an ever-changing visual experience. Additionally, eight animated lines move horizontally, resetting when they go off-screen. The viewer can interact with the artwork by clicking on different areas, and changing the background color dynamically. This code combines randomness and structure to produce a captivating, abstract artwork reminiscent of Kandinsky’s geometric abstractions.

Who is Wassily Kandinsky?

Wassily Kandinsky (1866-1944) was a pioneering Russian painter and art theorist, often hailed as one of the founders of abstract art. He believed that art should evoke emotions and spiritual experiences through non-representational forms and colors. Kandinsky’s “Circles in Circles” is a seminal artwork created in 1923, during his Bauhaus period. It is a prime example of his abstract style, featuring geometric shapes and vibrant colors. In this work, a large red circle dominates the canvas, encompassing smaller circles in various hues, with each circle seemingly floating or orbiting within the composition. “Circles in Circles” embodies Kandinsky’s fascination with the spiritual and emotional power of abstract forms and color harmonies.

Figure 1: “Circles in Circles” by Wassily Kandinsky (1923)

 

 

 

 

 

 

 

Code Details; Highlights of the code that I am particularly proud of 

  • To precisely replicate the colors found within the painting, I first extracted its color palette. Subsequently, I meticulously identified and stored the exact hexadecimal color codes in an array. These hex codes were then used to randomly assign colors to the circles in my artwork, ensuring an accurate representation of the original painting’s color scheme
  • // Array of hex colors for the circles
    let circleColors = ["#c7999b", "#b8bbaf", "#8e4040", "#82a596", "#e4c95b", "#585e3a", "#364664", "#694350", "#282927"];
  • The original painting featured precisely 21 circles, and through the utilization of loops, I successfully replicated this exact count within my artwork. and just like the original painting the circles had random stroke weight and the circles have a certain sense of transperacy just as the original painting
  • for (let i = 0; i < 21; i++) {
        let x = random(width); // Random x-coordinate within canvas width
        let y = random(height); // Random y-coordinate within canvas height
        let radius = random(10, 80); // Random radius between 10 and 80 pixels
    
        // Randomly select a color from the circleColors array
        let fillColor = color(random(circleColors));
        
        // Generate a random stroke weight for the circle (border thickness)
        let strokeWeightValue = random(1, 5);
        
        let xspeed = random(-2, 2); // Random horizontal speed
        let yspeed = random(-2, 2); // Random vertical speed

    embedded sketch


problems I ran into:

While the code initially employed a reversal of direction (multiplying by -1) when circles encountered the canvas edges, it became apparent that certain circles exhibited shaky behavior. To mitigate this issue, a damping effect was introduced. Initially, there were reservations about this approach, as it seemed to halt the circles’ motion. However, upon further consideration, it was realized that the damping effect, while tempering the motion, also contributed to a smoother and less overwhelming overall movement.

After applying the damping effect 

code (commented with the use of loops and classes as requested) :

// Batool AL Tameemi, Intro to IM Week 3 homework
// Generative art work

let circles = [];
let backgroundColors = [];
let lines = [];

function setup() {
  createCanvas(600, 600); // Create a canvas with a size of 600x600 pixels
  noStroke(); // Disable stroke (borders) for shapes
  frameRate(60); // Set the frame rate to 30 frames per second

  // Add the RGB values of the colors from the painting to the backgroundColors array
  backgroundColors.push(color(226, 216, 203)); // Light beige
  backgroundColors.push(color(146, 125, 75)); // Dark beige
  backgroundColors.push(color(130, 165, 150)); // Greenish gray
  // Add more background colors as needed

  // Array of hex colors for the circles
  let circleColors = ["#c7999b", "#b8bbaf", "#8e4040", "#82a596", "#e4c95b", "#585e3a", "#364664", "#694350", "#282927"];

  for (let i = 0; i < 21; i++) {
    let x = random(width); // Random x-coordinate within canvas width
    let y = random(height); // Random y-coordinate within canvas height
    let radius = random(10, 80); // Random radius between 10 and 80 pixels

    // Randomly select a color from the circleColors array
    let fillColor = color(random(circleColors));
    
    // Generate a random stroke weight for the circle (border thickness)
    let strokeWeightValue = random(1, 5);
    
    let xspeed = random(-2, 2); // Random horizontal speed
    let yspeed = random(-2, 2); // Random vertical speed
    
    // Create an instance of AnimatedCircle and add it to the circles array
    circles.push(new AnimatedCircle(x, y, radius, fillColor, strokeWeightValue, xspeed, yspeed));
  }

  // Create animated lines
  for (let i = 0; i < 8; i++) {
    let x1 = random(width); // Random x-coordinate for the starting point of the line
    let y1 = random(height); // Random y-coordinate for the starting point of the line
    let x2 = random(width); // Random x-coordinate for the ending point of the line
    let y2 = random(height); // Random y-coordinate for the ending point of the line
    let lineColor = color(0, 0, 0); // Black color for lines
    let lineWeight = random(1, 5); // Random stroke weight for lines

    // Create an instance of AnimatedLine and add it to the lines array
    lines.push(new AnimatedLine(x1, y1, x2, y2, lineColor, lineWeight));
  }
}

function draw() {
  for (let i = 0; i < backgroundColors.length; i++) {
    fill(backgroundColors[i]); // Fill the background with one of the background colors
    noStroke();
    rect(0, i * (height / backgroundColors.length), width, height / backgroundColors.length);
    // Draw a colored rectangle for each background color
  }

  for (let circle of circles) {
    circle.move(); // Move each animated circle
    circle.display(); // Display each animated circle
  }

  for (let line of lines) {
    line.move(); // Move each animated line
    line.display(); // Display each animated line
  }
  
  // Draw a single black-bordered transparent circle inside
  strokeWeight(8); // Set the stroke weight (border thickness) for the ellipse
  stroke(0); // Set the stroke color to black
  noFill(); // Don't fill the ellipse with color
  ellipse(width / 2, height / 2, 400, 400); // Draw the ellipse at the center of the canvas
}

function mousePressed() {
  // Calculate the index of the background color based on the mouse click position
  let index = int(mouseY / (height / backgroundColors.length));
  fill(backgroundColors[index]); // Fill with the selected background color
  rect(0, index * (height / backgroundColors.length), width, height / backgroundColors.length);
  // Draw a colored rectangle based on the mouse click position
}

// AnimatedCircle class definition
class AnimatedCircle {
  constructor(x, y, radius, fillColor, strokeWeightValue, xspeed, yspeed) {
    this.x = x;
    this.y = y;
    this.radius = radius;
    this.fillColor = fillColor;
    this.strokeWeightValue = strokeWeightValue; // Store stroke weight
    this.xspeed = xspeed;
    this.yspeed = yspeed;
    this.fillColor = color(red(fillColor), green(fillColor), blue(fillColor), 200); // Set the alpha value to 150 for transparency
  }

move() {
    // Define a damping factor (adjust as needed)
    let damping = 0.95;

    // Update the x-coordinate based on speed
    this.x += this.xspeed;
    
    // Apply damping to reduce shaking near the edges
    this.xspeed *= damping;

    // Update the y-coordinate based on speed
    this.y += this.yspeed;

    // Apply damping to reduce shaking near the edges
    this.yspeed *= damping;

    if (this.x > width - this.radius || this.x < this.radius) {
        this.xspeed *= -1; // Reverse horizontal speed if the circle hits canvas edge
    }

    if (this.y > height - this.radius || this.y < this.radius) {
        this.yspeed *= -1; // Reverse vertical speed if the circle hits canvas edge
    }
}

  display() {
    strokeWeight(this.strokeWeightValue); // Set the stroke weight
    stroke(0); // Set the stroke color to black
    fill(this.fillColor); // Fill with the specified color
    ellipse(this.x, this.y, this.radius * 2, this.radius * 2); // Draw the circle
  }
}

// AnimatedLine class definition
class AnimatedLine {
  constructor(x1, y1, x2, y2, lineColor, lineWeight) {
    this.x1 = x1;
    this.y1 = y1;
    this.x2 = x2;
    this.y2 = y2;
    this.lineColor = lineColor;
    this.lineWeight = lineWeight;
    this.speed = random(0.5, 2); // Random line animation speed

  }

  move() {
    // Move the lines horizontally
    this.x1 += this.speed;
    this.x2 += this.speed;

    // Reset lines when they go off-screen
    if (this.x1 > width) {
      this.x1 = 0;
      this.x2 = random(width);
      this.y1 = random(height);
      this.y2 = random(height);
    }
  }

  display() {
    strokeWeight(this.lineWeight); // Set the stroke weight
    stroke(this.lineColor); // Set the stroke color
    line(this.x1, this.y1, this.x2, this.y2); // Draw the line
}

}

 

 

 

Reading Reflection: Week 2

As a Computer Science major, watching Casey Reas’s presentation on “Chance Operations” was truly enlightening. I had always perceived code as a rigid and entirely controllable entity, firmly rooted in rational decisions and binary logic. However, Reas’s perspective on blending randomness and algorithmic control to yield surprising results challenged this notion.

A particularly captivating idea he presented was “Fractal Invaders,” where artist intentionally incorporate controlled randomness into their work, much like the unpredictable outcomes of a coin toss or a roll of the dice. This controlled randomness made each version of the artwork unique and unpredictable.

Moreover, he emphasized upon the power of symmetry in his creative process. He highlighted that even in compositions that initially arose from randomness, the introduction of symmetry could instill a sense of order and familiarity. It struck me that as humans, we possess an inherent tendency to seek patterns and meaning within chaos. Our brains are wired to identify recognizable shapes and forms, and this inclination even extends to our perception of generative art.

All in all, the process of merging randomness with symmetry in generative art is fascinating because it explores how our minds work creatively. It shows that complexity can come from simplicity and that order and chaos can coexist. This artistic process invites us to contemplate the human mind’s innate desire to discover patterns and meaning in the world, ultimately pushing the boundaries of creative expression.