> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.ShUVPSn3VaO/rev.2
 * 
 * authors: 
 *   (Unnamed author)

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



// This sketch builds on a prior work, "Untitled Sketch", created by coco & Princess Sunshine
// http://sketchpad.cc/sp/pad/view/ro.exasJ6g$y09/rev.1054



/*****************************************
 * Assignment 08
 * Name:         Jenny Wang
 * E-mail:       [email protected]
 * Course:       CS 110 - Section 02
 * Submitted:    05-13-2011
 *
 * For this extra credit assignment, I modified 
 * my 6th assignment to incorporate multi-
 * dimensional arrays to fulfill the 
 * requirements of the assignemnt. I worked really
 * hard on assignment 6 and I want it to help me
 * some more points! :)
 *
 * I combined the starfield code and penguinField
 * code as the backbone for this sketch. However,
 * instead of penguins, I wanted the viewer to be
 * flying through space with the 12 zodiac 
 * constellations - Aries, Taurus, Gemini, Cancer,
 * Leo, Virgo, Libra, Scorpio, Sagittarius, Capricorn,
 * Aquarius and Pisces. 
 *
 ***********************************************/

int AQUARIUS = 0;
int ARIES = 1;
int CANCER = 2;
int CAPRICORN = 3;
int GEMINI = 4;
int LEO = 5;
int LIBRA = 6;
int PISCES = 7;
int SAGITTARIUS = 8;
int SCORPIO = 9;
int TAURUS = 10;
int VIRGO = 11;
int mode;

float centerX;
float centerY;

// a multi-dimensional array!
Constellation [] [] constellation = new Constellation [12][2]; 

// a plain old array... 
Star[] stars = new Star[400];

void setup() {
  size(600, 600);
  smooth();
  stroke(255);
  strokeWeight(1);
  rectMode(CENTER);

  centerX = 0.5*width;
  centerY = 0.5*height;

  // Init all stars
  for (int i=0; i<stars.length; i++) 
    stars[i] = new Star();

  // Init all constellations  
  for (int i=0; i<constellation.length; i++) {
    for ( int j=0; j<constellation[i].length; j++) {
      constellation[i][j] = new Constellation( i );
    }
  }
}

void draw() {
  background(0);

  // Draw all stars wrt center of screen
  translate(0.5*width, 0.5*height);

  // Update and draw all stars
  for (int i=0; i<stars.length; i++) {
    stars[i].update();
    stars[i].draw();
  }

  // Update and draw all constellations
  for (int i=0; i<constellation.length; i++) {
    for (int j=0; j<constellation[i].length; j++) {
      constellation[i][j].update();
      constellation[i][j].draw();
    }
  }
}

  class Star {
    // Star coordinates in 3D
    float x;
    float y;
    float z;

    Star() {
      x = random(-5000, 5000);
      y = random(-5000, 5000);
      z = random(0, 2000);
    }

    void update() {
      z-=10;        // Move star closer to viewport
      if (z <= 0.0) // Reset star if it passes viewport
        reset();
    }

    void reset() {
      // Reset star to a position far away
      x = random(-5000, 5000);
      y = random(-5000, 5000);
      z = 2000.0;
    }

    void draw() {
      // Project star only viewport
      float offsetX = 100.0*(x/z);
      float offsetY = 100.0*(y/z);
      float scaleZ = 0.0001*(2000.0-z);

      // Draw this star
      pushMatrix();
      translate(offsetX, offsetY);
      scale(scaleZ);
      fill (255);
      ellipse(0,0,20,20);
      popMatrix();
    }
  }

class Constellation {

  // Declare variables
  float x;
  float y;
  float z;
  float r;

  Constellation( int mode ) {
    // Assign values to variables
    x = random(-5000, 5000);
    y = random(-5000, 5000);
    z = random(0, 2000);
    r = random(0, TWO_PI);
  }

  // Update the constellation to rotate with an increasing radius until it
  // has reached the viewer
  void update() {
    z-=10;
    r = (r + 0.05) % TWO_PI;
    if (z <= 0.0) reset();
  }

  // Reset the constellation to show up randomly far away (to come toward
  // viewer again)
  void reset() {
    x = random(-5000, 5000);
    y = random(-5000, 5000);
    z = 2000.0;
  }

  void draw() {
    float offsetX = (x/z)*100.0;
    float offsetY = (y/z)*100.0;
    float scaleZ = 0.001*(2000.0-z);

    noFill();
    translate(offsetX+centerX, offsetY+centerY);
    scale(scaleZ,scaleZ);
    rotate(r);

    if (mode == AQUARIUS) {
      drawAquarius();
    }
    if (mode == ARIES) {
      drawAries();
    }
    if (mode == CANCER) {
      drawCancer();
    }
    if (mode == CAPRICORN) {
      drawCapricorn();
    }
    if (mode == GEMINI) {
      drawGemini();
    }
    if (mode == LEO) {
      drawLeo();
    }
    if (mode == LIBRA) {
      drawLibra();
    }
    if (mode == PISCES) {
      drawPisces();
    }
    if (mode == SAGITTARIUS) {
      drawSagittarius();
    }
    if (mode == SCORPIO) {
      drawScorpio();
    }
    if (mode == TAURUS) {
      drawTaurus();
    }    
    else if (mode == VIRGO) {
      drawVirgo();
    }
  }

  //Aquarius
  void drawAquarius() {
    pushMatrix();
    beginShape();
    vertex(119, 183);
    vertex(106, 174);
    vertex(102, 171);
    vertex(85, 172);
    vertex(85, 185);
    vertex(64, 159);
    vertex(67, 153);
    vertex(73, 151);
    vertex(72, 138);
    vertex(98, 122);
    vertex(122, 102);
    endShape();
    beginShape();
    vertex(72, 138);
    vertex(94, 148);
    vertex(110, 146);
    endShape();

    ellipse(119, 183,3,3);
    ellipse(106, 174,3,3);
    ellipse(102, 171,3,3);
    ellipse(85, 172,3,3);
    ellipse(85, 185,3,3);
    ellipse(64, 159,3,3);
    ellipse(67, 153,3,3);
    ellipse(73, 151,3,3);
    ellipse(72, 138,3,3);
    ellipse(98, 122,3,3);
    ellipse(122, 102,3,3);
    ellipse(72, 138,3,3);
    ellipse(94, 148,3,3);
    ellipse(110, 146,3,3);
    popMatrix();
  }

  //Aries
  void drawAries () {
    pushMatrix();
    beginShape();
    vertex(65, 301);
    vertex(90, 307);
    vertex(101, 313);
    vertex(103, 319);
    endShape();

    ellipse(65, 301,3,3);
    ellipse(90, 307,3,3);
    ellipse(101, 313,3,3);
    ellipse(103, 319,3,3);
    popMatrix();
  }

  //Cancer
  void drawCancer() {
    pushMatrix();
    beginShape();
    vertex(309, 347);
    vertex(320, 362);
    vertex(323, 369);
    vertex(321, 390);
    vertex(323, 369);
    vertex(352, 379);
    endShape();

    ellipse(309, 347,3,3);
    ellipse(320, 362,3,3);
    ellipse(323, 369,3,3);
    ellipse(321, 390,3,3);
    ellipse(323, 369,3,3);
    ellipse(352, 379,3,3);
    popMatrix();
  }

  //Capricorn
  void drawCapricorn () {
    pushMatrix();
    beginShape();
    vertex(163, 54);
    vertex(165, 60);
    vertex(179, 99);
    vertex(179, 105);
    vertex(170, 108);
    vertex(158, 118);
    vertex(146, 118);
    vertex(137, 122);
    vertex(140, 116);
    vertex(145, 106);
    vertex(152, 98);
    vertex(165, 61);
    endShape();

    ellipse(163, 54,3,3);
    ellipse(165, 60,3,3);
    ellipse(179, 99,3,3);
    ellipse(179, 105,3,3);
    ellipse(170, 108,3,3);
    ellipse(158, 118,3,3);
    ellipse(146, 118,3,3);
    ellipse(137, 122,3,3);
    ellipse(140, 116,3,3);
    ellipse(145, 106,3,3);
    ellipse(152, 98,3,3);
    ellipse(165, 61,3,3);
    popMatrix();
  }

  //Gemini
  void drawGemini() {
    pushMatrix();
    beginShape();
    vertex(265, 391);
    vertex(259, 393);
    vertex(256, 400);
    vertex(252, 410);
    vertex(247, 421);
    vertex(252, 410);
    vertex(231, 403);
    vertex(220, 398);
    vertex(207, 393);
    vertex(207, 388);
    vertex(214, 374);
    vertex(218, 375);
    vertex(225, 376);
    vertex(248, 388);
    vertex(259, 393);
    endShape();
    ellipse(265, 391,3,3);
    ellipse(259, 393,3,3);
    ellipse(256, 400,3,3);
    ellipse(252, 410,3,3);
    ellipse(247, 421,3,3);
    ellipse(252, 410,3,3);
    ellipse(231, 403,3,3);
    ellipse(220, 398,3,3);
    ellipse(207, 393,3,3);
    ellipse(207, 388,3,3);
    ellipse(214, 374,3,3);
    ellipse(218, 375,3,3);
    ellipse(225, 376,3,3);
    ellipse(248, 388,3,3);
    ellipse(259, 393,3,3);
    popMatrix();
  }

