Looking Outwards – 11

Link: https://www.plagiarismtoday.com/2021/03/16/nfts-and-copyright/

By reading this article, I understand how NFTs really work. So, according to this article owning an NFT doesn’t necessarily mean someone actually owns the copyright of this art piece. However, it isn’t completely useless, as NFTs can also be considered as an internet-signed copy of the work. Because of the fact that the NFTs function as a signed copy of the original art piece, they can help the producers financially. On the other hand, some people who didn’t create those works can also tokenize those works can really damage the career of the artists who actually created those works. In other words, NFT platforms not only provide an easier way to allow society to donate and help digital artists but also create an opportunity for those who are even involved in any art creation process to drain money from those creators. However, in a few years, courts will eventually be involved in such cases to protect those artists eventually. 

CITATION:

Bailey, J. (2021, March 16). NFTs and copyright. Plagiarism Today. Retrieved November 19, 2022, from https://www.plagiarismtoday.com/2021/03/16/nfts-and-copyright/ 

Looking Outwards 11

In the fields of CG and AI, unintentional bias exists in virtual human portraits. The author believes that computer programmers and artists must think thoroughly about every detail in their design process to diminish any potential harm to a specific group of people. An example the author provided in the article is the glowing effect that was virtually generated on portraits by Johannes Vermeer and other contemporary artworks. Though the glow effect works effectively on white skin, it is not a dominant quality of black skin, which automatically creates a difference in presentations. The solution to this issue is based upon the artists’ realization of creating a diverse range of options for these qualities and refining those options to match reality accurately.

Gaskins, Nettrice. “Ai & Creativity: Addressing Racial Bias in Computer Graphics.” Medium, Medium, 11 Aug. 2021, https://nettricegaskins.medium.com/ai-creativity-addressing-racial-bias-in-computer-graphics-f5fc0c255e7.

Johannes Vermeer. “Girl With a Pearl Earring (detail),” dated c. 1665
Google search results for “skin shaders”

anabelle’s blog 11

The article Beeple’s digital ‘artwork’ sold for more than any painting by Titian or Raphael,” discusses what the impacts the capitalization of art may have on the industry through the lens of NFTs. It highlights the auctioning of Beeple’s Everydays: The First 5000 Days for $69.3 million, one of the highest bids for art in history. The author criticizes how nonphysical, nontechnical, and nonbeautiful art has gripped the capitalist market by rebranding them as special NFTs, or digital property. He seems most turned off by how the two highest bidders were both founders of blockchain companies — blockchains are exactly how NFTs receive their value, so the entire event feels orchestrated in his opinion. I think NFTs can be respected as a type of commerce, but I hesitate to call each individual work art. Either way, new technology and new ways of creating goods for the market will always appear and resisting them can be pretty futile.

Citation:
Washington Post. “Perspective | Beeple’s Digital ‘Artwork’ Sold for More than Any Painting by Titian or Raphael. But as Art, It’s a Great Big Zero.” Accessed November 19, 2022. https://www.washingtonpost.com/entertainment/museums/beeple-digital-artwork-sale-perspective/2021/03/15/6afc1540-8369-11eb-81db-b02f0398f49a_story.html.

Looking Outwards 11: Societal Impacts of Digital Art

Article Read: https://www.washingtonpost.com/entertainment/museums/beeple-digital-artwork-sale-perspective/2021/03/15/6afc1540-8369-11eb-81db-b02f0398f49a_story.html

This article discusses the issue of copyright and the high value being placed on digital art which in itself is a controversial subject on whether or not it is considered art. The new trend of digital art or as the author argues “a marketable digital product” rather than referring to it as art, is being sold for very high prices to signify ownership. The idea that art has become a commodity that will significantly increase in value over time seems to be the main incentive. In this article, the author criticizes the work of Beeple, who is a digital artist who recently sold a digital file titled “Everydays: The First 5000 Days” for $69.3 million which was sold for significantly more than Titan or Raphael’s paintings. The author talks about how there isn’t a rule to determine the value of art but rather no nowadays, marketing and desire have overtaken art.

A day in the future city

I took inspiration from a scene in cyberpunk edgerunner and made a city landscape based on that. I am surprised by the flexibility of object, the properties can be manipulated in different ways to create completely different stuff. For example, the pillars, foreground, and background buildings are created with one single object.

Inspired scene

sketch

