Project 03 – Dynamic Drawing

This was inspired by an app I used to use on my mom’s iPod as a kid. I’m not very good at drawing, so I figured I would give the user a chance to draw. I’ve created a program based on degrees of symmetry that lets you alter the size of the brush, number of brushes, color of the brush, color of the background, and movement of the drawn elements. You can also save your creation by pressing p.

symmedraw2

// variable definitions
var degOfSymmetry = 36;
var curAngle = 0;
var diameter = 10;
let drawnCircs = [];
var radiate = false;
var radiateVelocity = 1;
var showRef = true;
let currentColor = ["red", "green", "blue"];
let colorVals = [255, 255, 255];
let backgroundCols = [0, 0, 0];
var colorIndex = 0;
var currentSelect = "Currently selected: " + currentColor[colorIndex];
var whatKey = "";
var rainbowMode = false;
var rainbowCtr = 0;
var freq = 0.01;

function setup() {
    createCanvas(600, 600);
    background(220);
    text("p5.js vers 0.9.0 test.", 10, 15);
}

function draw() {
    // define background based on color arrays
    background(backgroundCols[0], backgroundCols[1], backgroundCols[2]);
    noStroke();

    // set circle color based on user choice
    let c = color(colorVals[0], colorVals[1], colorVals[2]);
    if (rainbowMode) {
        var rr = sin(rainbowCtr) * 127 + 128;
        var rg = sin(rainbowCtr + (2*PI/3)) * 127 + 128;
        var rb = sin(rainbowCtr + (4*PI/3)) * 127 + 128;
        c = color(rr, rg, rb);
    }
    fill(c);

    // self explanatory
    getAngle();

    // define a center, get relative mouse radius
    var centerX = width / 2;
    var centerY = height / 2;
    var radX = mouseX - centerX;
    var radY = mouseY - centerY;
    var mouseRad = sqrt(pow(radX, 2) + pow(radY, 2));
    
    // draw a circle for each degree of symmetry 
    for (i = 0; i < degOfSymmetry; i++) {
        var loopAngle = curAngle - (i * 2*PI / degOfSymmetry)
        var tX = centerX + mouseRad * cos(loopAngle);
        var tY = centerY + mouseRad * sin(loopAngle);
        circle(tX, tY, diameter);
        
        // add to circle history if clicked
        if (mouseIsPressed) {
            drawnCircs.push([tX, tY, diameter, c, loopAngle]);
        }
    }

    // draw each circle from history
    for (i = 0; i < drawnCircs.length; i++) {
        fill(drawnCircs[i][3]);
        circle(drawnCircs[i][0], drawnCircs[i][1], drawnCircs[i][2]);

        // if radiating, begin changing circle positions
        if (radiate) {
            drawnCircs[i][0] += radiateVelocity * cos(drawnCircs[i][4]);
            drawnCircs[i][1] += radiateVelocity * sin(drawnCircs[i][4]);
            if (drawnCircs[i][0] > width || drawnCircs[i][0] < 0) {
                drawnCircs.splice(i, 1); // remove circles for speed
            } else if (drawnCircs[i][1] > height || drawnCircs[i][1] < 0) {
                drawnCircs.splice(i, 1); // remove circles for speed
            }
        }
    }

    // increment counter for rainbow mode
    rainbowCtr = (rainbowCtr + freq) % (2*PI); 

    // display onscreen reference
    if (showRef) {
        fill(255);
        text("ref: c=change color, d=change degrees of symmetry " +
                "s=change circle size, b=background color \n" +
                "o=clear screen, r=radiate outwards, p=save screen as png " +
                "v=set radiate velocity\n q=rainbow color cycle, " +
                "up/down arrow=color/velocity val+-1, right/left arrow=+-10\n" +
                "i=change selected color, enter=hide ref, y=rainbow speed", 
                10, height - 50);
        text(currentSelect, 10, 15);
        text("RGB: " + (colorVals.toString(10)), 10, 30);
        text("Radiate Velocity " + radiateVelocity.toString(10), 10, 45);
        text("Background RGB: " + (backgroundCols.toString(10)), 10, 60);
        text("Circle Size: " + (diameter.toString(10)), 10, 75);
        text("Degrees of Symmetry: " + (degOfSymmetry.toString(10)), 10, 90);
        text("Rainbow Frequency: " + (freq.toString(10)), 10, 105);
    }
}

