求圆心和交点

来源:互联网 发布:东德歧视知乎 编辑:程序博客网 时间:2024/04/29 14:38

/*

*此程序实现如下功能:

*1.已知四点{p1.x,p1.y},{p2.x,p2.y},{{p3.x,p3.y},{p4.x,p4.y},求经过点p1,点p2的直线和经过点p3,点p4的直线的交点;

*2.已知三点{p1.x,p1.y},{p2.x,p2.y},{{p3.x,p3.y},求经过这三点的圆的圆心;

*/

 

 

/*************
*author :vinco zhang
*e-mail: xuyunzhang693@qq.com
*concentrate on  both hardware and software of Embeded OS

*date:2011-3-17
*all right reserved
************/

#include<stdio.h>
#include<math.h>
struct point_
{
 float x;
 float y;
};
typedef struct point_ point;

point crossover_point(point p1,point p2,point p3,point p4)//line1:p1--p2 line2:p3--p4 get the crossover point
{
 point p;
 float k1;
 float k2;
 if( ( (p1.y-p2.x)==0 && (p3.x-p4.x)==0 ) || ( (p1.y-p2.y)==0 && (p3.y-p4.y)==0 ) ) //both are vertical or horizontal
 {
  printf("paralle line !/n");
  p.x=0.01;
  p.y=0.01;
  return(p);
 }
 
 if((p1.x-p2.x)==0)
 {
  k2=(p3.y-p4.y)/(p3.x-p4.x);

  p.x=p1.x;
  p.y=p3.y+k2*(p.x-p3.x);
  return(p);
 }

 if((p3.x-p4.x)==0)
 {
  k1=(p1.y-p2.y)/(p1.x-p2.x);

  p.x=p3.x;
  p.y=p1.y+k1*(p.x-p1.x);
  return(p);
 }

 k1=(p1.y-p2.y)/(p1.x-p2.x);
 k2=(p3.y-p4.y)/(p3.x-p4.x);

 p.x=((p1.y-p3.y)-(k1*p1.x-k2*p3.x))/(k2-k1);
 p.y=p3.y+k2*(p.x-p3.x);
 return(p);
}

point circle_center(point p1,point p2,point p3)
{
 point p,pa,pb;
 float k1,k2,ka,kb;

 pa.x=(p1.x+p2.x)/2;
 pa.y=(p1.y+p2.y)/2;
 pb.x=(p3.x+p2.x)/2;
 pb.y=(p3.y+p2.y)/2;
 
 if((p1.x-p2.x)==0)
 {
  p.y=pa.y;
  if((p3.y-p2.y)==0)
  {
   p.x=pb.x;
  }
  else
  {
   ka=0;
   k2=(p3.y-p2.y)/(p3.x-p2.x);
   kb=-1/k2;

   p.x=(p.y-pb.y)/kb+pb.x;
  }
  return(p);
 }

 if((p3.x-p2.x)==0)
 {
  p.y=pb.y;
  if((p1.y-p2.y)==0)
  {
   p.x=pa.x;
  }
  else
  {
   kb=0;
   k1=(p1.y-p2.y)/(p1.x-p2.x);
   ka=-1/k1;

   p.x=(p.y-pa.y)/ka+pa.x;
   return(p);
  }
 }

 if((p1.y-p2.y)==0)
 {
  k2=(p3.y-p2.y)/(p3.x-p2.x);
  kb=-1/k2;

  p.x=pa.x;
  p.y=kb*(p.x-pb.x)+pb.y;
  return(p);
 }

 if((p3.y-p2.y)==0)
 {
  k1=(p1.y-p2.y)/(p1.x-p2.x);
  ka=-1/k1;

  p.x=pb.x;
  p.y=ka*(p.x-pa.x)+pa.y;
  return(p);
 }

 k1=(p1.y-p2.y)/(p1.x-p2.x);
 ka=-1/k1;
 k2=(p3.y-p2.y)/(p3.x-p2.x);
 kb=-1/k2;
 
 p.x=((pa.y-pb.y)-(ka*pa.x-kb*pb.x))/(kb-ka);
 p.y=pb.y+kb*(p.x-pb.x);//p.y=pa.y+ka*(p.x-pa.x);
 return(p);
}
float point_distance(point p1,point p2)
{
 //double sqrt(double x);
 //float pow(float x, float y);
 float distance=sqrt((pow(p1.x-p2.x,2))+(pow(p1.y-p2.y,2)));
 return(distance);
}
void point_print(point p)
{
 printf("x=%f/ny=%f/n",p.x,p.y);
}
int main(void)
{
 point p;
 point p1={0,0};
 point p2={0,4};
 point p3={-2,2};
 point p4={2,2};

 float distance=point_distance(p1,p4);
 printf("distance=%f/n",distance);

 p=crossover_point(p1,p2,p3,p4);
 point_print(p);
 
 point p5={2*sqrt(3),0};
 point p6={sqrt(3),3};
 p=circle_center(p1,p5,p6);
 point_print(p);

 point p7={4,0};
 point p8={0,4};
 p=circle_center(p1,p7,p8);
 point_print(p);

 return 0;
}