| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1066 人关注过本帖
标题:输入不共线的三个点坐标(x1, y1)(x2, y2)(x3, y3), 求出其过这三点的唯一圆 ...
只看楼主 加入收藏
blacker50
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2013-11-21
结帖率:71.43%
收藏
已结贴  问题点数:20 回复次数:2 
输入不共线的三个点坐标(x1, y1)(x2, y2)(x3, y3), 求出其过这三点的唯一圆的周长
不知道哪错了,请帮忙看看指错~~
#include<stdio.h>
#include<math.h>
#define PI 3.141592653589793
int main()
{
   double x1, y1, x2, y2, x3, y3, d, e, r;
   while(scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3) == 6)
   {
       d = ((x2 * x2- x3 * x3) * (y2 - y1) - (x1 * x1 - x2 * x2) * (y3 - y2)) / ((x1 - x2) * (y3 - y2) - (x2 - x3) * (y2 - y1));
       e = (x1 * x1 - x2 * x2 + d * (x1 - x2)) / (y2 - y1);
       r = sqrt((x1 + d / 2) * (x1 + d / 2) + (y1 + e / 2) * (y1 + e / 2));
       printf("%.2lf\n", 2 * PI * r);
    }
    return 0;
}


/*(a, b)设为圆心的坐标,x1, y1, x2, y2, x3, y3分别为不共线三个点的坐标,已知(x - a)^ 2 + (y - b) ^ 2 = r ^ 2
拆开来就是x^2 - 2ax + a ^ 2 + y ^ 2 - 2by + b ^ 2 - r ^ 2 = 0,令d = -2a, e = -2b, f = a ^ 2 + b ^ 2 - r ^ 2
即为 x ^ 2 + dx + ey + f = 0,所以有式子 x1^ 2 + dx1 + ey1 + f = 0……1
                                         x2 ^ 2 + dx2 + ey2 + f = 0……2
                                          x3 ^ 2 + dx3 + ey3 + f = 0……3
联立1与2得, (x1 ^ 2 - x2 ^ 2) + d(x1 - x2) + e(y1 - y2) = 0…… 4
联立3与2得,(x2 ^ 2 - x3 ^ 2) + d(x2 - x3) + e(y2 - y3) = 0……5
4式即, e = ((x1 ^ 2 - x2 ^ 2) + d(x1 - x2)) / (y2 - y1)
5式即, e = ((x2 ^ 2 - x3 ^ 2) + d(x2 - x3)) / (y3 - y2)
4式-5式得,(x1 ^ 2 - x2 ^ 2) / (y2 - y1) - (x2 ^ 2 - x3 ^ 2) / (y3 - y2) + d((x1 - x2) / (y2 - y1) - (x2 - x3) / (y3 - y2)) = 0
  d = ((x2 * x2- x3 * x3) * (y2 - y1) - (x1 * x1 - x2 * x2) * (y3 - y2)) / ((x1 - x2) * (y3 - y2) - (x2 - x3) * (y2 - y1))
   e = ((x1 * x1 - x2 * x2 + d * (x1 - x2)) / (y2 - y1) */
搜索更多相关主题的帖子: include double 圆的周长 
2014-02-10 13:51
大脸菜鸟
Rank: 2
等 级:论坛游民
帖 子:12
专家分:36
注 册:2013-10-16
收藏
得分:10 
你的除法 分母可能是0.

用向量的方式做,只有乘法,不会出现分母为0的状况。
弦向量 × (圆心到 弦中点组成的向量)=0;
2个方程组成方程组,求出 x,y
2014-02-10 15:31
大脸菜鸟
Rank: 2
等 级:论坛游民
帖 子:12
专家分:36
注 册:2013-10-16
收藏
得分:10 
(x1-x2,y1-y2),  (x1-x3,y1-y3),   (x-(x1+x2)/2, y-(y1+y2)/2),    (x-(x1+x3)/2,y-(y1+y3)/2)
(x1-x2)*(x-(x1+x2)/2)+(y1-y2)*(y-(y1+y2)/2)=0;
(x1-x3)*(x-(x1+x3)/2)+(y1-y3)*(y-(y1+y3)/2)=0;

if((y1-y2)*(x1-x3)==(y1-y3)*(x1-x2))
{
    printf("三点一线");
}
else
{
if(x1=x2)
{
    y=(y1+y2)/2;
    x=((y3-y1)*(y-(y1+y3)/2))/(x1-x3)+(x1+x3)/2;
}
else if(x1=x3)
{
    y=(y1+y3)/2;
    x=((y1-y2)*(y-(y1+y2)/2))/(x2-x1)+(x1+x2)/2;
}
else
{
    y=((x3-x2)/2+(y1-y2)(y1+y2)/(x1-x2)/2-(y1-y3)(y1+y3)/(x1-x3)/2)/((y1-y2)/(x1-x2)-(y1-y3)/(x1-x3));
    x=((y1-y2)*(y-(y1+y2)/2))/(x2-x1)+(x1+x2)/2;
}
}
2014-02-10 17:38
快速回复:输入不共线的三个点坐标(x1, y1)(x2, y2)(x3, y3), 求出其过这三点的唯 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016093 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved