From 7618733a823759c7bd0d23ab297151dcfcdb2ea4 Mon Sep 17 00:00:00 2001 From: Robert Argasinski Date: Wed, 9 Dec 2015 09:16:58 -0500 Subject: [PATCH 1/6] CalculatingAngleVectors Still needs annotation --- .../CalculateAngleVectors.pde | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 CalculateAngleVectors/CalculateAngleVectors.pde diff --git a/CalculateAngleVectors/CalculateAngleVectors.pde b/CalculateAngleVectors/CalculateAngleVectors.pde new file mode 100644 index 0000000..85691a4 --- /dev/null +++ b/CalculateAngleVectors/CalculateAngleVectors.pde @@ -0,0 +1,58 @@ +void setup(){ + background(0); + size(800,800); +} + +void draw(){ + angleBetweenVectorsRect(5,5,-5,-5); + angleBetweenVectorsPol(sqrt(50), sqrt(50), 45, 225); +} + +float angleBetweenVectorsRect(float ax, float ay, float bx, float by){ + textAlign(CENTER); + textSize(20); + text("The angle between a vector A with components " + ax + " and " + ay + "\n and a vector B with components " + bx + " and " + by + " is:", width/2, 200); + textSize(80); + text(round(degrees(acos(AxBx_AyBy(ax, ay, bx, by)/AB(ax, ay, bx, by)))), width/2, height/2); + return acos(AxBx_AyBy(ax, ay, bx, by)/AB(ax, ay, bx, by)); +} + +float AxBx_AyBy(float ax, float ay, float bx, float by){ + return ax*bx+ay*by; +} + +float AB(float ax, float ay, float bx, float by){ + return sqrt(pow(ax, 2) + pow(ay,2))*sqrt(pow(bx,2) + pow(by, 2)); +} + +float angleBetweenVectorsPol(float A, float B, float angleA, float angleB){ + float ax = XcomponentA(A, angleA); + float ay = YcomponentA(A, angleA); + float bx = XcomponentB(B, angleB); + float by = YcomponentB(B, angleB); + textSize(20); + text("The angle between a vector A of magnitude " + A + " at an angle of " + angleA + "\n and a vector B of magnitude " + B + " at an angle of " + angleB + " is:", width/2, 500); + textSize(80); + text(round(degrees(acos(AxBx_AyBy(ax, ay, bx, by)/AB(ax, ay, bx, by)))), width/2, 700); + return acos(AxBx_AyBy(ax, ay, bx, by)/AB(ax, ay, bx, by)); +} + +float XcomponentA(float A, float angleA){ + float ax = A * cos(radians(angleA)); + return ax; +} + +float YcomponentA(float A, float angleA){ + float ay = A * sin(radians(angleA)); + return ay; +} + +float XcomponentB(float B, float angleB){ + float bx = B * cos(radians(angleB)); + return bx; +} + +float YcomponentB(float B, float angleB){ + float by = B * sin(radians(angleB)); + return by; +} \ No newline at end of file From 7c594c0dfad72239b6f36260e2b5b9b80d1f8bd7 Mon Sep 17 00:00:00 2001 From: Robert Argasinski Date: Mon, 14 Dec 2015 11:32:02 -0500 Subject: [PATCH 2/6] Physics finished --- .../CalculateAngleVectors.pde | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/CalculateAngleVectors/CalculateAngleVectors.pde b/CalculateAngleVectors/CalculateAngleVectors.pde index 85691a4..cee612a 100644 --- a/CalculateAngleVectors/CalculateAngleVectors.pde +++ b/CalculateAngleVectors/CalculateAngleVectors.pde @@ -4,29 +4,33 @@ void setup(){ } void draw(){ - angleBetweenVectorsRect(5,5,-5,-5); - angleBetweenVectorsPol(sqrt(50), sqrt(50), 45, 225); + angleBetweenVectorsRect(5,5,-5,-5); //functions defined below... + //angleBetweenVectorsPol(sqrt(50), sqrt(50), 45, 225); } -float angleBetweenVectorsRect(float ax, float ay, float bx, float by){ +float angleBetweenVectorsRect(float ax, float ay, float bx, float by){ //this function finds the angle if components are given textAlign(CENTER); textSize(20); text("The angle between a vector A with components " + ax + " and " + ay + "\n and a vector B with components " + bx + " and " + by + " is:", width/2, 200); textSize(80); - text(round(degrees(acos(AxBx_AyBy(ax, ay, bx, by)/AB(ax, ay, bx, by)))), width/2, height/2); + text(round(degrees(acos(AxBx_AyBy(ax, ay, bx, by)/AB(ax, ay, bx, by)))), width/2, height/2); //uses dot product to find angle : https://en.wikipedia.org/wiki/Dot_product A.B = AxBx + AyBy = |A||B|cos angle return acos(AxBx_AyBy(ax, ay, bx, by)/AB(ax, ay, bx, by)); } -float AxBx_AyBy(float ax, float ay, float bx, float by){ - return ax*bx+ay*by; +float AxBx_AyBy(float ax, float ay, float bx, float by){ //part of the formula in line 16 + return ax*bx+ay*by; //just a simple calculation that makes line 16 more legible } -float AB(float ax, float ay, float bx, float by){ - return sqrt(pow(ax, 2) + pow(ay,2))*sqrt(pow(bx,2) + pow(by, 2)); +float AB(float ax, float ay, float bx, float by){ //also part of the formula in line 16 + return sqrt(pow(ax, 2) + pow(ay,2))*sqrt(pow(bx,2) + pow(by, 2)); //using Pythagorean theorem to find the magnitude of the vectors and multiplying them together } -float angleBetweenVectorsPol(float A, float B, float angleA, float angleB){ - float ax = XcomponentA(A, angleA); +/******************************************************************** +//I just realized that the rest of this code is useless, because you can just do 225 - 45 = 180 and bypass all of these calculations. It still works, so if you want, get rid of the comment + + +float angleBetweenVectorsPol(float A, float B, float angleA, float angleB){ //this function finds the angle if the magnitude and ANGLE are given + float ax = XcomponentA(A, angleA); //finds components using trigonometry and functions below float ay = YcomponentA(A, angleA); float bx = XcomponentB(B, angleB); float by = YcomponentB(B, angleB); @@ -55,4 +59,6 @@ float XcomponentB(float B, float angleB){ float YcomponentB(float B, float angleB){ float by = B * sin(radians(angleB)); return by; -} \ No newline at end of file +} + +*********************************************************************/ \ No newline at end of file From ad5bf2967912f2d6f39c297c012a0dd119b807bb Mon Sep 17 00:00:00 2001 From: Robert Argasinski Date: Mon, 14 Dec 2015 11:32:54 -0500 Subject: [PATCH 3/6] Math finished --- primeNumbers.pde | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 primeNumbers.pde diff --git a/primeNumbers.pde b/primeNumbers.pde new file mode 100644 index 0000000..5e14296 --- /dev/null +++ b/primeNumbers.pde @@ -0,0 +1,29 @@ +void setup() { + size(100, 100); //display is not necessary, but I couldn't find a way to bring it to text + background(0); +} + +void draw() { + println(primeSieve(0, 100)); //executes function below +} + +IntList primeSieve(int start, int finish) { + IntList list = new IntList(); //creates blank IntList + for (int number = start; number < finish; number++) { //tests if prime for numbers between start and finish + boolean prime = true; //originally every number is considered prime + for (int i = 2; i < number; i++) { //divides numbers by all numbers leading up to it + if (number%i == 0) { //if it turns out to factor out equally, ... + prime = false; //the number is no longer deemed prime + } + } + if (prime) { //adds all prime numbers to the blank IntList + list.append(number); + } + } + list.remove(0); //remove 0 from list (assuming you start at 0) + list.remove(0); //remove 1 from list (assuming you start at 0) + for(int x = 0; x < list.size(); x++){ //for each value in the IntList, ... + println(str(list.get(x))); //print it to the console + } + return list; //return the list (although it is not used for anything outside of the function) +} \ No newline at end of file From 2b741013bd568ef0af7482c0cd31ac4257236466 Mon Sep 17 00:00:00 2001 From: Robert Argasinski Date: Mon, 14 Dec 2015 11:34:16 -0500 Subject: [PATCH 4/6] Visual done --- Galaga/Galaga.pde | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 Galaga/Galaga.pde diff --git a/Galaga/Galaga.pde b/Galaga/Galaga.pde new file mode 100644 index 0000000..518797b --- /dev/null +++ b/Galaga/Galaga.pde @@ -0,0 +1,118 @@ +float circleX = 30; //declare and initialize variables +float start = -11; + +void setup() { + frameRate(30); //this eases later calculations + size(400, 400); + background(0); +} + +void draw() { + background(0); + noStroke(); + displayShip(); //functions defined below + bubble(); + if (mousePressed) { //if mouse pressed, ... + fireProjectile(); //create the projectile + moveProjectile(); //and move it (as long as the mouse is held + if(mouseX >= 10 && mouseX <= 50){ //if projectile is firing within range of the circle, .. + println("HIT"); //print HIT to the console + } + } + if(keyPressed){ //if a key is pressed, ... + start = -11; //projectile is reloaded + } +} + +void displayShip() { //defines the shape of the ship (as a series of 8-bit squares) + rectMode(CENTER); //define rectangles according to the center; makes later calculations easier + fill(255); //let's start with white squares + rectangle(0, 0); //origin + rectangle(0, -1); + rectangle(0, -2); + rectangle(0, -3); + rectangle(-1, -2); + rectangle(1, -2); + rectangle(-2, -2); + rectangle(2, -2); + rectangle(-2, -3); + rectangle(2, -3); + rectangle(-2, -4); + rectangle(2, -4); + rectangle(-3, -2); + rectangle(3, -2); + rectangle(-3, -3); + rectangle(3, -3); + rectangle(4, -2); + rectangle(-4, -2); + rectangle(4, -1); + rectangle(-4, -1); + rectangle(5, 0); + rectangle(-5, 0); + rectangle(5, -1); + rectangle(-5, -1); + rectangle(5, -2); + rectangle(-5, -2); + rectangle(5, -3); + rectangle(-5, -3); + rectangle(-3, -5); + rectangle(3, -5); + rectangle(-3, -6); + rectangle(3, -6); + rectangle(0, -6); + rectangle(1, -6); + rectangle(-1, -6); + rectangle(1, -5); + rectangle(-1, -5); + rectangle(0, -7); + rectangle(1, -7); + rectangle(-1, -7); + rectangle(0, -8); + rectangle(0, -9); + rectangle(0, -10); + fill(255, 0, 0); //red squares + rectangle(1, -1); + rectangle(-1, -1); + rectangle(2, -1); + rectangle(-2, -1); + rectangle(1, -3); + rectangle(-1, -3); + rectangle(0, -4); + rectangle(1, -4); + rectangle(-1, -4); + rectangle(0, -5); + rectangle(5, -4); + rectangle(-5, -4); + rectangle(3, -7); + rectangle(-3, -7); + fill(0, 0, 255); //blue squares + rectangle(2, -5); + rectangle(-2, -5); + rectangle(3, -4); + rectangle(-3, -4); +} + +void rectangle(float x, float y) { //defining the function rectangle() in relation to mouse's x-position and a constant height value + rect(mouseX + 3*x, (height-10) + 3*y, 3, 3); //squares are 3x3 pixels +} + +void bubble() { //defining the target to be hit + stroke(100, 255, 50); //some type of green + strokeWeight(2); //outline of 2px + fill(100,255,50, 50); //fill with some transparency + ellipse(30, 120, 20, 20); //create the circle +} + +void fireProjectile(){ //defining launching the projectile, which is basically a white 1x2 rectangle + noStroke(); + fill(255); + rectangle(0, start); + rectangle(0, start-1); +} + +void moveProjectile(){ //defining moving the projectile every frame + if(frameCount%1 == 0){ + start = start - 1; //moves projectile up + fireProjectile(); //redisplay projectile + } +} \ No newline at end of file From 4154002064b3406b4dbb258b69e65af77e36fd53 Mon Sep 17 00:00:00 2001 From: Robert Argasinski Date: Mon, 14 Dec 2015 11:37:35 -0500 Subject: [PATCH 5/6] Math again... --- primeNumbers/primeNumbers.pde | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 primeNumbers/primeNumbers.pde diff --git a/primeNumbers/primeNumbers.pde b/primeNumbers/primeNumbers.pde new file mode 100644 index 0000000..5e14296 --- /dev/null +++ b/primeNumbers/primeNumbers.pde @@ -0,0 +1,29 @@ +void setup() { + size(100, 100); //display is not necessary, but I couldn't find a way to bring it to text + background(0); +} + +void draw() { + println(primeSieve(0, 100)); //executes function below +} + +IntList primeSieve(int start, int finish) { + IntList list = new IntList(); //creates blank IntList + for (int number = start; number < finish; number++) { //tests if prime for numbers between start and finish + boolean prime = true; //originally every number is considered prime + for (int i = 2; i < number; i++) { //divides numbers by all numbers leading up to it + if (number%i == 0) { //if it turns out to factor out equally, ... + prime = false; //the number is no longer deemed prime + } + } + if (prime) { //adds all prime numbers to the blank IntList + list.append(number); + } + } + list.remove(0); //remove 0 from list (assuming you start at 0) + list.remove(0); //remove 1 from list (assuming you start at 0) + for(int x = 0; x < list.size(); x++){ //for each value in the IntList, ... + println(str(list.get(x))); //print it to the console + } + return list; //return the list (although it is not used for anything outside of the function) +} \ No newline at end of file From 478f88dfae047c5b19ad1d52562af7e35bf3ae78 Mon Sep 17 00:00:00 2001 From: RobertArgasinski Date: Tue, 15 Dec 2015 11:37:31 -0500 Subject: [PATCH 6/6] Documentation --- Documentation.docx | Bin 0 -> 14673 bytes ~$cumentation.docx | Bin 0 -> 162 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Documentation.docx create mode 100644 ~$cumentation.docx diff --git a/Documentation.docx b/Documentation.docx new file mode 100644 index 0000000000000000000000000000000000000000..9b7fe936f9466935a23b904da5e7289a4f8fd8fd GIT binary patch literal 14673 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