Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

Please complete the codes.( Oribit.pde, Orbiter.java ). I nstructions are given inside the code. Orbit.pde . This is the main file for the program, which

Please complete the codes.( Oribit.pde, Orbiter.java ). Instructions are given inside the code.

Orbit.pde. This is the main file for the program, which takes the place of a main method in a typical Java program. Processing requires two methods appear in this filesetup() which sets up the graphical environment, and draw() which draws each frame of the animation to the screen.

You will need to code the drawOrbiters() and updateOrbiters(timeDelta) methods. These both traverse the orbiters tree structure. The updateOrbiters(timeDelta) traverses the Orbiters tree structure in order to call updateRotation(timeDelta) on each orbiter while the drawOrbiters() method traverses the tree structure and passes each orbiter to the drawOrbiter(orbiter) method defined at the end of Orbit.pde.

Matrix.java - Completed

Orbiter.java. The Orbiter tree structure. You will need to implement the getMatrix() method based on the TODO comment.

3 files - Matrix.java(completed), Oribit.pde, Orbiter.java.

Matrix.java ( Completed )

public class Matrix {

private int m,n;

private double[][] M;

//constructor

public Matrix(double[][] array) {

M = array;

m = array.length;

n = array[0].length;

}

//get number of columns

public int nCols() {

return n;

}

//get number of rows

public int nRows() {

return m;

}

//get ith jth entry of this matrix

public double entry(int i, int j) {

return M[i][j];

}

//compute dot product of two matrix

public Matrix dot(Matrix that) throws UndefinedMatrixOpException {

int m1 = this.nRows();

int n1 = this.nCols();

int m2 = that.nRows();

int n2 = that.nCols();

if(n1 != m2) {

throw new UndefinedMatrixOpException("Dimensions are not equal");

}

double[][] c = new double[m1][n2];

for (int i = 0; i < m1; i++)

for (int j = 0; j < n2; j++)

for (int k = 0; k < n1; k++)

c[i][j] += this.M[i][k] * that.M[k][j];

Matrix t = new Matrix(c);

return t;

}

//compute addition of two matrices

public Matrix plus(Matrix that) throws UndefinedMatrixOpException {

int m1 = this.nRows();

int n1 = this.nCols();

int m2 = that.nRows();

int n2 = that.nCols();

if(m1 != m2 || n1 != n2) {

throw new UndefinedMatrixOpException("Dimensions are not equal");

}

double[][] c = new double[m1][n1];

for (int i = 0; i < m1; i++)

for (int j = 0; j < n1; j++)

c[i][j] = this.M[i][j] + that.M[i][j];

Matrix t = new Matrix(c);

return t;

}

//return rotational matrix

public static Matrix rotationH2D(double theta) {

double[][] R = {{Math.cos(theta), -Math.sin(theta), 0},

{Math.sin(theta), Math.cos(theta), 0},

{0,0,1}};

return new Matrix(R);

}

//return translational matrix

public static Matrix translationH2D(double tx, double ty) {

double[][] R = {{1, 0 , 0},

{0, 1, 0},

{tx, ty, 1}};

return new Matrix(R);

}

//return scaling matrix

public static Matrix vectorH2D(double x, double y) {

double[][] R = {{x, 0 , 0},

{0, y, 0},

{0, 0, 1}};

return new Matrix(R);

}

//return identity matrix

public static Matrix identity(int n) {

double[][] R = new double[n][n];

for (int i = 0; i < n; i++)

R[i][i] = 1;

return new Matrix(R);

}

public String toString() {

StringBuilder sb = new StringBuilder();

for (int i = 0; i < m; i++) {

for (int j = 0; j < n; j++) {

sb.append(M[i][j]);

sb.append('\t');

}

sb.append(' ');

}

return sb.toString();

}

}

Orbit.pde (Not complete) - Has to follow instructions in the code

import java.util.*; import java.awt.*;

Orbiter sun; // The root orbiter int lastMillis; double[][] originM = {{0},{0},{1}}; Matrix origin = new Matrix(originM);

// A few fun parameters boolean clearBackground = true; double speedModifier = 1.0; // Set in some of the scenes to change the speed.

// One default scene (selected in the setup() function void setupScene1() { sun = new Orbiter(null, 0, 0, 0, Orbiter.Type.CIRCLE, Color.yellow); Orbiter earth = new Orbiter(sun, 50, 0, 1, Orbiter.Type.CIRCLE, Color.blue); Orbiter moon = new Orbiter(earth, 30, 0, 1, Orbiter.Type.CIRCLE, Color.gray); Orbiter moonSatellite = new Orbiter(moon, 20, 0, 1, Orbiter.Type.CIRCLE, Color.gray); Orbiter jupiter = new Orbiter(sun, 200, 0, 0.5, Orbiter.Type.CIRCLE, Color.red); Orbiter jupiterMoon = new Orbiter(jupiter, 75, 0, 2, Orbiter.Type.CIRCLE, Color.green); Orbiter jupiterExplorer = new Orbiter(jupiterMoon, 40, 0, -1, Orbiter.Type.SQUARE, Color.orange); Orbiter jupiterExplorerRobot = new Orbiter(jupiterExplorer, 20, 0, -3, Orbiter.Type.TRIANGLE, Color.magenta); } // A second default scene void setupScene2() { speedModifier = 0.25; sun = new Orbiter(null, 0, 0, 0, Orbiter.Type.TRIANGLE, Color.yellow); Orbiter earth = new Orbiter(sun, 50, 0, 10, Orbiter.Type.TRIANGLE, Color.blue); Orbiter moon = new Orbiter(earth, 30, 0, 20, Orbiter.Type.TRIANGLE, Color.gray); Orbiter moonSatellite = new Orbiter(moon, 20, 0, 30, Orbiter.Type.TRIANGLE, Color.gray); Orbiter jupiter = new Orbiter(sun, 200, 0, 5, Orbiter.Type.TRIANGLE, Color.red); Orbiter jupiterMoon = new Orbiter(jupiter, 75, 0, 2, Orbiter.Type.TRIANGLE, Color.green); Orbiter jupiterExplorer = new Orbiter(jupiterMoon, 40, 0, 8, Orbiter.Type.TRIANGLE, Color.orange); Orbiter jupiterExplorerRobot = new Orbiter(jupiterExplorer, 20, 0, -6, Orbiter.Type.TRIANGLE, Color.magenta); }

