Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Programming Assignment #5 ( Inheritance and Polymorphism ) I. Create a Point3D C

ID: 3864804 • Letter: P

Question

Programming Assignment #5

(Inheritance and Polymorphism)

I. Create a Point3D Class

Create a class to represent a point in Three-Dimensional space. This class will have private int instance variables x, y, and z, to store the coordinates of the point, a constructor, an overridden toString() method to return the coordinates as a String, and “get” methods that return the values of each of the instance variables.

II. Define an Abstract Class to Represent a 3-D Shape

Your Shape class must meet these specifications:

has a private instance variable of class Point3D (aka: a “member object”) that stores the center of the shape

For maximum credit, this member object must be created in the Shape3D constructor. I.e., the implementation of the center must be “hidden” from the client code (the test class) and also from all subclasses

overrides toString() to return a string containing the coordinates of the center (hint: call the toString() method of the Point3D class)

has a concrete method that computes and returns the distance of the center of the shape from the origin (i.e., point 0,0,0)

has abstract methods that compute and return the surface area and the volume of a shape

implements Java’s Comparable interface so that Shape objects are ordered by volume (ascending)

III. Derive Concrete Subclasses for Sphere, Parallelepiped, Cylinder, and Cone Shapes

The constructor for each of these classes takes parameters for the x, y, and z coordinates of the center. In addition, the Sphere constructor takes the radius, the Parallelepiped constructor the length, width, and height, the Cone constructor the height and radius, and the Cylinder constructor the radius and height

Since these are concrete classes, each must implement the methods that compute/return the surface area and the volume

Each class will also override toString to return a string containing the class name, coordinates of the center, and the other data values (radius, length, width, etc.)

IV. Write a Driver Class to Test Your Shape Hierarchy

Create one object of each concrete class – using the data given below - and store them in an array of Shapes. The data can be “hardwired” into the code, no need for user input

Using a loop, traverse the array and print the following information for each object – the actual class of the shape (Sphere, Cone, etc), all the input data, and the surface area and volume.

Sort the array in ascending order by volume. This must be done via a call to a sort method of the Arrays class.

Using a loop, print ONLY the class name and volume for each object in the sorted array.

Sort the array again, but this time in descending order by the distance from the origin. This must be done via a call to a sort method of the Arrays class.

   Hint: create a class that implements the Comparator interface. Remember that when you implement the compare() method, you get to say what the “natural order” of the objects of your class is.

Using a loop, print ONLY the class name and distance from the origin for each object in the sorted array.

V. Test Data to be Used

Sphere:            Center at (2,-8,5), radius of 13

Parallelepiped:    Center at (7,2,9), length 37, width 12, height 9

Cylinder:          Center at (3,-4,5), radius 11, height 13

Cone:              Center at (-5,2,-1), radius 10, height 14

VI. Formulas

The distance of a point in 3D space from point (0,0,0) is the hypotenuse of a right triangle where the adjacent sides have lengths of z, and sqrt(x2 + y2)

Sphere:                                  4

              area = 4 r2     volume =      r3

                                          3

Cylinder:   area = 2 r2 + 2 r h    volume = r2 h

Cone:       volume = r2 h    area = r(r + s)

                       ———————

                        3

              where s (the slant height) = r2 + h2

   Parallelepiped: It’s a box, like a cereal box. Figure it out.

Code must be thoroughly internally commented for full credit

Explanation / Answer

1) Shape Class

package as3;

import java.util.Comparator;

public abstract class Shape implements Comparator<Shape>{
   Point3D point3d;
   int x,y,z;
   public Shape(int x,int y,int z) {
       // TODO Auto-generated constructor stub
       point3d=new Point3D(x,y,z);
   }
  
   public String toString(){
       return point3d.toString();
   }
  
   public int getDistance(){
  
       int distance=point3d.getX()*point3d.getX()+point3d.getY()*point3d.getY()+point3d.getZ()*point3d.getZ();
       return distance;
   }
  
   public abstract double computeArea();
   public abstract double computeVolume();
public static Comparator<Shape> shapeComparator=new Comparator<Shape>() {
  
   @Override
   public int compare(Shape o1, Shape o2) {
       // TODO Auto-generated method stub
       return o1.getDistance()-o2.getDistance();
   }
};
  
  
}

2) Point3D class

package as3;

public class Point3D {
private int x,y,z;

Point3D(int x,int y,int z){
   this.x=x;
   this.y=y;
   this.z=z;
}
Point3D(){
  
}
public int getX() {
   return x;
}

public void setX(int x) {
   this.x = x;
}

public int getY() {
   return y;
}

public void setY(int y) {
   this.y = y;
}

public int getZ() {
   return z;
}

public void setZ(int z) {
   this.z = z;
}

public String toString(){
   return "x coordinate is =" +x +" y coordinate is= "+y+" z coordinate is= "+z;
}
}