  //Leo
  void  drawLeo() {
    pushMatrix();
    beginShape();
    vertex(374, 277);
    vertex(364, 279);
    vertex(363, 297);
    vertex(370, 303);
    vertex(380, 302);
    vertex(393, 311);
    vertex(355, 340);
    vertex(342, 357);
    vertex(346, 330);
    vertex(370, 303);
    endShape();
    ellipse(374, 277,3,3);
    ellipse(364, 279,3,3);
    ellipse(363, 297,3,3);
    ellipse(370, 303,3,3);
    ellipse(380, 302,3,3);
    ellipse(393, 311,3,3);
    ellipse(355, 340,3,3);
    ellipse(342, 357,3,3);
    ellipse(346, 330,3,3);
    ellipse(370, 303,3,3);
    popMatrix();
  }

  //Libra
  void drawLibra() {
    pushMatrix();
    beginShape();
    vertex(368, 175);
    vertex(368, 169);
    vertex(382, 161);
    vertex(385, 137);
    vertex(368, 125);
    vertex(361, 141);
    vertex(356, 144);
    vertex(351, 147);
    endShape();
    ellipse(368, 175,3,3);
    ellipse(368, 169,3,3);
    ellipse(382, 161,3,3);
    ellipse(385, 137,3,3);
    ellipse(368, 125,3,3);
    ellipse(361, 141,3,3);
    ellipse(356, 144,3,3);
    ellipse(351, 147,3,3);
    popMatrix();
  }

  //Pisces
  void drawPisces() {
    pushMatrix();
    beginShape();
    vertex(55, 197);
    vertex(49, 189);
    vertex(50, 180);
    vertex(57, 176);
    vertex(66, 180);
    vertex(68, 190);
    vertex(63, 198);
    vertex(55, 197);
    vertex(58, 208);
    vertex(69, 236);
    vertex(73, 247);
    vertex(88, 263);
    vertex(100, 275);
    vertex(80, 271);
    vertex(62, 269);
    vertex(37, 271);
    vertex(30, 278);
    vertex(21, 272);
    endShape();

    ellipse(55, 197,3,3);
    ellipse(49, 189,3,3);
    ellipse(50, 180,3,3);
    ellipse(57, 176,3,3);
    ellipse(66, 180,3,3);
    ellipse(68, 190,3,3);
    ellipse(63, 198,3,3);
    ellipse(55, 197,3,3);
    ellipse(58, 208,3,3);
    ellipse(69, 236,3,3);
    ellipse(73, 247,3,3);
    ellipse(88, 263,3,3);
    ellipse(100, 275,3,3);
    ellipse(80, 271,3,3);
    ellipse(62, 269,3,3);
    ellipse(37, 271,3,3);
    ellipse(30, 278,3,3);
    ellipse(21, 272,3,3);
    popMatrix();
  }

  //Sagittarius
  void drawSagittarius() {
    pushMatrix();
    beginShape();
    vertex(276, 70);
    vertex(263, 77);
    vertex(262, 81);
    vertex(253, 78);
    vertex(251, 89);
    vertex(256, 94);
    vertex(251, 89);
    vertex(253, 78);
    vertex(248, 67);
    vertex(255, 53);
    vertex(248, 67);
    vertex(236, 72);
    vertex(231, 70);
    vertex(224, 57);
    vertex(229, 54);
    vertex(224, 57);
    vertex(219, 57);
    vertex(207, 50);
    endShape();

    beginShape();
    vertex(236, 72);
    vertex(228, 78);
    vertex(224, 74);
    vertex(231, 70);
    vertex(224, 74);
    vertex(207, 69);
    vertex(197, 81);
    vertex(193, 84);
    vertex(205, 103);
    vertex(212, 115);
    vertex(223, 109);
    vertex(212, 115);
    vertex(225, 117);
    endShape();
    ellipse(276, 70,3,3);
    ellipse(263, 77,3,3);
    ellipse(262, 81,3,3);
    ellipse(253, 78,3,3);
    ellipse(251, 89,3,3);
    ellipse(256, 94,3,3);
    ellipse(251, 89,3,3);
    ellipse(253, 78,3,3);
    ellipse(248, 67,3,3);
    ellipse(255, 53,3,3);
    ellipse(248, 67,3,3);
    ellipse(236, 72,3,3);
    ellipse(231, 70,3,3);
    ellipse(224, 57,3,3);
    ellipse(229, 54,3,3);
    ellipse(224, 57,3,3);
    ellipse(219, 57,3,3);
    ellipse(207, 50,3,3);
    ellipse(236, 72,3,3);
    ellipse(228, 78,3,3);
    ellipse(224, 74,3,3);
    ellipse(231, 70,3,3);
    ellipse(224, 74,3,3);
    ellipse(207, 69,3,3);
    ellipse(197, 81,3,3);
    ellipse(193, 84,3,3);
    ellipse(205, 103,3,3);
    ellipse(212, 115,3,3);
    ellipse(223, 109,3,3);
    ellipse(212, 115,3,3);
    ellipse(225, 117,3,3);
    popMatrix();
  }

