算法提高 12-1三角形

问题描述

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

样例输出

与上面的样例输入对应的输出。
例:

这里写图片描述
数据规模和约定

输入数据中每一个数的范围。  
 例:doule型表示数据。

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

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

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

(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));

因此,x,y为最终结果;

代码如下:

package ADV_230;

import java.util.Scanner;

public class Main {

    //求三角形的周长
        public static double perimeter(int x[],int y[]){
       //求三角形的三边长,求和
        double a=(x[1]-x[2])*(x[1]-x[2])+(y[1]-y[2])*(y[1]-y[2]);
        double b=(x[2]-x[3])*(x[2]-x[3])+(y[2]-y[3])*(y[2]-y[3]);
        double c=(x[3]-x[1])*(x[3]-x[1])+(y[3]-y[1])*(y[3]-y[1]);
        double perimeter=Math.sqrt(a)+Math.sqrt(b)+Math.sqrt(c);
        return perimeter;
    }
    //求三角形的面积
    public static double area(int x[],int y[]){
        //求出三边长,
        double a=(x[1]-x[2])*(x[1]-x[2])+(y[1]-y[2])*(y[1]-y[2]);
        double b=(x[2]-x[3])*(x[2]-x[3])+(y[2]-y[3])*(y[2]-y[3]);
        double c=(x[3]-x[1])*(x[3]-x[1])+(y[3]-y[1])*(y[3]-y[1]);
        a=Math.sqrt(a);
        b=Math.sqrt(b);
        c=Math.sqrt(c);
        //求出周长的一般后,再利用公式求面积
        double p=(a+b+c)/2;
        double area=Math.sqrt(p*(p-a)*(p-b)*(p-c));
        return area;
    }
    //求三角形的外心坐标
    public static void wx(int x[],int y[],double a[]){
        double a1=2*(x[2]-x[1]);
        double b1=2*(y[2]-y[1]);
        double c1=(x[2]*x[2]+y[2]*y[2]-x[1]*x[1]-y[1]*y[1]);
        double a2=2*(x[3]-x[2]);
        double b2=2*(y[3]-y[2]);
        double c2=(x[3]*x[3]+y[3]*y[3]-x[2]*x[2]-y[2]*y[2]);
        a[0]=(c1*b2-c2*b1)/(a1*b2-a2*b1);
        a[1]=(a1*c2-a2*c1)/(a1*b2-a2*b1);

    }
    //求三角形的重心坐标
    public static void zx(int x[],int y[],double a[]){
        a[0]=(x[1]+x[2]+x[3])*1.0/3;
        a[1]=(y[1]+y[2]+y[3])*1.0/3;

    }

    public static void main(String[] args) {
        int x[]=new int[4];
        int y[]=new int[4];
        Scanner cin=new Scanner(System.in);
        for(int i=1;i<=3;i++)
        {
            x[i]=cin.nextInt();
            y[i]=cin.nextInt();
        }
        System.out.println(String.format("%.2f",perimeter(x,y)));
        System.out.println(String.format("%.2f",area(x,y)));
        double a[]=new double[2];
        wx(x,y,a);
        System.out.print(String.format("%.2f",a[0])+" ");
        System.out.println(String.format("%.2f",a[1]));
        zx(x,y,a);
        System.out.print(String.format("%.2f",a[0])+" ");
        System.out.println```
(String.format("%.2f",a[1]));
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值