算法提高 12-1三角形

给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢?
例如 :给定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为最终结果;
对于空间中的三角形,只不过最后解方程组的时候是三元方程组
Ps:克拉默法则可以用向量积和数量积的方法证明,也可以用高等代数的知识证明
可用此知识点解决的问题

http://acm.hdu.edu.cn/showproblem.php?pid=4720点击打开链接

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

例如 :给定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为最终结果;

对于空间中的三角形,只不过最后解方程组的时候是三元方程组

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

数据规模和约定
  输入数据中每一个数的范围。
  例:doule型表示数据。

#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <string>
#include<iostream>
#include<algorithm>
#include<cstring>
#include <cstdio>
using namespace std;
int x[4],y[4];
double zc()
{
      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]);
      return sqrt(a)+sqrt(b)+sqrt(c);
}
double mj()
{
    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=sqrt(a);
    b=sqrt(b);
    c=sqrt(c);
    double s=(a+b+c)/2;
    s=s*(s-a)*(s-b)*(s-c);
    return sqrt(s);
}



void wx(double &a,double &b)
{
    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=((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1));
    b=((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1));

}
void zx(double &c,double &d)
{
    c=(x[1]+x[2]+x[3])/3.0;
    d=(y[1]+y[2]+y[3])/3.0;
}

int main()
{

    for(int i=1;i<=3;i++)
        cin>>x[i]>>y[i];
    cout<< setiosflags(ios::fixed)<< setiosflags(ios::right)<<setprecision(2);


    cout<<zc()<<endl;
    cout<<mj()<<endl;
    double a,b;
    wx(a,b);
    cout<<a<<' '<<b<<endl;
    double c,d;
    zx(c,d);
    cout<<c<<' '<<d<<endl;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值