问题描述
为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入三个点,输出这三个点构成的三角形的周长、面积、外心和重心。结果保留小数点后2位数字。
样例输入
0 0
0 1
1 0
样例输出
3.41
0.50
0.50 0.50
0.33 0.33
数据规模和约定
输入数据中每一个数的范围。
例:doule型表示数据
特别注意
函数不能和系统已有函数重名,我就是这个被坑连好久,distance是STL中求迭代器距离的一个函数,如果重名会有【error:no type named iterator_category in struct】
参考代码
#include <iostream>//数据输入输出流
#include <string.h>//字符串操作函数
#include <stdio.h>//C的输入输出
#include <stdlib.h>//定义杂项函数及内存分配函数
#include <math.h>//C中的数学函数
#include <vector>//STL vetor容器
#include <list>//STL list
#include <map>// STL map
#include <queue>// STL queue
#include <stack>//sTL stack
#include <algorithm>//STL各种算法 比如 swap sort merge max min 比较
#include <numeric>//常用数字操作 一般和algorithm搭配使用
#include <malloc.h>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int maxn = 100;
struct Point{/*用横纵坐标表示一点*/
double x,y;
};
struct Triangle{/*用三个点表示一个三角形*/
struct Point a,b,c;
};
double Distance(Point a,Point b){/*求两点之间的距离*/
double xx,yy;
xx=(a.x-b.x)*(a.x-b.x);
yy=(a.y-b.y)*(a.y-b.y);
return sqrt(xx+yy);
}
int main(){
Triangle t;
//t=(Triangle *)malloc(sizeof(struct Triangle));
scanf("%lf%lf%lf%lf%lf%lf",&t.a.x,&t.a.y,&t.b.x,&t.b.y,&t.c.x,&t.c.y);
double Perimeter,Area,FocusX,FocusY,x,y;
Perimeter=Distance(t.a,t.b)+Distance(t.a,t.c)+Distance(t.b,t.c);
double x1,y1,x2,y2;
x1=t.a.x-t.c.x; y1=t.a.y-t.c.y;
x2=t.b.x-t.c.x; y2=t.b.y-t.c.y;
/**
令a、b为三角形的两个相邻的边向量
a(x1, y1),b(x2, y2)
列成矩阵形式
|x1 y1|
|x2 y2|
这个 2*2 矩阵的行列式的绝对值就是 |x1y2-x2y1|,
这就是以 a,b 为两条边的平行四边形的面积,
自然以 a,b 为两条边的三角形面积就是 |(x1y2-x2y1)|/2了
*/
Area=fabs(x1*y2-x2*y1)/2.0;
FocusX=(t.a.x+t.b.x+t.c.x)/3.0;
FocusY=(t.a.y+t.b.y+t.c.y)/3.0;
//外心算法-外心到三角形任意一点的距离都相同性质+克拉默法则(行列式求解)
//(x-a1)^2+(y-b1)^2=(x-a2)^2+(y-b2)^2
//化简:2(a2-a1)x+2(b2-b1)y=a2^2+b2^2-a1^2-b1^2 ①
//同理也有:2(a3-a1)x+2(b3-b1)y=a3^2+b3^2-a1^2-b1^2 ②
/*
两个式子简化:A1*x+B1*y=C1 ①,A2*x+B2*y=C2 ②
转型化为行列式:[A1 B1] 记为D.计算D=A1*B2-B1*A2
[A2 B2]
根据克拉默法则:x=D1/D,D1=[C1 B1] =C1*B2-B1*C2 [用C1,C2替代D的第一列数变为D1]
[C2 B2]
y=D2/D,D2=[A1 C1]=A1*C2-C1*A2
[A2 C2]
注:本段来自https://blog.csdn.net/qq_39574690/article/details/76855971
*/
double A1,B1,A2,B2,C1,C2,D,D1,D2;
A1=2*(t.b.x-t.a.x);
B1=2*(t.b.y-t.a.y);
A2=2*(t.c.x-t.a.x);
B2=2*(t.c.y-t.a.y);
C1=t.b.x*t.b.x+t.b.y*t.b.y-t.a.x*t.a.x-t.a.y* t.a.y;
C2=t.c.x*t.c.x+t.c.y*t.c.y-t.a.x*t.a.x-t.a.y* t.a.y;
D=A1*B2-A2*B1;
D1=C1*B2-C2*B1;
D2=A1*C2-A2*C1;
x=D1/D;
y=D2/D;
printf("%.2lf\n%.2lf\n%.2lf %.2lf\n%.2lf %.2lf\n",Perimeter,Area,x,y,FocusX,FocusY);
return 0;
}