// Up It Up! // inspired by Peter Cho // color bgc, fgc, fgc2; float p_x, p_y; float p_fx, p_fy; float p_v2, p_vx, p_vy; float p_a2, p_ax, p_ay; float p_mass, p_drag; void setup() { size(670, 150, P3D); noStroke(); colorMode(RGB, 255); bgc = color(240, 255, 240); fgc = color(180, 220, 255,128); fgc2 = color(160, 200, 250,128); init_particle(.6, .9, width/2, height/2); } void draw() { background(bgc); pushMatrix(); iterate_particle(.15*(-p_x+mouseX), .15*(-p_y+(height-mouseY))); translate(width/2, height/2, 0); fill(fgc); drawK(); pushMatrix(); translate(0, 0, 1); translate(.75*(p_x-width/2), -.75*(p_y-height/2), 0); translate(.75*(p_x-width/2), -.75*(p_y-height/2), 0); rotateZ(atan2(-(p_y-height/2),(p_x-width/2)) + PI/2); rotateX(PI); rotateZ(-(atan2(-(p_y-height/2),(p_x-width/2)) + PI/2)); fill(fgc2); drawK(); popMatrix(); translate(0, 0, 2); translate(.75*(p_x-width/2), -.75*(p_y-height/2), 0); rotateZ(atan2(-(p_y-height/2),(p_x-width/2)) + PI/2); fill(bgc); beginShape(QUADS); vertex(-400, 0); vertex(+400, 0); vertex(+400, -400); vertex(-400, -400); endShape(); popMatrix(); } void init_particle(float _mass, float _drag, float ox, float oy) { p_x = ox; p_y = oy; p_v2 = 0.0f; p_vx = 0.0f; p_vy = 0.0f; p_a2 = 0.0f; p_ax = 0.0f; p_ay = 0.0f; p_mass = _mass; p_drag = _drag; } void iterate_particle(float fkx, float fky) { // iterate for a single force acting on the particle p_fx = fkx; p_fy = fky; p_a2 = p_fx*p_fx + p_fy*p_fy; if (p_a2 < 0.0000001) return; p_ax = p_fx/p_mass; p_ay = p_fy/p_mass; p_vx += p_ax; p_vy += p_ay; p_v2 = p_vx*p_vx + p_vy*p_vy; if (p_v2 < 0.0000001) return; p_vx *= (1.0 - p_drag); p_vy *= (1.0 - p_drag); p_x += p_vx; p_y += p_vy; } void drawK() { scale(1); translate(-83, +80); beginShape(QUADS); //u ver1 vertex(-195, -60, 0); vertex(-197, -140, 0); vertex(-225, -130, 0); vertex(-220, -55, 0); //u ver2 vertex(-140, -60, 0); vertex(-131, -135, 0); vertex(-159, -140, 0); vertex(-165, -60, 0); //u hor vertex(-160, -45, 0); vertex(-156, -70, 0); vertex(-205, -70, 0); vertex(-205, -44, 0); //p ver vertex(-90, -40, 0); vertex(-91, -135, 0); vertex(-115, -130, 0); vertex(-115, -40, 0); //p hor1 vertex(-50, -115, 0); vertex(-46, -140, 0); vertex(-105, -140, 0); vertex(-105, -114, 0); //p ver2 vertex(-35, -85, 0); vertex(-31, -130, 0); vertex(-59, -130, 0); vertex(-60, -85, 0); //p hor2 vertex(-55, -78, 0); vertex(-51, -100, 0); vertex(-100, -100, 0); vertex(-100, -78, 0); //i ver vertex(25, -40, 0); vertex(25, -100, 0); vertex(0, -100, 0); vertex(0, -40, 0); //i dot vertex(28, -110, 0); vertex(28, -135, 0); vertex(2, -135, 0); vertex(2, -110, 0); //t ver vertex(91, -35, 0); vertex(90, -110, 0); vertex(65, -110, 0); vertex(66, -35, 0); //t hor vertex(45, -109, 0); vertex(45, -135, 0); vertex(115, -136, 0); vertex(115, -110, 0); //u ver1 vertex(168, -55, 0); vertex(163, -130, 0); vertex(135, -130, 0); vertex(140, -55, 0); //u hor vertex(155, -39, 0); vertex(155, -65, 0); vertex(210, -65, 0); vertex(210, -39, 0); //u ver2 vertex(223, -55, 0); vertex(228, -130, 0); vertex(200, -130, 0); vertex(195, -55, 0); //p ver1 vertex(280, -46, 0); vertex(279, -135, 0); vertex(255, -130, 0); vertex(255, -48, 0); //p hor1 vertex(320, -115, 0); vertex(324, -140, 0); vertex(265, -140, 0); vertex(265, -114, 0); //p ver2 vertex(335, -85, 0); vertex(339, -130, 0); vertex(311, -130, 0); vertex(310, -85, 0); //p hor2 vertex(315, -78, 0); vertex(319, -100, 0); vertex(270, -100, 0); vertex(270, -78, 0); //X ver1 vertex(380, -65, 0); vertex(389, -135, 0); vertex(360, -140, 0); vertex(355, -65, 0); //X dot vertex(377, -55, 0); vertex(377, -35, 0); vertex(352, -35, 0); vertex(352, -55, 0); /*vertex(37.1992, -87.9990, 0); vertex(84.1987, -142.7979, 0); vertex(130.3979, -142.7979, 0); vertex(37.1992, -43.999, 0); vertex(77.5986-.2, -86.5986-.3, 0); vertex(136.998, 0, 0); vertex(90.7988, 0, 0); vertex(52.3994-.2, -59.999-.3, 0); */ endShape(); translate(+83, -81); }