// gets angle from mouse pos
function getAngle() {
    curAngle = atan2(mouseY - height / 2, mouseX - width / 2);
    if (mouseX - width / 2 == 0) {
        if (mouseY - height / 2 > 0) {
            curAngle = HALF_PI;
        } else {
            curAngle = 3 * HALF_PI;
        }
    }
}

function keyPressed() {
    // checks what key is pressed, performs an action, or sets a flag
    if (key == "c") {
        whatKey = "c";
        currentSelect = "Currently selected: " + currentColor[colorIndex];
    }
    if (key == "o") {
        drawnCircs = [];
    }
    if (key == "s") {
        whatKey = "s";
        currentSelect = "Currently selected: circle size";
    }
    if (key == "b") {
        whatKey = "b";
        currentSelect = "Currently selected: background color";
    }
    if (key == "d") {
        whatKey = "d";
        currentSelect = "Currently selected: degrees of symmetry";
    }
    if (key == "r") {
        radiate = !radiate;
    }
    if (key == "q") {
        rainbowMode = !rainbowMode;
    }
    if (key == "v") {
        whatKey = "v";
        currentSelect = "Currently selected: velocity"
    }
    if (key == "p") {
        save("canvas_drawing.png");
    }
    if (key == "i") {
        colorIndex = (colorIndex + 1) % 3;
        currentSelect = "Currently selected: " + currentColor[colorIndex];
    }
    if (key == "Enter") {
        showRef = !showRef;
    }
    if (key == "y") {
        whatKey = "y";
        currentSelect = "Currently selected: Rainbow Cycle Speed";
    }

    // changing parameters that affect drawing and motion
    if (keyCode == UP_ARROW) {
        if (whatKey == "d") {
            degOfSymmetry += 1;
        }
        if (whatKey == "c") {
            colorVals[colorIndex] += 1;
        }
        if (whatKey == "v") {
            radiateVelocity += 1;
        }
        if (whatKey == "b") {
            backgroundCols[colorIndex] += 1;
        }
        if (whatKey == "s") {
            diameter += 1;
        }
        if (whatKey == "y") {
            freq += 0.01;
        }
    }
    if (keyCode == DOWN_ARROW) {
        if (whatKey == "d") {
            degOfSymmetry -= 1;
        }
        if (whatKey == "c") {
            colorVals[colorIndex] -= 1;
        }
        if (whatKey == "v") {
            radiateVelocity -= 1;
        }
        if (whatKey == "b") {
            backgroundCols[colorIndex] -= 1;
        }
        if (whatKey == "s") {
            diameter -= 1;
        }
        if (whatKey == "y") {
            freq -= 0.01;
        }
    }
    if (keyCode == RIGHT_ARROW) {
        if (whatKey == "d") {
            degOfSymmetry += 10;
        }
        if (whatKey == "c") {
            colorVals[colorIndex] += 10;
        }
        if (whatKey == "v") {
            radiateVelocity += 10;
        }
        if (whatKey == "b") {
            backgroundCols[colorIndex] += 10;
        }
        if (whatKey == "s") {
            diameter += 10;
        }
        if (whatKey == "y") {
            freq += 0.10;
        }
    }
    if (keyCode == LEFT_ARROW) {
        if (whatKey == "d") {
            degOfSymmetry -= 10;
        }
        if (whatKey == "c") {
            colorVals[colorIndex] -= 10;
        }
        if (whatKey == "v") {
            radiateVelocity -= 10;
        }
        if (whatKey == "b") {
            backgroundCols[colorIndex] -= 10;
        }
        if (whatKey == "s") {
            diameter -= 10;
        }
        if (whatKey == "y") {
            freq -= 0.10;
        }
    }

    return false;
}

Getting the symmetry correct was a little difficult, as well as figuring out how to deal with user input.

LO-03

For this week’s Looking Out, I have decided to pick James Tyrwhitt-Drake’s 2015 creation, 4-Dimensional Polytope visualization. A polytope is a geometric shape that has flat sides. Personally, I find this project admirable because I have been interested in visualizing shapes of greater than 3-dimensions for quite a while. As such, I appreciate this visualization a great deal. I am unsure about many of the algorithms that generated this work, but I can assume that many of the parameters of the polytope depend on its number of points, sides, and viewing angle of the polytope. I also believe that, because a polytope is constructed using lower dimensional shapes, the number of points is actually represented by shapes like that one seen below. Although we are unable to truly see what a 4D shape would look like, I find it very interesting that we still have ways to visualize them.

