算法提高 12-1三角形

原创 2017年02月11日 15:30:18

问题描述
  为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入三个点,输出这三个点构成的三角形的周长、面积、外心和重心。结果保留小数点后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();
    }
}

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。若需转载,请注明http://blog.csdn.net/qq_30091945 举报

相关文章推荐

蓝桥 ADV-230 算法提高 12-1三角形 【数学公式】

算法提高 12-1三角形   时间限制:1.0s   内存限制:256.0MB      问题描述   为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体...

算法提高 12-1三角形

算法提高 12-1三角形   时间限制:1.0s   内存限制:256.0MB      问题描述   为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3 这些都要找出来

实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3 这些都要找出来

每天学习一算法系列(12) (求1+2+…+n,不能使用乘除法,for、while、if 、else、switch、case 等关键字以及条件判断语句)

题目:   求1+2+…+n. 要求不能使用乘除法、for、while、if 、else、switch、case 等关键字以及条件判断语句(A?B:C).   题目来源于:http://to...
  • yuucyf
  • yuucyf
  • 2011-05-06 18:13
  • 4273

2015-12-7 项目1—数据结构之自建算法库——图及其存储结构(邻接矩阵、邻接表)

1.问题及代码 1.头文件:graph.h,包含定义图数据结构的代码、宏定义、要实现算法的函数的声明; void ArrayToMat(int *Arr, int n, MGraph &g);...

算法习题12:求1+2+…+n 不能使用关键字

题目:求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等关键字 以及条件判断语句(A?B:C)。 被考倒了。。。 基本答案来自http:...
  • ylf13
  • ylf13
  • 2013-10-15 11:46
  • 1152

算法导论-12-1-具有相同关键字元素的二叉查找树

题目: 相同关键字的存在,给二叉查找树的实现带来了一些问题。 a)当用TREE-INSERT将n个具有相同关键字的数据项插入到一棵初始为空的二叉查找树中时,该算法的渐近性能如何? 我们可以对TR...

【算法学习笔记】12.数据结构基础 图的初步1

= ,=  妈蛋,拓扑排序和欧拉回路先fangyi

nefuoj 12 西游记之三角形

西游记之三角形 Problem:12 Time Limit:1000ms Memory Limit:65536K ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)