用JAVA代码利用坐标构造三角形、椭圆、直线并求其周长、面积

该程序通过用户输入图形类型和坐标点,利用抽象类Shape及其子类如Rectangle、Triangle、Oval和Line,实现了对几何图形的构造、周长和面积计算。输入的坐标通过点类Point处理,并进行了异常捕获和错误提示。程序首先根据用户选择创建对应的图形对象,然后输出图形名称、面积和周长。
摘要由CSDN通过智能技术生成

用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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白开水就盒饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值