An example of a polytope generated by the program.

Project 03 – Dynamic Drawing

Is the code more complicated than it needs to be? Yes. Did it still take me way too long to figure out? Also Yes.

sketch
//Iris Yip
//15104 Section D

var wwidth = 600,
    wheight = 600,
    ballsize, //radius
    ballx, 
    bally, 
    hvelocity, 
    vvelocity,
    clickdistance,
    rvalue,greenvalue,bluevalue;

function setup() {
  
  createCanvas(wwidth, wheight);
  
  // starting point
  ballx = wwidth/2;
  bally = wheight/2;
  
  // starting velocity
  hvelocity = random(-5,5);
  vvelocity = random(-5,5);
  
  // starting ball size
  ballsize = random(10,150);
  
  // ball color
  redvalue = random(100,255);
  greenvalue = random(100,255);
  bluevalue = random(100,255);
  
};

function draw() {
  
  
  //background
  background(0)
  let rectBlue = map(mouseY, 0, height, 0, 255);
  fill(255, rectBlue, 200);
  rect(0,0, 600, 600);
  
  
  fill(redvalue, greenvalue, bluevalue);
  ellipse(mouseX, mouseY, 100, 100);


    
  // ball bounce-back conditions
  if(ballx >= width - ballsize || ballx <= ballsize){
    hvelocity = -hvelocity;
  };
  if(bally >= height - ballsize || bally <= ballsize){
    vvelocity = -vvelocity;
  };
  
  // ball location change
  ballx += hvelocity;
  bally += vvelocity;
  
  // render ball
  noStroke();
  fill(redvalue, greenvalue, bluevalue);
  ellipse(ballx, bally, ballsize * 2, ballsize * 2);
  
  
};
  
function mouseClicked() {
  {
    
    clickdistance = dist(mouseX, mouseY, ballx, bally);
    
    if(clickdistance <= ballsize) {
      
      // change velocity if clicked on the ball
      hvelocity = random(-5,5);
      vvelocity = random(-5,5);
      
      // change ball color
      redvalue = random(100,255);
      greenvalue = random(100,255);
      bluevalue = random(100,255);
      
      //changing ball size
      ballsize = random(50,100);
      
    };
  
  };

  
};

LO-03 Generative Physical Forms

Iris Yip iyip
15-104 Section D
LO-03

[Mild Trypophobia Warning! Please do not click on any of the links if you are sensitive to the subject matter. Thank you for your understanding!]

This week, I looked at ‘Colony‘ by Nervous Systems, a project where the artists combine the use of 3D printing, data visualisation, and the use of a virtual environment to explore coral reefs in nature as a look into how generative sculpture/design is used to visually represent/mimic aspects of nature. The project is currently ongoing, but like many of their other works/series, Nervous System utilises custom software in order to algorithmically depict generative growth.

It is currently an ongoing project, and their current focus is on extrapolating and replicating the “lives of colonial, sessile invertebrates”; hence the name, “Colony”. I found this project really intriguing as their ingenious use of computational fabrication to study; and to some extent even replicate, nature indicative of the possibilities generative/algorithm based design can bring to our physical world.

LO-03 PHYSICAL GENERATIVE ART FORMS

The role of computational design on furniture design has been developing and advancing the limits of furniture. QERMEZi’s Futuristic Furniture expresses realistic versions of futuristic furniture through elements of futurism aesthetics. Designers investigate elements relating to outer space, linearity, biomimicry, organic forms, asymmetrical low gravity forms, etc. These collaborated with functional purposes are explored through dynamic experimentation of form, surface, and material.

QERMEZi uses Rhinoceros for their design software. Rhino allows intricate modeling of organic shapes and Grasshopper aids in the computational and parametric formations of geometrical shapes. Using this 3D software, QERMEZi is able to visualize complex structures and explore parametric design to produce furniture that challenges aesthetic, functionality, technology, and purpose.

The final form of QERMEZi’s furniture designs is conceptualized and manufactured through profound research in ergonomics, material science, computational science, aesthetics, geological studies, and social sciences. By allowing furniture design to reflect various contexts, QERMEZi is able to produce a product which abstracts these collective experiences.