3)

Sphere Class

package as3;

public class Sphere extends Shape {
   final double PI=3.14;
   private int x,y,z,r;
  
   public Sphere(int x,int y,int z, int r) {
       super(x,y,z);
       this.r=r;
       // TODO Auto-generated constructor stub
   }

   @Override
   public double computeArea() {
       // TODO Auto-generated method stub
      
       return 4*PI*r*r;
   }

   @Override
   public double computeVolume() {
       // TODO Auto-generated method stub
       return PI*r*r*r;
   }
   public String toString(){
       return Object.class.getName() +
           super.toString() + "radius= "+r;
   }

   @Override
   public int compare(Shape o1, Shape o2) {
       // TODO Auto-generated method stub
       return o1.getDistance()-o2.getDistance();
      
   }
}

4) Parallelpiped Class

package as3;

public class Parallelepiped extends Shape {

   private int x,y,z,l,b,h;
  

   @Override
   public double computeArea() {
       // TODO Auto-generated method stub
       return 2*(l*h)+2*(b*h)+2*(l*b);
   }

   public Parallelepiped(int x, int y, int z, int l, int b, int h) {
       super(x,y,z);
      
       this.l = l;
       this.b = b;
       this.h = h;
   }

   @Override
   public double computeVolume() {
       // TODO Auto-generated method stub
       return l*b*h;
   }

   public String toString(){
       return Object.class.getName() +
           super.toString() + "length= "+l +" height= "+h+ " width= "+b;
   }

   @Override
   public int compare(Shape o1, Shape o2) {
       // TODO Auto-generated method stub
       return o1.getDistance()-o2.getDistance();
   }

}

5) CylinderClass

package as3;

public class Cylinder extends Shape {

   final double PI=3.14;
   int height;
   int radius;

  
  
   

   public Cylinder(int x,int y,int z,int height, int radius) {
       super(x,y,z);
       this.height = height;
       this.radius = radius;
   }

   @Override
   public double computeArea() {
       // TODO Auto-generated method stub
       return 2*PI*radius*height+ 2*PI*radius*radius ;
   }

   @Override
   public double computeVolume() {
       // TODO Auto-generated method stub
       return PI*radius*radius*height;
   }
  
   public String toString(){
       return Object.class.getName() +
           super.toString() + "radius= "+radius
           +"Height = "+height;
   }

   @Override
   public int compare(Shape o1, Shape o2) {
       // TODO Auto-generated method stub
       return o1.getDistance()-o2.getDistance();
   }

}

6) ConeShape

package as3;

public class ConeShape extends Shape{
   final double PI=3.14;
  
   int height;
   int radius;
  
   public ConeShape(int x,int y,int z,int height, int radius) {
       super(x,y,z);
       this.height = height;
       this.radius = radius;
   }

   @Override
   public double computeArea() {
       // TODO Auto-generated method stub
       double slantHeight=Math.sqrt((radius*radius)+(height*height));
       return PI*radius*(radius+slantHeight);
   }

   @Override
   public double computeVolume() {
       // TODO Auto-generated method stub
       return PI*radius*radius*height/3;
   }
   public String toString(){
       return super.toString();
   }

   @Override
   public int compare(Shape o1, Shape o2) {
       // TODO Auto-generated method stub
       return o1.getDistance()-o2.getDistance();
   }

}

ShapeTesting Class

package as3;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.swing.text.html.HTMLDocument.HTMLReader.SpecialAction;

public class ShapeTesting {

  
   public static void main(String[] args) {
       ArrayList<Shape> shapelist=new ArrayList<Shape>();
       Sphere sphere=new Sphere(2,-8,5, 13);
       Parallelepiped par=new Parallelepiped(7,2,9,37,12,9);
       Cylinder cyl=new Cylinder(3,-4,5,11,13);
       ConeShape cone=new ConeShape(-5, 2, -1,10, 14);
       System.out.println(cone.toString());
       shapelist.add(cone);
       shapelist.add(sphere);
       shapelist.add(cyl);
       shapelist.add(par);
       Shape []shape=new Shape[5];
       shape[0]=cone;
       shape[1]=sphere;
       shape[2]=cyl;
       shape[3]=par;
  
       for(Shape shape1:shapelist){
           System.out.println(shape1.getClass().getName());
           System.out.println("Area is = "+shape1.computeArea());
           System.out.println("Area is = "+shape1.computeVolume());
          
       }
      
//      
//       Arrays.sort(shape, Shape.shapeComparator);
//       for(Shape s:shape){
//           System.out.println(s.getDistance());
//       }
      
      
   }
  
  
  
}