C程序-蓝桥-12三角形

问题描述

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

样例输出

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

数据规模和约定

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

测试结果:

 

思路:本道题的重点在于三角形的性质

顺便做一下三角形性质普及

 

海伦公式: [1]  

假设在平面内,有一个三角形,边长分别为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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值