//Jason Jiang
//Section E

//setting up arrays of objects
var bldg = [];
var bldgBack = []
var pillar = []
var vhc = []

//number of objects in each array
var bldgN = 6;
var bldgBackN = 11;
var vhcN = 2;

//color palatte for buildings
var palatte = ['#7670b2', '#5ab6b0', '#5ab6b0', '#3f5c60', '#1c4167', '#3f5c60', '#7e9868'];

//image links of assets
var facadeLink = [
            "https://i.imgur.com/oPA4x4y.png",
            "https://i.imgur.com/xeOW3sz.png", 
            "https://i.imgur.com/gbr6ySL.png",
            "https://i.imgur.com/WqUehK3.png"];
var facadeImg = [];
var vehicleLink = [
            "https://i.imgur.com/gFtwhqV.png",
            "https://i.imgur.com/KX1dLCi.png",
            "https://i.imgur.com/Fo43Kep.png"];
var vehicleImg = [];

//load assets
function preload(){
    train = loadImage("https://i.imgur.com/BFxe31d.png");
    for (var i = 0; i < facadeLink.length; i++){
        facadeImg[i] = loadImage(facadeLink[i]);
    }
    for (var i = 0; i < vehicleLink.length; i++){
        vehicleImg[i] = loadImage(vehicleLink[i]);
    }

}

function setup() {

    createCanvas(400, 200);
    imageMode(CENTER);
    colorMode(HSB);
    
    
    //create front building arrays
    for(var i = 0; i < bldgN; i++){
        //randomly pick color from array
        var palatteIndex = floor(random(palatte.length));
        //randomly pick an image from array
        var facadeIndex = floor(random(facadeImg.length));
        var b = building(80*i, random(-height/3, height/3), random(80, 100), color(palatte[palatteIndex]), facadeImg[facadeIndex]);
        bldg.push(b);
    }

    //create back building arrays
    for(var i = 0; i < bldgBackN; i++){
        var b = building(40*i, random(150), 40, color(20, 10, 30, 0.5), -1);
        bldgBack.push(b);
    }

    //create pillars
    for (var i = 0; i < 2; i++) {
        var p = building(200*i, 70, 20, color(80), -1);
        pillar.push(p);
    }

    //creating vehicles
    for (var i = 0; i < 2; i++) {
        //randomly pick an image from array
        var vehicleIndex = floor(random(vehicleImg.length));
        //randomize vehicle moving direction
        if (random(1) <= 0.5){
            //vehicles from left to right
            var v = vehicle(random(-width/2, 0), random(50, 150), random(5, 10), vehicleImg[vehicleIndex]);
        }
        else{
            //vehicles from right to left
            var v = vehicle(random(width, 1.5*width), random(50, 150), random(-5, -10), vehicleImg[vehicleIndex]);
        }
        vhc.push(v);
    }

 }


function draw() {
    background(200, 20, 100);
    //update information in each frame
    updateObjs();
    updateArray();
    //add train image
    image(train, 200, 90); 
    }


function updateObjs(){
    
    //updating building background
    for(var i = 0; i < bldgBack.length; i++){
        bldgBack[i].move(2);
        bldgBack[i].display();
    }

    //updating building foreground
    for(var i = 0; i < bldg.length; i++){
        bldg[i].move(5);
        bldg[i].display();
    }
    //updating pillars
    for(var i = 0; i < pillar.length; i++){
        pillar[i].move(5);
        pillar[i].display();
    }

    //updating vehicles
    for (var i = 0; i < vhc.length; i++) {
        vhc[i].move();
        vhc[i].display();
    }
    
}


//displaying buildings
function buildingDisplay(){
    
    //draw rectangles
    noStroke();
    fill(this.color);
    rect(this.x, this.y, this.w, height-this.y);
    var centerX = this.x + 0.5*this.w ;
    var centerY = this.y + 0.5*(height - this.y);
   
    //see if the detail property of object is an image, since not pillars and background buildings dont need facade details on them
    if (this.detail != -1){
    //add details on building facade
    push();
    translate(centerX, centerY);
    image(this.detail, 0, 0, 0.8*this.w, 0.95*(height-this.y));
    pop();
    }
   
}

//update building position
function buildingMove(s){
    this.x -= s;
}

