• 转 已知两点坐标和半径求圆心坐标程序C++


     
    数学思想:利用圆方程和直线方程
    已知两点坐标和半径求圆心坐标程序  
    #include <iostream>
    #include <fstream>
    #include <cmath>
    
    using namespace std;
    
    ofstream fout;
    
    typedef struct 
    {
        double x;
        double y;
    }Point;
    
    double Y_Coordinates(double x,double y,double k,double x0);//4个参数
    void Circle_Center(Point p1,Point p2,double dRadius);
    bool Data_Validation(Point p1,Point p2,double dRadius);
    void ReadData(Point &p1,Point &p2,double &dRadius);
    
    void main()
    {
        Point p1,p2;
        double dRadius = 0.0;
    
        ReadData(p1,p2,dRadius);
    
        fout.open("Result.txt");
        Circle_Center(p1,p2,dRadius);
        fout.close();
    }
    
    void Circle_Center(Point p1,Point p2,double dRadius)
    {
        double k = 0.0,k_verticle = 0.0;
        double mid_x = 0.0,mid_y = 0.0;
        double a = 1.0;
        double b = 1.0;
        double c = 1.0;
        Point center1,center2;
        k = (p2.y - p1.y) / (p2.x - p1.x);
        if(k == 0)
        {
            center1.x = (p1.x + p2.x) / 2.0;
            center2.x = (p1.x + p2.x) / 2.0;
            center1.y = p1.y + sqrt(dRadius * dRadius -(p1.x - p2.x) * (p1.x - p2.x) / 4.0);
            center2.y = p2.y - sqrt(dRadius * dRadius -(p1.x - p2.x) * (p1.x - p2.x) / 4.0);
        }
        else
        {
            k_verticle = -1.0 / k;
            mid_x = (p1.x + p2.x) / 2.0;
            mid_y = (p1.y + p2.y) / 2.0;
            a = 1.0 + k_verticle * k_verticle;
            b = -2 * mid_x - k_verticle * k_verticle * (p1.x + p2.x);
            c = mid_x * mid_x + k_verticle * k_verticle * (p1.x + p2.x) * (p1.x + p2.x) / 4.0 - 
                (dRadius * dRadius - ((mid_x - p1.x) * (mid_x - p1.x) + (mid_y - p1.y) * (mid_y - p1.y)));
            
            center1.x = (-1.0 * b + sqrt(b * b -4 * a * c)) / (2 * a);
            center2.x = (-1.0 * b - sqrt(b * b -4 * a * c)) / (2 * a);
            center1.y = Y_Coordinates(mid_x,mid_y,k_verticle,center1.x);
            center2.y = Y_Coordinates(mid_x,mid_y,k_verticle,center2.x);
        }
    
        fout << center1.x << "    " << center1.y << endl;
        fout << center2.x << "    " << center2.y << endl;
    }
    
    double Y_Coordinates(double x,double y,double k,double x0)
    {
        return k * x0 - k * x + y;
    }
    
    bool Data_Validation(Point p1,Point p2,double dRadius)
    {
        double dDistance = 0.0;
        dDistance = sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
        if(dDistance == 0.0)
        {
            cout << "
    输入了相同的点!
    ";
            return false;
        }
        if((2 * dRadius) >= dDistance)
            return true;
        else
        {
            cout << "
    两点间距离大于直径!
    ";
            return false;
        }
    }
    
    void ReadData(Point &p1,Point &p2,double &dRadius)
    {
        cout << "请输入圆周上一点的坐标:";
        cin >> p1.x >> p1.y;
        cout << "请输入圆周上另一点的坐标:";
        cin >> p2.x >> p2.y;
        cout << "请输入圆的半径:";
        cin >> dRadius;
    
        if(! Data_Validation(p1,p2,dRadius))
        {
            cout << endl << "数据不合理!
    ";
            exit(0);
        }
    }
    View Code
  • 相关阅读:
    day 66 ORM django 简介
    day 65 HTTP协议 Web框架的原理 服务器程序和应用程序
    jQuery的事件绑定和解绑 事件委托 轮播实现 jQuery的ajax jQuery补充
    background 超链接导航栏案例 定位
    继承性和层叠性 权重 盒模型 padding(内边距) border(边框) margin 标准文档流 块级元素和行内元素
    属性选择器 伪类选择器 伪元素选择器 浮动
    css的导入方式 基础选择器 高级选择器
    03-body标签中相关标签
    Java使用内存映射实现大文件的上传
    正则表达式
  • 原文地址:https://www.cnblogs.com/lhuan/p/5753847.html
Copyright © 2020-2023  润新知