SANAM CHAIR- QERMEZi.L.L.C

PROJECT 03- DYNAMIC DRAWING

JUNELEE_P03
//JUNE LEE
//SECTION C

var offset=20;
var diam=0;

function setup() {
    createCanvas(600,450);
}

function draw() {

//background change
    if (mouseX>(width/2)) {
    	background(245,245,142);
    } else {
    	background(240,220,106);
    }

// purple LIGHT increasing size USING
	noStroke();
	fill(215,209,240);
	diam=mouseY;
	ellipse(600/2,height/2,diam,diam);


//circle slant line mouse Y
	fill(148,132,215);
	noStroke();

	ellipse(0,mouseY-40,30,30);
	ellipse(0+(offset*2),mouseY-35,30,30);
	ellipse(0+(offset*4),mouseY-30,30,30);
	ellipse(0+(offset*6),mouseY-25,30,30);
	ellipse(0+(offset*8),mouseY-20,30,30);
	ellipse(0+(offset*10),mouseY-15,30,30);
	ellipse(0+(offset*12),mouseY-10,30);
	ellipse(0+(offset*14),mouseY-5,30,30);
	ellipse(0+(offset*16),mouseY,30,30);
	ellipse(0+(offset*18),mouseY+5,30,30);
	ellipse(0+(offset*20),mouseY+10,30,30);
	ellipse(0+(offset*22),mouseY+15,30,30);
	ellipse(0+(offset*24),mouseY+20,30,30);
	ellipse(0+(offset*26),mouseY+25,30,30);
	ellipse(0+(offset*28),mouseY+30,30,30);
	ellipse(0+(offset*30),mouseY+35,30,30);	

//rect line mouse X
	noStroke();
	fill(111,88,209);

	rect(0,mouseX+40,20,30);
	rect(0+(offset*2),mouseX+35,20,30);
	rect(0+(offset*4),mouseX+30,20,30);
	rect(0+(offset*6),mouseX+25,20,30);
	rect(0+(offset*8),mouseX+20,20,30);
	rect(0+(offset*10),mouseX+15,20,30);
	rect(0+(offset*12),mouseX+10,20,30);
	rect(0+(offset*14),mouseX+5,20,30);
	rect(0+(offset*16),mouseX,20,30);
	rect(0+(offset*18),mouseX-5,20,30);
	rect(0+(offset*20),mouseX-10,20,30);
	rect(0+(offset*22),mouseX-15,20,30);
	rect(0+(offset*24),mouseX-20,20,30);
	rect(0+(offset*26),mouseX-25,20,30);
	rect(0+(offset*28),mouseX-30,20,30);
	rect(0+(offset*30),mouseX-35,20,30);
	rect(0+(offset*32),mouseX-40,20,30);

//text fixed
	translate(0,0);
	textAlign(CENTER);
    fill(0);
	noStroke();
    textSize(10);
    text("JUNE LEE / SECTION C",width/2,10);

//text curve
	translate(100,150);
    rotate(radians(mouseX/7));
	fill(0);
	noStroke();
    textSize(20);
    text("JUNE LEE / SECTION C",200,20);

}

I wanted to make all aspects relate to the mouse position. I explored size, position (x and y), color, and position (rotation) through this drawing.

Project-03

sketch3
function setup() {
    createCanvas(600, 450);
    background(220);
    text("p5.js vers 0.9.0 test.", 10, 15);
}

