关闭

算法提高 12-1三角形

标签: 蓝桥杯Java
827人阅读 评论(3) 收藏 举报
分类:

问题描述
  为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入三个点,输出这三个点构成的三角形的周长、面积、外心和重心。结果保留小数点后2位数字。
样例输入
例:
0 0
1 0
0 1
样例输出
例如:
3.41
0.50
0.50 0.50
0.33 0.33


解题思路:
给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢?

例如 :给定a(x1,y1) b(x2,y2) c(x3,y3)求外接圆心坐标O(x,y)

首先,外接圆的圆心也就是三角形的外心是三角形三条边的垂直平分线的交点,我们根据圆心到顶点的距离相等,可以列出以下方程:

(x1-x)(x1-x)-(y1-y)(y1-y)=(x2-x)(x2-x)+(y2-y)(y2-y);

(x2-x)(x2-x)+(y2-y)(y2-y)=(x3-x)(x3-x)+(y3-y)(y3-y);

2.化简得到:

    2*(x2-x1)*x+2*(y2-y1)y=x2^2+y2^2-x1^2-y1^2;

    2*(x3-x2)*x+2*(y3-y2)y=x3^2+y3^2-x2^2-y2^2;

    令A1=2*(x2-x1);

        B1=2*(y2-y1);

        C1=x2^2+y2^2-x1^2-y1^2;

        A2=2*(x3-x2);

        B2=2*(y3-y2);

        C2=x3^2+y3^2-x2^2-y2^2;

        即

            A1*x+B1y=C1;

            A2*x+B2y=C2;

3.最后根据克拉默法则:

      x=((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1));

      y=((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1));

给定三角形三个顶点的坐标,如何求三角形的重心的坐标呢?

例如 :给定a(x1,y1) b(x2,y2) c(x3,y3)求外接圆心坐标O(x,y)

首先,重心是三角形三条边的中线的交点,任意一条中线被重心分成1:2的两条线段,可以列出以下方程:

    2*x - x1 - x2 = x3 - x
    2*y - y1 - y2 = y3 - y 
    得出:
        x = ( x1 + x2 + x3) / 3
        y = ( y1 + y2 + y3) / 3

代码如下:

import java.util.Scanner;

class Point{
    private double x;
    private double y;

    public Point(double x, double y) {
        super();
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public void Print(){
        System.out.printf("%.2f %.2f",this.x,this.y);
    }

    public double Length(){
        return this.x*this.x + this.y*this.y;
    }
}

class Triangle{
    private Point[] point;
    private double[] line;

    public Triangle() {
        super();
        this.point = new Point[3];
        this.line = new double[3];
        Scanner in = new Scanner(System.in);
        for ( int i = 0 ; i < 3 ; i++){
            double x = in.nextDouble();
            double y = in.nextDouble();
            point[i] = new Point(x, y);
        }
        for ( int i = 0 ; i < this.point.length ; i++ ){
            if ( i == 0 ){
                line[i] = Line_Length(this.point[i], this.point[this.point.length-1]);
            }else{
                line[i] = Line_Length(this.point[i-1], this.point[i]);
            }
        }
        in.close();
    }

    public double Line_Length(Point point1 , Point point2){
        double len = 0.0;
        double len_x = (point1.getX()-point2.getX()) * (point1.getX()-point2.getX());
        double len_y = (point1.getY()-point2.getY()) * (point1.getY()-point2.getY());
        len = Math.sqrt(len_x+len_y);
        return len;
    }

    public double Circumference(){
        double c = 0.0;
        for ( int i = 0 ; i < this.line.length; i++ ){
            c += this.line[i];
        }
        return c;
    }

    public double Square(){
        double s = 0.0;
        double p = 0;
        for ( int i = 0 ; i < line.length ; i++){
            p += this.line[i];
        }
        p /= 2;
        s = Math.sqrt(p*(p-this.line[0])*(p-this.line[1])*(p-this.line[2]));
        return s;
    }

    //重心
    public Point MedianPoint(){
        double x = 0.0;
        double y = 0.0;
        for ( int i = 0 ; i < point.length; i++){
            x += this.point[i].getX();
            y += this.point[i].getY();
        }
        x /= 3;
        y /= 3;
        return new Point(x, y);
    }

