问题描述
为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体。分别设计独立的函数计算三角形的周长、面积、中心和重心。输入三个点,输出这三个点构成的三角形的周长、面积、外心和重心。结果保留小数点后2位数字。
样例输出
与上面的样例输入对应的输出。
例:
数据规模和约定
输入数据中每一个数的范围。
例:doule型表示数据。
测试结果:
思路:本道题的重点在于三角形的性质
顺便做一下三角形性质普及
假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:
而公式里的p为半周长(周长的一半):
注1:"Metrica"《度量论》手抄本中用s作为半周长,所以
和
两种写法都是可以的,但多用p作为半周长。
它的特点是形式漂亮,便于记忆。
三角形各心坐标
A(x1; y1);
B(x2; y2);
C(x3; y3);
④重心G(x4;y4);
x4=(x1+x2+x3)/3;
y4=(y1+y2+y3)/3;
⑤外心W(x5;y5);
根据外心到各顶点的距离相等:
AG=BG;
AG=CG;
即:
Sqrt[(x1 - x5)^2 + (y1 - y5)^2] == Sqrt[(x2 - x5)^2 + (y2 - y5)^2],
Sqrt[(x1 - x5)^2 + (y1 - y5)^2] == Sqrt[(x3 - x5)^2 + (y3 - y5)^2]
解得:
x5 = (x2^2 y1 - x3^2 y1 - x1^2 y2 + x3^2 y2 - y1^2 y2 + y1 y2^2 + x1^2 y3 - x2^2 y3 + y1^2 y3 - y2^2 y3 - y1 y3^2 + y2 y3^2)/(2 (x2 y1 - x3 y1 - x1 y2 + x3 y2 + x1 y3 - x2 y3));
y5 = -(-x1^2 x2 + x1 x2^2 + x1^2 x3 - x2^2 x3 - x1 x3^2 + x2 x3^2 - x2 y1^2 + x3 y1^2 + x1 y2^2 - x3 y2^2 - x1 y3^2 + x2 y3^2)/(2 (x2 y1 - x3 y1 - x1 y2 + x3 y2 + x1 y3 - x2 y3));
⑥内心N(x6;y6);
根据内心到各边的距离相等:
先求内心到各边垂线垂足与顶点的距离;
1/2 (Sqrt[(x1 - x2)^2 + (y1 - y2)^2] + Sqrt[(x1 - x3)^2 + (y1 - y3)^2] - Sqrt[(x2 - x3)^2 + (y2 - y3)^2]);
1/2 (Sqrt[(x1 - x2)^2 + (y1 - y2)^2] - Sqrt[(x1 - x3)^2 + (y1 - y3)^2] + Sqrt[(x2 - x3)^2 + (y2 - y3)^2]);
1/2 (-Sqrt[(x1 - x2)^2 + (y1 - y2)^2] + Sqrt[(x1 - x3)^2 + (y1 - y3)^2] + Sqrt[(x2 - x3)^2 + (y2 - y3)^2]);
计算内心到个顶点的距离;根据勾股定理计算内心到各边的距离,根据距离相等列方程:
(x1 - x6)^2 - 1/4 (Sqrt[(x1 - x2)^2 + (y1 - y2)^2] + Sqrt[(x1 - x3)^2 + (y1 - y3)^2] - Sqrt[(x2 - x3)^2 + (y2 - y3)^2])^2 + (y1 - y6)^2 == (x2 - x6)^2 - 1/4 (Sqrt[(x1 - x2)^2 + (y1 - y2)^2] - Sqrt[(x1 - x3)^2 + (y1 - y3)^2] + Sqrt[(x2 - x3)^2 + (y2 - y3)^2])^2 + (y2 - y6)^2,
(x1 - x6)^2 - 1/4 (Sqrt[(x1 - x2)^2 + (y1 - y2)^2] + Sqrt[(x1 - x3)^2 + (y1 - y3)^2] - Sqrt[(x2 - x3)^2 + (y2 - y3)^2])^2 + (y1 - y6)^2 == (x3 - x6)^2 - 1/4 (-Sqrt[(x1 - x2)^2 + (y1 - y2)^2] + Sqrt[(x1 - x3)^2 + (y1 - y3)^2] + Sqrt[(x2 - x3)^2 + (y2 - y3)^2])^2 + (y3 - y6)^2
解得:
x6 = (x2^2 y1 - x3^2 y1 - x1^2 y2 + x3^2 y2 - y1^2 y2 + y1 y2^2 + x1^2 y3 - x2^2 y3 + y1^2 y3 - y2^2 y3 - y1 y3^2 + y2 y3^2 + y2 Sqrt[x1^2 - 2 x1 x2 + x2^2 + y1^2 - 2 y1 y2 + y2^2] Sqrt[x1^2 - 2 x1 x3 + x3^2 + y1^2 - 2 y1 y3 + y3^2] - Sqrt[x1^2 - 2 x1 x2 + x2^2 + y1^2 - 2 y1 y2 + y2^2] y3 Sqrt[x1^2 - 2 x1 x3 + x3^2 + y1^2 - 2 y1 y3 + y3^2] - y1 Sqrt[x1^2 - 2 x1 x2 + x2^2 + y1^2 - 2 y1 y2 + y2^2] Sqrt[x2^2 - 2 x2 x3 + x3^2 + y2^2 - 2 y2 y3 + y3^2] + Sqrt[x1^2 - 2 x1 x2 + x2^2 + y1^2 - 2 y1 y2 + y2^2] y3 Sqrt[x2^2 - 2 x2 x3 + x3^2 + y2^2 - 2 y2 y3 + y3^2] + y1 Sqrt[x1^2 - 2 x1 x3 + x3^2 + y1^2 - 2 y1 y3 + y3^2] Sqrt[x2^2 - 2 x2 x3 + x3^2 + y2^2 - 2 y2 y3 + y3^2] - y2 Sqrt[x1^2 - 2 x1 x3 + x3^2 + y1^2 - 2 y1 y3 + y3^2] Sqrt[x2^2 - 2 x2 x3 + x3^2 + y2^2 - 2 y2 y3 + y3^2])/(2 (x2 y1 - x3 y1 - x1 y2 + x3 y2 + x1 y3 - x2 y3));
y6 = -(-x1^2 x2 + x1 x2^2 + x1^2 x3 - x2^2 x3 - x1 x3^2 + x2 x3^2 - x2 y1^2 + x3 y1^2 + x1 y2^2 - x3 y2^2 - x1 y3^2 + x2 y3^2 + x2 Sqrt[x1^2 - 2 x1 x2 + x2^2 + y1^2 - 2 y1 y2 + y2^2] Sqrt[x1^2 - 2 x1 x3 + x3^2 + y1^2 - 2 y1 y3 + y3^2] - x3 Sqrt[x1^2 - 2 x1 x2 + x2^2 + y1^2 - 2 y1 y2 + y2^2] Sqrt[x1^2 - 2 x1 x3 + x3^2 + y1^2 - 2 y1 y3 + y3^2] - x1 Sqrt[x1^2 - 2 x1 x2 + x2^2 + y1^2 - 2 y1 y2 + y2^2] Sqrt[x2^2 - 2 x2 x3 + x3^2 + y2^2 - 2 y2 y3 + y3^2] + x3 Sqrt[x1^2 - 2 x1 x2 + x2^2 + y1^2 - 2 y1 y2 + y2^2] Sqrt[x2^2 - 2 x2 x3 + x3^2 + y2^2 - 2 y2 y3 + y3^2] + x1 Sqrt[x1^2 - 2 x1 x3 + x3^2 + y1^2 - 2 y1 y3 + y3^2] Sqrt[x2^2 - 2 x2 x3 + x3^2 + y2^2 - 2 y2 y3 + y3^2] - x2 Sqrt[x1^2 - 2 x1 x3 + x3^2 + y1^2 - 2 y1 y3 + y3^2] Sqrt[x2^2 - 2 x2 x3 + x3^2 + y2^2 - 2 y2 y3 + y3^2])/(2 (x2 y1 - x3 y1 - x1 y2 + x3 y2 + x1 y3 - x2 y3));
⑦垂心H(x7;y7);
分别做高线: AH⊥BC;BH⊥AC;
(y1 - y7)/(x1 - x7) (y2 - y3)/(x2 - x3) == -1,
(y2 - y7)/(x2 - x7) (y1 - y3)/(x1 - x3) == -1
解得:
x7 = -(x1 x2 y1 - x1 x3 y1 - x1 x2 y2 + x2 x3 y2 + y1^2 y2 - y1 y2^2 + x1 x3 y3 - x2 x3 y3 - y1^2 y3 + y2^2 y3 + y1 y3^2 - y2 y3^2)/(-x2 y1 + x3 y1 + x1 y2 - x3 y2 - x1 y3 + x2 y3);
y7 = -(x1^2 x2 - x1 x2^2 - x1^2 x3 + x2^2 x3 + x1 x3^2 - x2 x3^2 + x1 y1 y2 - x2 y1 y2 - x1 y1 y3 + x3 y1 y3 + x2 y2 y3 - x3 y2 y3)/(x2 y1 - x3 y1 - x1 y2 + x3 y2 + x1 y3 - x2 y3);
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main( )
{
double p[6],a,b,c,l,m,n,q,t,u,x,y,z;
double C,S;
double wx,wy,zx,zy;
int i;
for(i=0;i<6;i++)
{
scanf("%lf",&p[i]);//坐标点信息
}
//求出各边的边长
a=sqrt(pow(abs(p[0]-p[2]),2)+pow(abs(p[1]-p[3]),2));
b=sqrt(pow(abs(p[0]-p[4]),2)+pow(abs(p[1]-p[5]),2));
c=sqrt(pow(abs(p[2]-p[4]),2)+pow(abs(p[3]-p[5]),2));
C=a+b+c;//周长
//用海伦公式求面积
l=(a+b+c)/2;
S=sqrt(l*(l-a)*(l-b)*(l-c));
//求三角形外心
x=p[3]-p[5];
y=p[5]-p[1];
z=p[1]-p[3];
m=2*(p[0]*x+p[2]*y+p[4]*z);
n=p[0]*p[0]*x+p[2]*p[2]*y+p[4]*p[4]*z;
q=x*y*z;
wx=(n-q)/m;
t=p[1]*p[1]*(p[2]-p[4])+p[3]*p[3]*(p[4]-p[0])+p[5]*p[5]*(p[0]-p[2]);
u=(p[0]-p[2])*(p[2]-p[4])*(p[4]-p[0]);
wy=(-t+u)/m;
//求三角形重心
zx=(p[0]+p[2]+p[4])/3;
zy=(p[1]+p[3]+p[5])/3;
printf("%.2lf\n%.2lf\n",C,S);
printf("%.2lf %.2lf\n",wx,wy);
printf("%.2lf %.2lf\n",zx,zy);
return 0;
}