function draw() {
	background(240, 156, 215);
	var h = min(mouseY/3, 50);
	var c = min(mouseY/2, 255);
	var w = max(min(mouseY/3, 50), mouseX/6);
	noStroke();
    fill(c); 
    //perimeter circles
    ellipse(30, 25, w, h);
    ellipse(30, 75, w, h);
    ellipse(30, 125, w, h);
    ellipse(30, 175, w, h);
    ellipse(30, 225, w, h);
    ellipse(30, 275, w, h);
    ellipse(30, 325, w, h);
    ellipse(30, 375, w, h);
    ellipse(30, 425, w, h);
    ellipse(138, 25, w, h);
    ellipse(246, 25, w, h);
    ellipse(354, 25, w, h);
    ellipse(462, 25, w, h);
    ellipse(570, 25, w, h);
    ellipse(570, 75, w, h);
    ellipse(570, 125, w, h);
    ellipse(570, 175, w, h);
    ellipse(570, 225, w, h);
    ellipse(570, 275, w, h);
    ellipse(570, 325, w, h);
    ellipse(570, 375, w, h);
    ellipse(570, 425, w, h);
    ellipse(138, 425, w, h);
    ellipse(246, 425, w, h);
    ellipse(354, 425, w, h);
    ellipse(462, 425, w, h);

	//lots of layered rectangles
	push();
	translate(300, 225);
	rotate(radians(mouseX));
	rectMode(CENTER);
	fill(214, 33, 235, mouseX/2); //purple
	rect(0, 0, mouseX, mouseX);
	fill(48, 167, 246, mouseX/2); //light blue
	rect(0, 0, (mouseX-20), (mouseX-20));
	fill(33, 236, 141, mouseX/2); //light green
	rect(0, 0, (mouseX-40), (mouseX-40));
	fill(236, 33, 101, mouseX/2); //hot pink
	rect(0, 0, (mouseX-60), (mouseX-60));
	fill(236, 128, 33, mouseX/2); //orange
	rect(0, 0, (mouseX-80), (mouseX-80));
	fill(229, 236, 33, mouseX/2); //yellow
	rect(0, 0, (mouseX-100), (mouseX-100));
    fill(214, 33, 235, mouseX/2); //purple (start repeat)
	rect(0, 0, (mouseX-120), (mouseX-120));
	fill(48, 167, 246, mouseX/2); //light blue
	rect(0, 0, (mouseX-140), (mouseX-140));
	fill(33, 236, 141, mouseX/2); //light green
	rect(0, 0, (mouseX-160), (mouseX-160));
	fill(236, 33, 101, mouseX/2); //hot pink
	rect(0, 0, (mouseX-180), (mouseX-180));
	fill(236, 128, 33, mouseX/2); //orange
	rect(0, 0, (mouseX-200), (mouseX-200));
	fill(229, 236, 33, mouseX/2); //yellow
	rect(0, 0, (mouseX-220), (mouseX-220));
	fill(214, 33, 235, mouseX/2); //purple (round 3)
	rect(0, 0, (mouseX-240), (mouseX-240));
	fill(48, 167, 246, mouseX/2); //light blue
	rect(0, 0, (mouseX-260), (mouseX-260));
	fill(33, 236, 141, mouseX/2); //light green
	rect(0, 0, (mouseX-280), (mouseX-280));
	fill(236, 33, 101, mouseX/2); //hot pink
	rect(0, 0, (mouseX-300), (mouseX-300));
	fill(236, 128, 33, mouseX/2); //orange
	rect(0, 0, (mouseX-320), (mouseX-320));
	fill(229, 236, 33, mouseX/2); //yellow
	rect(0, 0, (mouseX-340), (mouseX-340)); 
	fill(214, 33, 235, mouseX/2); //purple (round 4)
	rect(0, 0, (mouseX-360), (mouseX-360));
	fill(48, 167, 246, mouseX/2); //light blue
	rect(0, 0, (mouseX-380), (mouseX-380));
	fill(33, 236, 141, mouseX/2); //light green
	rect(0, 0, (mouseX-400), (mouseX-400));
	fill((236-(mouseX/2)), 33, 101, mouseX/2); //color will change on a scale between hot pink and dark blue
	rect(0, 0, (mouseX-420), (mouseX-420));
	pop();

    //curves
	noFill();
	stroke(255);
	strokeWeight(3);
	bezier(0, 0, 200, mouseY, 400, mouseY, 600, 0);
	bezier(0, 0, 200, (mouseY - 20), 400, (mouseY - 20), 600, 0);
	bezier(0, 0, 200, (mouseY - 40), 400, (mouseY - 40), 600, 0);
	bezier(0, 0, 200, (mouseY - 60), 400, (mouseY - 60), 600, 0);
	bezier(0, 0, 200, (mouseY - 80), 400, (mouseY - 80), 600, 0);
	bezier(0, 450, 200, (450 - mouseY), 400, (450 - mouseY), 600, 450);
    bezier(0, 450, 200, (470 - mouseY), 400, (470 - mouseY), 600, 450);
    bezier(0, 450, 200, (490 - mouseY), 400, (490 - mouseY), 600, 450);
    bezier(0, 450, 200, (510 - mouseY), 400, (510 - mouseY), 600, 450);
    bezier(0, 450, 200, (530 - mouseY), 400, (530 - mouseY), 600, 450);

}