  //Scorpio
  void drawScorpio() {
    pushMatrix();
    beginShape();
    vertex(291, 119);
    vertex(285, 124);
    vertex(281, 128);
    vertex(289, 135);
    vertex(301, 136);
    vertex(312, 132);
    vertex(314, 123);
    vertex(316, 112);
    vertex(327, 98);
    vertex(332, 93);
    vertex(336, 91);
    vertex(352, 85);
    vertex(349, 78);
    vertex(352, 85);
    vertex(352, 95);
    vertex(351, 101);
    endShape();

    ellipse(291, 119,3,3);
    ellipse(285, 124,3,3);
    ellipse(281, 128,3,3);
    ellipse(289, 135,3,3);
    ellipse(301, 136,3,3);
    ellipse(312, 132,3,3);
    ellipse(314, 123,3,3);
    ellipse(316, 112,3,3);
    ellipse(327, 98,3,3);
    ellipse(332, 93,3,3);
    ellipse(336, 91,3,3);
    ellipse(352, 85,3,3);
    ellipse(349, 78,3,3);
    ellipse(352, 85,3,3);
    ellipse(352, 95,3,3);
    ellipse(351, 101,3,3);
    popMatrix();
  }

  //Taurus
  void drawTaurus() {
    pushMatrix();
    beginShape();
    vertex(182, 401);
    vertex(180, 398);
    vertex(160, 384);
    vertex(151, 374);
    vertex(146, 371);
    vertex(141, 368);
    vertex(117, 344);

    endShape();
    beginShape();
    vertex(151, 374);
    vertex(150, 367);
    vertex(148, 367);
    vertex(148, 362);
    vertex(144, 349);
    vertex(132, 328);
    endShape();

    ellipse(182, 401,3,3);
    ellipse(180, 398,3,3);
    ellipse(160, 384,3,3);
    ellipse(151, 374,3,3);
    ellipse(146, 371,3,3);
    ellipse(141, 368,3,3);
    ellipse(117, 344,3,3);
    ellipse(151, 374,3,3);
    ellipse(150, 367,3,3);
    ellipse(148, 367,3,3);
    ellipse(148, 362,3,3);
    ellipse(144, 349,3,3);
    ellipse(132, 328,3,3);
    popMatrix();
  }

  //Virgo
  void drawVirgo() {
    pushMatrix();
    beginShape();
    vertex(381, 263);
    vertex(389, 251);
    vertex(396, 252);
    vertex(408, 232);
    vertex(382, 226);
    vertex(374, 235);
    vertex(361, 256);
    vertex(374, 235);
    vertex(382, 226);
    vertex(385, 202);
    vertex(367, 198);
    vertex(385, 202);
    vertex(397, 201);
    vertex(402, 187);
    vertex(404, 169);
    vertex(402, 187);
    vertex(397, 201);
    vertex(401, 220);
    vertex(408, 232);
    endShape();
    ellipse(381, 263,3,3);
    ellipse(389, 251,3,3);
    ellipse(396, 252,3,3);
    ellipse(408, 232,3,3);
    ellipse(382, 226,3,3);
    ellipse(374, 235,3,3);
    ellipse(361, 256,3,3);
    ellipse(374, 235,3,3);
    ellipse(382, 226,3,3);
    ellipse(385, 202,3,3);
    ellipse(367, 198,3,3);
    ellipse(385, 202,3,3);
    ellipse(397, 201,3,3);
    ellipse(402, 187,3,3);
    ellipse(404, 169,3,3);
    ellipse(402, 187,3,3);
    ellipse(397, 201,3,3);
    ellipse(401, 220,3,3);
    ellipse(408, 232,3,3);
    popMatrix();
  }
}