//displaying vehicles
function vehicleDisplay(){
    push();
    //flip the image if going from right to left
    if(this.s < 0){
        scale(-1, 1);
        image(this.detail, -this.x, this.y);
    }
    else{
        image(this.detail, this.x, this.y);
    } 
    pop();
}

//update vehicles position and age
function vehicleMove(){
    this.x += this.s;
    this.age += 1;
}




function updateArray(){
    //replacing foreground buildings outside canvas
     for(var i = 0; i < bldg.length; i++){
        if (bldg[i].x <= -bldg[i].w){
            var palatteIndex = floor(random(palatte.length));
            var facadeIndex = floor(random(facadeImg.length));
            var b = building(400, random(-height/3, height/3), random(80, 100), color(palatte[palatteIndex]), facadeImg[facadeIndex]);
            bldg[i] = b;
             
        }
    }

    //replacing background buildings outside canvas
    for(var i = 0; i < bldgBack.length; i++){
        if (bldgBack[i].x <= -bldgBack[i].w){
            var b = building(400, random(150), 40, color(20, 10, 30, 0.5), -1);
            bldgBack[i] = b;
        }
     }

    //replacing pillars outside canvas
    for(var i = 0; i < pillar.length; i++){
        if (pillar[i].x <= -pillar[i].w){
            var p = building(400, 70, 20, color(80), -1);
            pillar[i] = p;
        }
     }

     //replacing vehicles after a certain time
     for(var i = 0; i < vhc.length; i++){
        
        if (vhc[i].age > 200){
            var vehicleIndex = floor(random(vehicleImg.length));
            if (random(1) <= 0.5){
                var v = vehicle(random(-width/2, 0), random(50, 150), random(5, 10), vehicleImg[vehicleIndex]);
            }
            else{
                var v = vehicle(random(width, 1.5*width), random(50, 150), random(-5, -10), vehicleImg[vehicleIndex]);
            }
            vhc[i] = v;
        }
    }

}


//create building objects
function building(buildingX, buildingY, buildingWidth, buildingColor, buildingDetail) {
    var b = {   x: buildingX,
                y: buildingY,
                w: buildingWidth,
                color: buildingColor,
                detail: buildingDetail,
                display: buildingDisplay,
                move: buildingMove
    }
    return b;
}

//create vehicle objects
function vehicle(vehicleX, vehicleY, vehicleSpeed, vehicleDetail) {
    var v = {   x: vehicleX,
                y: vehicleY,
                s: vehicleSpeed,
                age: 0,
                detail: vehicleDetail,
                display: vehicleDisplay,
                move: vehicleMove
    }
    return v;

}




Looking Outward 11

link: https://ars.electronica.art/aeblog/en/2020/04/10/women-in-media-arts-ai/

I look into the article “Women in Media Arts: Does AI think like a (white) man?”, where the author discusses the inherent discrimination in artificial intelligence due to the predominantly white male society. This is due to the fact that “the AI is only as good …  as the data it feeds.” Thus if the internet is still populated by artwork from white males or drawn from a white male perspective, this inherent bias will forever exist in the AI’s algorithm.

This statement has been exemplified by an AI face recognition software, where the error rate is significantly high among women of color, displaying this inherent prejudice in the AI’s database. AI teams that lack diversity in gender and race would most definitely produce software that lacks a bigger perspective, and thus bares bias that favors white males.

The article has given examples of efforts to counteract this bias, such as the feminist data set, an ongoing multi-year project that collects feminist data such as artworks, essays, interviews, and books on feminism or from that a feminist’s perspective. This data set would help push diversity in the AI algorithm and broadens the perspective of the AI’s database.

Looking Outwards 11

Gender Shades

https://ars.electronica.art/aeblog/en/2020/04/10/women-in-media-arts-ai/

As artificial intelligence software that detects, recognizes, and classifies faces becomes increasingly popular, researchers Joy Buolamwini and Timnit Gebru are examining how codified biases in facial recognition software often misgender people who are not white or even fail to recognize their faces completely in their project titled “Gender Shades”. These biased facial recognition softwares are often created by male-dominated teams of computer scientists who lack diversity in ethnicity, race, and gender. Additionally, the data sets that these computer scientists feed their programs also often lack diversity, which is why the software does a poor job of recognizing people who are not white or male. To combat this, Buolamwini and Gebru have created a new standard of data set taken from a diverse group of 1270 parliamentarians from Africa and Europe. This new benchmark dataset for gender and racial diversity will help facial recognition softwares learn to recognize all faces and distinguish between genders and ethnicities without bias.

