#include <stdio.h>
#include <math.h>
typedef struct{
double x,y;
}Point;
void Perimeter(Point *p){
printf("%.2lf\n",sqrt((p[1].x - p[0].x)*(p[1].x - p[0].x)+(p[1].y - p[0].y)*(p[1].y - p[0].y))+
sqrt((p[2].x - p[0].x)*(p[2].x - p[0].x)+(p[2].y - p[0].y)*(p[2].y - p[0].y)) +
sqrt((p[2].x - p[1].x)*(p[2].x - p[1].x)+(p[2].y - p[1].y)*(p[2].y - p[1].y)));
}
void Area(Point *p){
//海伦公式sqrt(p(p-a)(p-b)(p-c))or向量法
//这里采用向量法
Point p1[2];
double cos_theta,sin_theta,model1,model2;
p1[0].x = p[1].x - p[0].x,p1[0].y = p[1].y - p[0].y;
p1[1].x = p[2].x - p[0].x,p1[1].y = p[2].y - p[0].y;
model1 = sqrt((p[1].x - p[0].x)*(p[1].x - p[0].x)+(p[1].y - p[0].y)*(p[1].y - p[0].y));
model2 = sqrt((p[2].x - p[0].x)*(p[2].x - p[0].x)+(p[2].y - p[0].y)*(p[2].y - p[0].y));
cos_theta = (p1[0].x * p1[1].x + p1[0].y * p1[1].y)/(model1*model2);
sin_theta = sqrt(1-cos_theta*cos_theta);
printf("%.2lf\n",0.5*model1*model2*sin_theta);
}
void Circumcenter(Point *p){
//外接圆,圆心到三个顶点的距离相等列方程,可解出(x,y)
double denominator,delta_x,delta_y;
denominator = 2*(p[1].x - p[0].x)*(p[2].y - p[0].y) - 2*(p[1].y - p[0].y)*(p[2].x - p[0].x);
delta_x = (p[2].y - p[0].y)*(p[1].x*p[1].x + p[1].y*p[1].y - p[0].x*p[0].x - p[0].y*p[0].y)
-(p[1].y - p[0].y)*(p[2].x*p[2].x + p[2].y*p[2].y - p[0].x*p[0].x - p[0].y*p[0].y);
delta_y = (p[1].x - p[0].x)*(p[2].x*p[2].x + p[2].y*p[2].y - p[0].x*p[0].x - p[0].y*p[0].y)
-(p[2].x - p[0].x)*(p[1].x*p[1].x + p[1].y*p[1].y - p[0].x*p[0].x - p[0].y*p[0].y);
printf("%.2lf %.2lf\n",delta_x/denominator,delta_y/denominator);
}
void Center_Of_Gravity(Point *p) {
//一个顶点到另一边的中心连线的2/3处
Point p1;
p1.x = (p[0].x + p[1].x)/2.0,p1.y = (p[0].y + p[1].y)/2.0;
printf("%.2lf %.2lf\n",p[2].x+2.0*(p1.x - p[2].x)/3,p[2].y+2.0*(p1.y - p[2].y)/3);//注意哪个减去哪个
}
int main(){
Point p[3];
int i;
for(i = 0; i < 3; i ++)
scanf("%lf%lf",&p[i].x,&p[i].y);
Perimeter(p);
Area(p);
Circumcenter(p);
Center_Of_Gravity(p);
return 0;
}
有关外心的解法来自:http://www.zybang.com/question/28231e30758cfa6af7567f1482011fd9.html
原文:http://www.cnblogs.com/520xiuge/p/6399656.html