2015年大一下第11周项目4-点、圆关系(3)直线与圆的交点

/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:Annpion.cpp
*作者:王耀鹏
*完成日期:2015年5月21日
*版本号:v1.0
*
*问题描述:以Point为基类,派生出一个Circle(圆)类。
*输入描述:无。
*输出描述:点与圆心所成直线与圆的两个交点。
*/
#include <iostream>
#include<cmath>
using namespace std;
class Circle;
class Point
{
protected:
    double x,y;
public:
    Point (){}
    Point(double a,double b):x(a),y(b){}
    friend ostream &operator<<(ostream & out,const Point &p);
    friend void doublePoint (Point &p,Circle &c,Point &p1,Point &p2);
};
ostream &operator<<(ostream & out,const Point &p)
{
    cout<<"("<<p.x<<","<<p.y<<")";
    return out;
}
class Circle:public Point
{
private:
    double r;
public:
    Circle(double a,double b,double c):Point(a,b),r(c){}
    friend ostream &operator<<(ostream & out,const Circle &c);
    friend void doublePoint (Point &p,Circle &c,Point &p1,Point &p2);
};
ostream &operator<<(ostream & out,const Circle &c)
{
    cout<<"圆心为:"<<"("<<c.x<<","<<c.y<<")"<<"半径为:"<<c.r;
    return out;
}
void doublePoint (Point &p,Circle &c,Point &p1,Point &p2)
{
    p1.x = (c.x + sqrt(c.r*c.r/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));
    p2.x = (c.x - sqrt(c.r*c.r/(1+((c.y-p.y)/(c.x-p.x))*((c.y-p.y)/(c.x-p.x)))));
    p1.y = (p.y + (p1.x -p.x)*(c.y-p.y)/(c.x-p.x));
    p2.y = (p.y + (p2.x -p.x)*(c.y-p.y)/(c.x-p.x));
}
int main( )
{
    Circle c1(3,2,4);
    Point p1(1,1),p2,p3;

    doublePoint(p1,c1, p2, p3);

    cout<<"点p1: "<<p1<<endl;
    cout<<"与圆c1: "<<c1<<endl;
    cout<<"的圆心相连,与圆交于两点,分别是:"<<endl;
    cout<<"交点1: "<<p2<<endl;
    cout<<"交点2: "<<p3<<endl;
    return 0;
}



运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Matlab中,可以通过一些数学和几何的方法来求解直线交点。 首先,需要确定直线的参数方程和的参数方程。对于直线,可以使用两间的直线方程或参数方程表示。对于,可以使用其心和半径来表示。 假设直线的参数方程为: x = x0 + t*(x1 - x0) y = y0 + t*(y1 - y0) 的参数方程为: (x - a)^2 + (y - b)^2 = r^2 其中,(x0, y0)和(x1, y1)为直线上两的坐标,(a, b)为心的坐标,r为的半径。 为了求解直线交点,需要将直线方程代入的方程中,得到一个关于t的方程。然后,通过求解这个方程,可以得到直线交点。 假设直线交点为(x, y),则有: (x - a)^2 + (y - b)^2 = r^2 代入直线的参数方程,得到: (x0 + t*(x1 - x0) - a)^2 + (y0 + t*(y1 - y0) - b)^2 = r^2 展开和简化方程,得到一个关于t的二次方程。 通过解这个二次方程,可以得到t的两个值,然后再将这两个t值代回直线的参数方程中,求解得到对应的两个交点坐标。 在Matlab中,可以使用符号计算的工具箱来解这个二次方程,例如使用`solve`函数。示例代码如下: syms t % 定义直线的参数 x0 = 1; y0 = 1; x1 = 5; y1 = 3; a = 2; b = 2; r = 2; % 求解二次方程 eq = (x0 + t*(x1 - x0) - a)^2 + (y0 + t*(y1 - y0) - b)^2 == r^2; sol = solve(eq, t); % 求解交点坐标 x = [x0 + sol(1)*(x1 - x0), x0 + sol(2)*(x1 - x0)]; y = [y0 + sol(1)*(y1 - y0), y0 + sol(2)*(y1 - y0)]; 通过上述代码,可以得到直线的两个交点坐标(x, y)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值