Project 11 Landscape

project11

It was fun to figure out how to create a whole landscape without having to define absolutely everything and making it more interesting with randomness. I added a shooting star with a very small creation probability to create a little surprise within the landscape every once in a while.

// Rachel Legg / rlegg / Section C

//have trees and stars move by
//every once in a while, a surprising shooting star
//car in the middle (moving past trees)

var stars = [];
var trees = [];
var shootingStars = [];

var car;

function preload(){
    car = loadImage("https://i.imgur.com/C7SXV3W.png");
}

function setup() {
    createCanvas(450, 300);
    frameRate(10);

    //initial stars and trees
    for(var i = 0; i < 6; i++){
        var sx = random(width);
        stars[i] = makeStar(sx);
    }
    for(var i = 0; i < 10; i++){
        var sx = random(width);
        trees[i] = makeTree(sx);
    }
    //random shooting star
    for(var i = 0; i < 1; i++){
        var sx = random(width);
        shootingStars[i] = makeShootingStar(sx);
    }

}

function draw() {
    //sky - dark blue
    background(10, 52, 99);
    //ground
    fill("darkgreen");
    noStroke();
    rect(0, 240, 500, 75);
    //road
    fill("gray");
    rect(0, 260, 495, 10)

    updateAndDisplayStar();
    removeStarOutOfView();
    addNewStar();

    updateAndDisplayShootingStars();
    removeShootingStarOutOfView();
    addNewShootingStars();

    updateAndDisplayTree();
    removeTreeOutOfView();
    addNewTree();

    //car stays stationary as scenery moves by
    //drew out car in illustrator & uploaded to imgur
    image(car, width/2 - 60, 207, 165, 65);

}

//stars object
function makeStar(starLocationX){
    var star = {x : starLocationX,
                y : random(0, 170),
                starScale : random(0.1, 0.5),
                speed : -1,
                move : moveStar,
                display : displayStar}
        return star;
}

function displayStar(){
    push();
    translate(this.x, this.y);
    fill(255);
    noStroke();
    scale(this.starScale);
    beginShape();
    vertex(50, 18);
    vertex(61, 37);
    vertex(83, 43);
    vertex(69, 60);
    vertex(71, 82);
    vertex(50, 73);
    vertex(29, 82);
    vertex(31, 60);
    vertex(17, 43);
    vertex(39, 37);
    endShape();
    pop();
}

//update star positions and display
function updateAndDisplayStar(){
    for(var i = 0; i < stars.length; i++){
        stars[i].move();
        stars[i].display();
    }
}

function addNewStar(){
    var newStarProbability = 0.01;
    if (random(0, 1) < newStarProbability){
        stars.push(makeStar(width));
    }
}

function removeStarOutOfView (){
    //if star goes off left edge, remove from array
    var starsToKeep = [];
    for (var i = 0; i < stars.length; i++){
        if (stars[i].x + 50 > 0) {
            starsToKeep.push(stars[i]);
        }
    }
    //stars left
    stars = starsToKeep;
}

function moveStar(){
    this.x += this.speed;
}


//trees object
function makeTree(treeLocationX){
    var tree = {xt : treeLocationX,
                yt : 240,
                treeScale : random(0.1, 0.5),
                treeColor : color(0, random(75, 255), 0),
                speedT : -3,
                moveT : moveTree,
                displayT : displayTree}
    return tree;
}

function displayTree(){
    push();
    translate(this.xt + 60, this.yt); //add 60 so transitions onto screen
    fill(255);
    noStroke();
    scale(this.treeScale);
    
    //tree!
    noStroke();
    fill("brown");
    rect(0, 0, 10, -50);
    rect(1, 0, -10, -50);
    fill(this.treeColor);
    triangle(-60, -50, 60, -50, 0, -400);

    pop();
}

//update tree positions and display
function updateAndDisplayTree(){
    for(var i = 0; i < trees.length; i++){
        trees[i].moveT();
        trees[i].displayT();
    }
}

function addNewTree(){
    var newTreeProbability = 0.04;
    if (random(0, 1) < newTreeProbability){
        trees.push(makeTree(width));
    }
}