    //外心
    public Point CircumcenterPoint(){
        double A1 = 2*(this.point[1].getX()-this.point[0].getX());
        double A2 = 2*(this.point[2].getX()-this.point[1].getX());
        double B1 = 2*(this.point[1].getY()-this.point[0].getY());
        double B2 = 2*(this.point[2].getY()-this.point[1].getY());
        double C1 = this.point[1].Length() - this.point[0].Length();
        double C2 = this.point[2].Length() - this.point[1].Length();
        double x = (C1*B2-C2*B1)/(A1*B2-A2*B1);
        double y = (A1*C2-A2*C1)/(A1*B2-A2*B1);

        return new Point(x, y);
    }

}

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Triangle triangle = new Triangle();
        Point median = triangle.MedianPoint();
        Point circumcenter = triangle.CircumcenterPoint();
        double c = triangle.Circumference();
        double s = triangle.Square();
        System.out.printf("%.2f",c);
        System.out.println();
        System.out.printf("%.2f",s);
        System.out.println();
        circumcenter.Print();
        System.out.println();
        median.Print();
    }
}

这里写图片描述

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

算法提高 12-1三角形

给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢? 例如 :给定a(x1,y1) b(x2,y2) c(x3,y3)求外接圆心坐标O(x,y) 1. 首先,外接圆的圆心是三角形三条边的垂直平分线的交点,我们根据圆心到顶点的距离相等,可以列出以下方程: (x1-x)(x1-x)...
  • qq_32734731
  • qq_32734731
  • 2017-01-31 17:06
  • 735

算法提高 12-1三角形

算法提高 12-1三角形 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述   为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入三个点,输出这三个点构成的三角形的周长、面积、外心和重心。结果保留小...
  • qq_32792879
  • qq_32792879
  • 2017-02-27 22:05
  • 237

算法提高 12-1三角形

给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢? 例如 :给定a(x1,y1) b(x2,y2) c(x3,y3)求外接圆心坐标O(x,y) 1. 首先,外接圆的圆心是三角形三条边的垂直平分线的交点,我们根据圆心到顶点的距离相等,可以列出以下方程: (x1-x)(x1-x)...
  • qq_32734731
  • qq_32734731
  • 2017-01-31 17:06
  • 735

算法提高 12-1三角形

时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述   为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入三个点,输出这三个点构成的三角形的周长、面积、外心和重心。结果保留小数点后2位数字。 样例输出...
  • feng_zhiyu
  • feng_zhiyu
  • 2018-01-05 16:36
  • 24

算法提高 12-1三角形

算法提高 12-1三角形   时间限制:1.0s   内存限制:256.0MB      问题描述   为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入...
  • lovely_girl1126
  • lovely_girl1126
  • 2017-04-01 02:48
  • 192

算法提高 12-1三角形

算法提高 12-1三角形   时间限制:1.0s   内存限制:256.0MB      问题描述   为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面...
  • qq_39574690
  • qq_39574690
  • 2017-08-07 19:49
  • 74

算法提高 12-1三角形

算法提高 12-1三角形 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述   为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入三个点,输出这三个点构成的三角形的周长、面积、外心和重心。结果保留小...
  • qq_32792879
  • qq_32792879
  • 2017-02-27 22:05
  • 237

C/C++复习:点坐标(结构体)

/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All right reserved. *文件名称:77.cpp *作 者:董凯琦 *完成日期:2016年4月26日 *版 本 号:v1.0 * *问题描述:定义一个表示点坐标的结构体,输入两个点的坐标,...
  • Asleny
  • Asleny
  • 2016-04-26 13:12
  • 1239

数字三角形问题(DP)

数字三角形问题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字...
  • qq_16255321
  • qq_16255321
  • 2014-06-17 22:07
  • 659

Java例15.13——使用MVC结构计算三角形面积

MVC是一种通过模型、视图、控制器构造一个软件或组件的理想办法。 在例15.13中首先编一个封装三角形的类,然后再编写一个窗口。要求窗口使用3个文本框和1个文本区为三角形对象中的数据提供视图,其中3个文本框用来显示和更新三角形对象的3个边的长度,文本区对象用来显示三角形的面积。窗口有一个按钮,用户...
  • mcp3128
  • mcp3128
  • 2017-05-25 17:48
  • 676
    个人资料
    • 访问:139280次
    • 积分:4750
    • 等级:
    • 排名:第7080名
    • 原创:327篇
    • 转载:0篇
    • 译文:0篇
    • 评论:80条
    博客专栏
    最新评论