// The setup. You don't need to edit this other than to switch scenes by commenting out // the setupScene1() and uncommenting setupScene2(). void setup() { size(800, 800); background(0); setupScene1(); //setupScene2(); // Run this one with clearBackground set to false lastMillis = millis(); }

// The draw function // DO NOT EDIT void draw() { if (clearBackground) background(0); // Make the background black. int currentMillis = millis(); // Get the current number of milliseconds int elapsedMillis = currentMillis - lastMillis; // Get the number of milliseconds elapsed since last call double timeDelta = elapsedMillis / 1000.0; updateOrbiters(timeDelta * speedModifier); pushMatrix(); scale(1, -1); translate(width / 2, - height / 2); drawOrbiters(); popMatrix(); lastMillis = currentMillis; }

void updateOrbiters(double timeDelta) { // TODO // This code should traverse the orbiters (in BFS or DFS, but I used BFS) // order using a stack or a queue (your choice), and call updateRotation // on each one using the timeDelta parameter. // // Recall that Java has a Queue data type and a Stack interface }

void drawOrbiters() { // TODO // This code should traverse the orbiters (in BFS or DFS order, i used BFS) // and call drawOrbiter on each orbiter. }

// The code for drawing an orbiter. This is called from your drawOrbiters() method // but you should not have to edit it. void drawOrbiter(Orbiter orbiter) { try { Matrix position = orbiter.getMatrix().dot(origin); int px = (int) Math.round(position.entry(0,0) / position.entry(2,0)); int py = (int) Math.round(position.entry(1,0) / position.entry(2,0)); // Draw the orbiter noStroke(); fill(orbiter.getFillColor().getRed(), orbiter.getFillColor().getGreen(), orbiter.getFillColor().getBlue()); switch (orbiter.getType()) { case CIRCLE: ellipse(px, py, 16, 16); break; case SQUARE: rect(px-4, py-4, 8, 8); break; case TRIANGLE: triangle(px, py+3, px-2, py-1, px+2, py-1); break; } noFill(); // Draw the orbit path if (clearBackground) { stroke(60); for (Orbiter child : orbiter.getChildren()) { int radius = (int) (2*child.getOrbitRadius()); ellipse(px, py, radius, radius); } } } catch (UndefinedMatrixOpException umoe) { } }

Orbiter.java (Not complete) - Has to follow instructions in the code

import java.awt.Color;

import java.util.*;

/**

* An Orbiter is an object that orbits some other object, called its

parent.

* The center of an orbital system is an Orbiter with no parent.

* Each Orbiter may have child Oribters that orbit it.

*

* An Orbiter stores its orbital radius and current orbit angle.

*/

public class Orbiter {

public enum Type {

CIRCLE, SQUARE, TRIANGLE

}

private final double orbitRadius;

private final Type type;

private final Color fillColor;

private double orbitAngle;

private double orbitSpeed;

private final List children = new LinkedList();

private final Orbiter parent;

public Orbiter(Orbiter parent, double orbitRadius, double orbitAngle,

double orbitSpeed, Type type, Color fillColor) {

this.orbitRadius = orbitRadius;

this.orbitAngle = orbitAngle;

this.type = type;

this.fillColor = fillColor;

this.parent = parent;

this.orbitSpeed = orbitSpeed;

if (parent != null) parent.children.add(this);

}

public double getOrbitRadius() { return orbitRadius; }

public double getOrbitAngle() { return orbitAngle; }

public Color getFillColor() { return fillColor; }

public Type getType() { return type; }

public Orbiter getParent() { return parent; }

public List getChildren() { return children; }

/**

* Updates the rotation of this orbiter by the amount specified in the

deltaAngle parameter.

* @param deltaAngle The amount of rotation angle to add the to the

current rotation.

*/

public void updateRotation(double timeDelta) {

orbitAngle += (timeDelta * orbitSpeed);

}

public Matrix getMatrix() throws UndefinedMatrixOpException {

// TODO

// If this is the root node, then return the 3x3 identity matrix

// If this is not the root node, should return the transformation

// matrix for this orbiter (see the writeup for an idea of how to

// do this). Make sure you've coded the Matrix class first.

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Recommended Textbook for

Pro SQL Server Administration

Authors: Peter Carter

1st Edition

1484207106, 9781484207109

More Books

Students also viewed these Databases questions