function removeTreeOutOfView (){
    //if star goes off left edge, remove from array
    var treesToKeep = [];
    for (var i = 0; i < trees.length; i++){
        if (trees[i].xt + 100 > 0) {
            treesToKeep.push(trees[i]);
        }
    }
    //trees left
    trees = treesToKeep;
}

function moveTree(){
    this.xt += this.speedT;
}



//shooting star object
function makeShootingStar(locationX){
    var shootingStar = {xs : locationX,
                ys : random(75, 125),
                shootingStarScale : random(0.1, 0.3),
                speedS : -8,
                moveS : moveShootingStar,
                displayS : displayShootingStar}
    return shootingStar;
}

function displayShootingStar(){
    push();
    translate(this.xs + 60, this.ys); //add 60 so transitions onto screen
    fill("yellow");
    noStroke();
    scale(this.shootingStarScale);
    
    //shooting star
    beginShape();
    vertex(50, 18);
    vertex(61, 37);
    vertex(83, 43);
    vertex(69, 60);
    vertex(71, 82);
    vertex(50, 73);
    vertex(29, 82);
    vertex(31, 60);
    vertex(17, 43);
    vertex(39, 37);
    endShape();

    stroke("yellow");
    strokeWeight(2);
    line(60, 37, 100, 37);
    line(60, 47, 110, 47);
    line(60, 57, 120, 57);

    pop();
}

//update tree positions and display
function updateAndDisplayShootingStars(){
    for(var i = 0; i < shootingStars.length; i++){
        shootingStars[i].moveS();
        shootingStars[i].displayS();
    }
}

function addNewShootingStars(){
    var newShootingStarsProbability = 0.008;
    if (random(0, 1) < newShootingStarsProbability){
        shootingStars.push(makeShootingStar(width));
    }
}

function removeShootingStarOutOfView (){
    //if star goes off left edge, remove from array
    var shootingStarsToKeep = [];
    for (var i = 0; i < shootingStars.length; i++){
        if (shootingStars[i].xs + 100 > 0) {
            shootingStarsToKeep.push(shootingStars[i]);
        }
    }
    //trees left
    shootingStars = shootingStarsToKeep;
}

function moveShootingStar(){
    this.xs += this.speedS;
}



Project 11-Generative Landscape

sketch
/* Evan Stuhlfire 
 * estuhlfi@andrew.cmu.edu section B
 * project-11-generative landscape */

var hills = [];
var trees = [];
var chickArray = [];
var imgArray = [];
var farm = [];
var barnImg;
var cowImg;
var planeObj;
var flyingPlane = false;

var scrollSpeed = 5;

function preload(){
    // preload images

    // URLs to imgur walking chick
    // Chick image licensed from Adobe stock images
    var filenames = [];
    filenames[0] = "https://i.imgur.com/kjBGzBF.png";
    filenames[1] = "https://i.imgur.com/hxvbkWZ.png";
    filenames[2] = "https://i.imgur.com/53MK7g1.png";
    filenames[3] = "https://i.imgur.com/6nrYJCw.png";
    filenames[4] = "https://i.imgur.com/XmPcBDa.png";
    filenames[5] = "https://i.imgur.com/3OusOsv.png";

    for (var i = 0; i < filenames.length; i++) {
        imgArray[i] = loadImage(filenames[i]);

    barnImg = loadImage("https://i.imgur.com/inS5Xdt.png");
    cowImg = loadImage("https://i.imgur.com/8XjQyMt.png");

    }
}

// methods
function stepChick() {
    // update the chick image to animate
    if(this.imgNum < chickArray.length - 2) {
        // increment to next image
        this.imgNum++;
    } else {
        // if at end of array reset to beginning
        this.imgNum = 0; 
    }
}

function drawChick() {
    // draw image
    image(imgArray[this.imgNum], this.x, this.y, 50, 50);
}

function drawOneHill() {
    // draw hill
    fill(this.c);
    stroke(0, 150, 0);
    strokeWeight(1);
    ellipse(this.x, this.y, this.w, this.hi);

    this.x -= this.s; // decrement by speed
}

function drawTree() {
    // draw trunk
    stroke(77, 38, 0);
    strokeWeight(3);
    line(this.x, this.y, this.x, this.y + (this.h * .8));
    line(this.x, this.y + this.h * .5, this.x + this.w * .2, 
        this.y + this.h * .2);
    line(this.x, this.y + this.h * .7, this.x - this.w * .1, 
        this.y + this.h * .1);

    // draw leaves
    fill(this.c);
    stroke(0, 100, 0);
    strokeWeight(1);
    ellipse(this.x, this.y, this.w, this.h);

    this.x -= this.speed; // decrement by speed
}

