用JAVA代码利用坐标构造三角形、椭圆、线段线并求其周长、面积
本程序主要靠编写Shape类、矩形类、三角形类、线段类与图形构造类,共同实现求上述图形的面积、周长。其中涉及到字符数组与整数数组的转换,字符数组与坐标数组的转换
主测试程序
import java.awt.*;
import java.util.Scanner;
public class ShapeTest {
public static void main(String[] args) {
// 输入图形种类
System.out.println("Please enter the graphic which you need to calculate:");
System.out.println("Line(0)/Triangle(1)/Rectangle(2)/Oval(3)");
// 捕捉异常
try(Scanner sc=new Scanner(System.in);){
String tmp=sc.nextLine();
// 定义kind为输入图形种类,Integer.parseInt()为解析方法,将输入的字符串解析为Int型
int kind=Integer.parseInt(tmp);
// 输入坐标
System.out.println("Please enter the point(divided by space):");
tmp=sc.nextLine();
// split(a)方法为分割方法,将被a(这个a可能为空格,也可能为,或别的)分隔的内容分隔为几个独立的字符串集
String[] sp= tmp.split(" ");
// 定义坐标点数组
Point[] PtArray=new Point[sp.length];
// for语句分别将坐标点输入到PtArray[]中
for (int i = 0;i < sp.length ;i ++) {
String[] points = sp[i].split(",");
Point point = new Point(Integer.parseInt(points[0]),Integer.parseInt(points[1]));
PtArray[i] = point;
}
// 定义Shane型对象,调用ShapeCreator中的createShape方法
Shape shp= ShapeCreator.createShape(kind,PtArray);
System.out.println("The graphic is:"+shp.getName());
System.out.println("Area of the graphic is:"+shp.area());
System.out.println("Perimeter of teh graphic is:"+shp.perimeter());
}
}
}
ShapeCreator类
import java.awt.*;
public class ShapeCreator {
public static Shape createShape(int clsNo, Point[] ptArray){
Shape shp = null;
switch (clsNo){
case 0:
shp=new Line(ptArray);
break;
case 1:
shp=new Triangle(ptArray);
break;
case 2:
shp=new Rectangle(ptArray);
break;
case 3:
shp=new Oval(ptArray);
break;
default:
shp=Shape.NULL;
break;
}
return shp;
}
}
Shape类
//定义Shape类
import java.awt.*;
public abstract class Shape {
// 构造方法
public static Shape NULL = new Shape(){
{name = "NULL";
vertexArray = new Point[0];
}
public double area(){
return 0;
}
public double perimeter(){
return 0;
}
};
protected String name;
protected Point[] vertexArray;
public abstract double area();
public abstract double perimeter();
public String getName(){
return name;
}
}
Oval类
import java.awt.*;
public class Oval extends Shape{
//输入两坐标为以椭圆外接矩形对角线上两端点
String name="椭圆";
// 判定是否可以构成椭圆
public Oval(Point[] PtArray) {
this.vertexArray=PtArray;
if((vertexArray[0].x==vertexArray[1].x)||(vertexArray[0].y==vertexArray[1].y)){
System.out.println("格式错误!以下结果无效");
}
}
//求椭圆面积
@Override
public double area() {
return Math.PI*Math.abs(vertexArray[0].x-vertexArray[1].x)*Math.abs(vertexArray[0].y-vertexArray[1].y)*0.25;
}
//求椭圆周长
@Override
public double perimeter() {
double L ;
double b = Math.abs(vertexArray[0].x-vertexArray[1].x);
double a = Math.abs(vertexArray[0].x-vertexArray[1].x);
if (a>=b) {
L = 2 * Math.PI * b + 4 * (a + b);
}else{
L = 2 * Math.PI * a + 4 * (a + b);
}
return L;
}
// 返回椭圆名字
@Override
public String getName() {
return name;
}
}
line类
import java.awt.*;
public class Line extends Shape{
String name="直线";
public Line(Point[] PtArray) {
this.vertexArray=PtArray;
if((vertexArray[0].x==vertexArray[1].x)&&(vertexArray[0].y==vertexArray[1].y)){
System.out.println("格式错误!以下结果无效");
}
}
@Override
public double area() {
return 0;
}
@Override
public double perimeter() {
return Math.abs(Math.sqrt(Math.pow((vertexArray[1].x-vertexArray[0].x),2)+Math.pow((vertexArray[1].y-vertexArray[0].y),2)));
}
@Override
public String getName() {
return name;
}
}
Rectangle类
import java.awt.*;
public class Rectangle extends Shape {
String name="矩形";
public Rectangle(Point[] PtArray) {
this.vertexArray=PtArray;
if((vertexArray[0].x==vertexArray[1].x)||vertexArray[0].y==vertexArray[1].y){
System.out.println("格式错误!以下结果无效");
}
}
//求矩形面积
@Override
public double area() {
return (Math.abs(vertexArray[0].x-vertexArray[1].x))*Math.abs((vertexArray[0].y-vertexArray[1].y));
}
//求矩形周长
@Override
public double perimeter() {
return 2*(Math.abs(vertexArray[0].x-vertexArray[1].x)+Math.abs(vertexArray[0].y-vertexArray[1].y));
}
@Override
public String getName() {
return name;
}
}
Triangle类
import java.awt.*;
public class Triangle extends Shape {
String name="三角形";
//构造函数
public Triangle(Point[] PtArray) {
this.vertexArray=PtArray;
//判定三角形三边是否满足三角形定义,abc分别为三边
// Math.pow(a,b)返回a的b次方
// Math.sqrt(a)返回a的算术平方根
double a = Math.sqrt(Math.pow((vertexArray[0].x-vertexArray[1].x),2)+Math.pow((vertexArray[0].y-vertexArray[1].y),2));
double b = Math.sqrt(Math.pow((vertexArray[0].x-vertexArray[2].x),2)+Math.pow((vertexArray[0].y-vertexArray[2].y),2));
double c = Math.sqrt(Math.pow((vertexArray[1].x-vertexArray[2].x),2)+Math.pow((vertexArray[1].y-vertexArray[2].y),2));
if ((a +b <c)||(a+c<b)||(b+c<a)){
System.out.println("格式错误!,以下结果无效");
}
}
//求三角形面积
@Override
public double area() {
return 0.5*Math.abs((vertexArray[0].x*vertexArray[1].y)-(vertexArray[0].x*vertexArray[2].y)+
(vertexArray[1].x*vertexArray[2].y)-(vertexArray[1].x*vertexArray[0].y)+
(vertexArray[2].x*vertexArray[0].y)-(vertexArray[2].x*vertexArray[1].y));
}
//求三角形周长
@Override
public double perimeter() {
return Math.sqrt(Math.pow((vertexArray[1].x-vertexArray[0].x),2)+Math.pow((vertexArray[1].y-vertexArray[0].y),2))+
Math.sqrt(Math.pow((vertexArray[2].x-vertexArray[1].x),2)+Math.pow((vertexArray[2].y-vertexArray[1].y),2))+
Math.sqrt(Math.pow((vertexArray[2].x-vertexArray[0].x),2)+Math.pow((vertexArray[2].y-vertexArray[0].y),2));
}
//返回名称:三角形
@Override
public String getName() {
return name;
}
}