I made this to experiment with different shapes, colors, and shapes. My original idea had a circle in the center instead of the rectangle, but after writing it, I realized that you couldn’t tell that the circle was rotating. I tried adding some lines across the circle to get the effect, but then I tried changing the shape and I liked that a lot more. I was also still able to include ellipses along the perimeter of the canvas. For the colors, I used a color reference website and started layering colors that I liked. Once I settled on the ones that I would use, I experimented with the order and the fade.

LO-03

Bearth & Deplazes Architects designed a building for a winery that was built using a robotic production method that a team developd for this purpose. The technology helps to lay 20,000 bricks at exact measurments for both practical and design purposes. From a practical standpoint, the building allows for a very specific amount of natural light and airflow permeation, considering that a large room in the building is used for fermenation, but that there is also a terrace at the top of the building for wine tastings and social events. The architects are also able to utilize this design precision for their artistic senses as well. They program the bricks to be rotated in a way that looks like grapes. The vertical concrete structural pillars look like a basket, so the artists say that the side of the building is intended to replicate a basket of grapes.
I selected this work because I like how the building combines art and practicality: the winey could have built any box-shaped building for their fermentation room, but they chose something a lot more interesting and visually appealing.

A winery in Switerland; Bearth & Deplazes Architects and Gramazio & Kohler (2006)

Project-03-Dynamic Drawing

proj3Download
// Amyas Ryan   Section A

function setup() {
    createCanvas(600, 450);

}

function draw() {
    background(62, 100, 144);
    noStroke();

    //top ellipses
    let tone = 255 - (mouseY / 6)
    fill(tone , 105, 22);
    ellipse(100, 0, 100, mouseY * 1.5);
    fill(235, tone, 22);
    ellipse(300, 0, 100, mouseY * 1.5);
    fill(235, 105, tone);
    ellipse(500, 0, 100, mouseY * 1.5);

    //bottom ellipses
    fill(185, tone, 106)
    ellipse(0, 450, 100, mouseY * 1.5);
    fill(tone, 49, 106)
    ellipse(200, 450, 100, mouseY * 1.5);
    fill(185, 49, tone)
    ellipse(400, 450, 100, mouseY * 1.5);
    fill(tone, 49, tone)
    ellipse(600, 450, 100, mouseY * 1.5);

    //squares
    let opacity = 255 - (mouseX / 6);
    let sw = (mouseX / 4);
    stroke(255, 255, 255, sw);
    push();
    translate(100, 110);
    rectMode(CENTER);
    rotate(radians(mouseX));
    scale(mouseX / 30);
    fill(172, 68, 58, opacity);
    rect(0, 0, 20, 20);
    pop();
    push();
    translate(300, 220);
    rectMode(CENTER);
    rotate(radians(mouseX));
    scale(mouseX / 30);
    fill(242, 187, 49, opacity);
    rect(0, 0, 20, 20);
    pop();
    push();
    translate(480, 50);
    rectMode(CENTER);
    rotate(radians(mouseX));
    scale(mouseX / 30);
    fill(219, 163, 175, opacity);
    rect(0, 0, 20, 20);
    pop();
    push();
    translate(430, 350);
    rectMode(CENTER);
    rotate(radians(mouseX));
    scale(mouseX / 30);
    fill(212, 108, 64, opacity);
    rect(0, 0, 20, 20);
    pop();

}

Looking Outwards-03

I chose a digitally fabricated art piece by the group FIIDAA Art, which was created by the artist Cha Jong-Rye.
The work resembles a crumpled piece of fabric or paper, but is entirely composed on laminated plywood sheets.
I assume that the form was generated in some sort of three dimensional modeling software, such as Rhino3d or Maya
using parametric inputs. In terms of the fabrication, the model was split into many thin layers the same depth as the
plywood sheets. Then, each sheet was individually cut by a CNC router and then laminated together to created the final
form. I chose this work because I have made work with this same process, but at a much smaller scale.

https://www.fiidaaart.com/artists-ai/cha-jong-rye-cj-03