// object constructor functions
function newChick(cx, cy) {
    // constructor to make a chick
    var c = {x: cx, y: cy,
            imgNum: 0,
            stepFunction: stepChick,
            drawFunction: drawChick
        }
    return c;
}

function newHill(hx, hy, hw, hhi, hc, hs) {
    // create new hill at x, y with diameter d
    var h = {x: hx, y: hy, w: hw, hi: hhi, 
            c: hc, s: hs,
            drawFunction: drawOneHill
        };
    return h;
}

function newTree(tx, ty, tw, th, tc, ts) {
    // create new tree at x, y of height th, color tc
    // tree width = tw, tree speed = ts
    var t = {x: tx, y: ty, w: tw, h: th, c: tc, 
            speed: ts,
            drawFunction: drawTree
        };
    return t;
}

function newFarm(fx, fy, fi, fw, fh, fb) {
    // create new farm img at x, y
    // use farm image fi
    var f = {x: fx, y: fy, img: fi,
            w: fw, h: fh,
            speed: scrollSpeed,
            barn: fb
        };
    return f;
}

function newPlane(px, py, pdx, pdy) {
    // create plane object
    var p = {x: px, y: py, dx: pdx, dy: pdy};
    return p;
}

function setup() {
    createCanvas(480, 480);
    frameRate(10);
    imageMode(CENTER);

    // loop to create chick images
    for(var i = 0; i < imgArray.length; i++) {
        chickArray[i] = newChick(width/2, height * .7);
    }

    var onCanvas = true;
    // generate initial hills
    var numHills = floor(random(15, 20));
    // onCanvas = true for first set of hills to draw on canvas
    generateHills(onCanvas, numHills); 

    // create a farm
    generateFarm();

    // generate initial trees
    var numTrees = floor(random(1, 10));
    // onCanvas = true trees drawn on canvas
    generateTrees(onCanvas, numTrees, 1);
    generateTrees(onCanvas, numTrees, 2);
    generateTrees(onCanvas, numTrees, 3);
}

function draw() {
    // call all the parts of the scrolling background
    background(153, 179, 255);
    drawSun();
    // draw hills
    drawHills();
    removeHills();
    createNewHills();

    foreground();
    
    // draw farm elements, barns and cows
    drawFarm();
    removeFarm();
    createNewFarm();

    // draw trees
    drawTrees();
    removeTrees();
    createNewTrees(1);
    createNewTrees(2);
    createNewTrees(3);

    // animate the little chick
    drawLittleChick();

    // draw plane
    createPlane();
    drawPlane();
}

function drawSun() {
    // draw stationary sun
    fill(255, 255, 77, 200);
    stroke(255, 255, 26);
    strokeWeight(1);
    ellipse(width * .85, height * .1, 50, 50);
}

function foreground(){
    // draw grass
    fill(0, 153, 51);
    noStroke();
    rect(0, height/3, width, height);
    // draw path
    stroke(153, 102, 51);
    strokeWeight(20);
    line(0, height * .75, width, height * .75);
    // draw pebbles
    // generate differnt shades of tan
    stroke(random(210, 250), random(125, 220), random(85, 220));
    strokeWeight(3);
    var y = floor(random(height * .75 - 10, height * .75 + 10));
    var x = floor(random(0, width));
    point(x, y);
}

function drawLittleChick() {
    // loop through chick array call step and draw methods
    for(var i = 0; i < chickArray.length; i++) {
        var currentChick = chickArray[i];
        currentChick.stepFunction();
        currentChick.drawFunction();
    }
}

function createPlane() {
    // probability of a plane
    var newPlaneLikely = .0008;
    if(random(0, 1) < newPlaneLikely & !flyingPlane) {
        var y = floor(random(40, 100));
        var x = 0;
        var dx = random(2, 5);
        var dy = random(.1, .8);
        planeObj = newPlane(x, y, dx, dy);
        flyingPlane = true;
    }
}

