求圆心和交点
来源:互联网 发布:东德歧视知乎 编辑:程序博客网 时间: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;
}
- 求圆心和交点
- 求过圆心直线与圆的两个交点
- 求过圆心直线与圆的两个交点
- 已知圆上三点坐标求圆心和半径
- 求过圆心直线与圆的两个交点(JAVA & OC)
- 第11周项目4-3求过圆外一点与圆心的连线与圆的两个交点
- 求交点
- VTK 求多边形和直线的交点
- 已知两点坐标和半径求圆心坐标程序C++
- 已知半径和两圆相交面积求圆心距
- 如何求椭圆圆心
- zoj 1450 (http://blog.himdd.com/?p=2666) 很多只是可以做模板,直线相交求交点,三角形外接圆圆心(外心)
- 第十二周项目四 点、圆的关系-(3)求点与圆心的连线在圆上的交点
- 求绕圆心的向量
- 已知圆上三点坐标求圆心
- 如何求三角形和线的交点.InterSection函数
- 如何求三角形和线的交点InterSection函数
- POJ 2074(视线与障碍物+求直线和线段交点)
- 权限管理
- OpenSSL生成证书
- asp.net小贴士
- Hash Table
- 核危机或全面失控 菅直人称做好东日本全毁准备
- 求圆心和交点
- 软件工程与现场管理
- firefox 和 ie 事件处理的细节,研究,再研究-----书写同时兼容ie和ff的事件处理代码
- UC 交互设计,笔试题
- IMEI
- cygwin中文支持与vim配置文件冲突
- 迭代器
- zend debug配置
- xampp环境的使用