function drawPlane() {
    if(flyingPlane) {
        stroke(230, 255, 255);
        strokeWeight(3);
        line(planeObj.x, planeObj.y, planeObj.x + 30, planeObj.y - 2);
        // draw wings
        strokeWeight(1);
        line(planeObj.x + 18, planeObj.y - 2, planeObj.x + 3, 
            planeObj.y + 5);
        line(planeObj.x + 18, planeObj.y - 1, planeObj.x + 20, 
            planeObj.y - 10);
        // draw tail
        line(planeObj.x, planeObj.y, planeObj.x - 3, planeObj.y -8);

        planeObj.x += planeObj.dx;
        planeObj.y -= planeObj.dy; 

        if(planeObj.x > width || planeObj.y < 0) {
            flyingPlane = false;
        }
    }

}

function createNewHills() {
    // probability of a hill
    var newHillLikely = .07;
    if(random(0, 1) < newHillLikely) {
        var numHills = floor(random(5, 12));
        var onCanvas = false;
        generateHills(onCanvas, numHills);
    }
}

function removeHills() {
    // if array has more items and hills have scrolled off screen
    var keep = [];

    if(hills.length >= 0) {
        for(var i = 0; i < hills.length; i++) {
            if(hills[i].x + hills[i].w/2 > 0) {
                keep.push(hills[i]);
            }
        }
        hills = keep;
    }
}

function drawHills() {
    // draw hills on canvas
    for(var i = 0; i < hills.length; i++) {
        var h = hills[i];
        h.drawFunction();
    }
}

function generateHills(onCanvas, num) {
    // if onCanvas = true then generate first set of hills
    // on canvas, otherwise generate off canvas

    // generate num number of new hills
    for(var i = 0; i < num; i++) {
        // generate hill color
        var g = floor(random(50, 230));
        var c = color(80, g, 0);

        // generate x, y, width, and height of hill
        var y = random(height/2.6, height/2);
        var w = random(100, width);
        var h = random(150, 250);

        if(onCanvas) {
            // generate hills on canvas
            var x = random(-w, width + w * 3);
            var w = random(width/2, width);
        } else {
            // generate hills off canvas
            var x = random(width + (w * 1.5), width * 3); 
        }

        var hill = newHill(x, y, w, h, c, 5);
        hills.push(hill);
    }
}

function createNewFarm(){
    // probability of a farm
    var newFarmLikely = .01;
    if(random(0, 1) < newFarmLikely) {
        generateFarm();
    }
}

function removeFarm() {
    // if array has more items and farms have scrolled off screen
    var keep = [];

    if(farm.length >= 0) {
        for(var i = 0; i < farm.length; i++) {
            if(farm[i].x + farm[i].w > 0) {
                keep.push(farm[i]);
            }
        }
        farm = keep;
    }
}

function generateFarm() {
    // create cows on farm
    var isBarn = false
    var numCows = floor(random(10, 30));
    for(var i = 0; i < numCows; i++) {
        // create a cow object and add it to the farm
        // array for each cow
        var x = random(width, width * 4);
        var y = random(height/2.2, height/3.5);

        if(y < height/2.7) {
            // make cows smaaller, they are further away
            var w = random(10, 15);
            var h = random(10, 15);
        } else {
            // make cows bigger, they are closer
            var w = random(25, 30);
            var h = random(25, 30);
        }

        var c = newFarm(x, y, cowImg, w, h, isBarn);
        farm.push(c);
    }

    // randomly generate barn variables
    var x = random(width + w, width * 2);
    var y = random(height/2.6, height/3.7);

    // if barn is further away, draw it smaller
    if(y < height/3.2) {
        var w = random(20, 40);
        var h = random(20, 40);
    } else {
        // close and bigger
        var w = random(60, 90);
        var h = random(50, 70);
    }

    isBarn = true;
    var f = newFarm(x, y, barnImg, w, h, isBarn);
    farm.push(f);
}

function drawFarm() {
    // draw farm on canvas
    var barnArray = [];
    if(farm.length > 0) {
        for(var i = 0; i < farm.length; i++) {
            var f = farm[i];
            if(f.barn) {
                barnArray.push(f);
            } else {
                // draw cows behind barns
                image(f.img, f.x, f.y, 
                    f.w, f.h);
                f.x -= f.speed; 
            }
        }
        // draw barns in their own layer on top of cows
        for(var i = 0; i < barnArray.length; i++) {
            var b = barnArray[i];
            image(b.img, b.x, b.y, b.w, b.h);
            b.x -= b.speed;
        }
        barnArray = [];
    }
}

function createNewTrees(layer) {
    var newTreeLikely = .012;
    var numTrees = floor(random(2, 4));
    // send false to generate off canvas
    var onCanvas = false;

    if(random(0, 1) < newTreeLikely) {
        generateTrees(onCanvas, numTrees, layer);
    }
}

function removeTrees() {
    // if array has more items and trees have scrolled off screen
    var keep = [];
    if(trees.length >= 0) {
        for(var i = 0; i < trees.length; i++) {
            if(trees[i].x + trees[i].w > 0) {
                keep.push(trees[i]);
            }
        }
        trees = keep;
    }
}

function drawTrees() {
    // draw trees on canvas
    if(trees.length >= 0) {
        for(var i = 0; i < trees.length; i++) {
            var t = trees[i];
            t.drawFunction();
        }
    }
}

function generateTrees(start, num, layer) {
    // if start = true then generate first set of trees
    // on canvas, otherwise generate off canvas

    // generate num number of new trees
    for(var i = 0; i < num; i++) {
        // generate tree color
        var r = floor(random(70, 100));
        var g = floor(random(80, 255));
        var b = floor(random(80, 120));
        if(layer == 1) {
            var c = color(r, g, b, 190); 
            // create big trees in background
            bigTrees(start, c);
        } else if(layer == 2) {
            r = floor(random(0, 150));
            g = floor(random(50, 150));
            b = floor(random(250, 255));
            var c = color(r, g, b, 190);
            // create little trees in midground
            littleTrees(start, c);
        } else {
            r = floor(random(250, 255));
            g = floor(random(30, 150));
            b = floor(random(80, 255));
            var c = color(r, g, b, 200);
            // create shrubs in foreground
            shrubs(start, c);
        }
    }
}

function bigTrees(start, c) {
    // generate x, y, width, and height of trees
    var w = random(50, 70);
    var h = random(40, 70); 

    var y = random(height/2.6, height/2.8);

    if(start) {
        // generate trees on canvas
        var x = random(5, width); 
    } else {
        // generate trees off canvas
        var x = random(width + w/2, width * 3); 
    }

    // create tree and add to array
    var tree = newTree(x, y, w, h, c, 5);
    trees.push(tree);
}

function littleTrees(start, c) {
    // generate x, y, width, and height of trees
    var w = random(30, 40);
    var h = random(15, 40); 

    var y = random(height/1.7, height/2);

    if(start) {
        // generate trees on canvas
        var x = random(5, width); 
    } else {
        // generate trees off canvas
        var x = random(width + w/2, width * 2); 
    }

    // create tree and add to array
    var tree = newTree(x, y, w, h, c, 5);
    trees.push(tree);
}

function shrubs(start, c) {
    // generate x, y, width, and height of trees
    var w = random(20, 40);
    var h = random(15, 20); 

    var y = random(height/1.1, height/1.3);

    if(start) {
        // generate trees on canvas
        var x = random(5, width); 
    } else {
        // generate trees off canvas
        var x = random(width + w/2, width * 3); 
    }

    // create tree and add to array
    var tree = newTree(x, y, w, h, c, 5);
    trees.push(tree);
}

LookingOutwards 11

In her article, Sohpie Davies sheds light on the increase of the “digital divide” during COVID-19 through two paintings; one of a woman reading an iPad and another of children dreaming of computers. The “digital gap” is the gap in accessibility to computers and the internet. Davies explains that during the pandemic when the use of the internet increased worldwide due to quarantine but only in the more-developed countries. While the internet allowed many people to sustain incomes and keep socially connected, it also needs to be said that computers and the internet can be as inclusive as they are exclusive. People who cannot access these technologies are quickly left behind, especially during COVID-19 when so much of the world went online for economic and social value. These people are minorities, often poor, and often in the least-developed countries. One such group is women. Worldwide, women are less likely to have and connect to technology because of gender inequality, and thus, in the workplace, which is swiftly becoming dominated by the internet, women are left with jobs of lesser value as they never learned skills to manage technology. The second painting Davis brings up explains how children during the pandemic were academically left behind because they could not afford the technology that would allow them to learn remotes. Both of these groups, due to discrimination or economic disadvantage are left behind in a world that is quickly moving past them. 

“Spanish art show spotlights ‘hidden’ digital divide in pandemic” by Sophie Davies

Vase depicting children dreaming of computers.