直线与圆的交点

已知直线上两个点 A、B的坐标  圆心C的坐标 圆的半径R  求 直线与圆的交点 D1 和D2

MainWindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QPointF>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
    QPointF startPos;//线段的起点
    QPointF endPos;//线段的终点
    QPointF agvPos;//agv的位置
    QPointF findPos(QPointF startPos, QPointF endPos, QPointF agvPos, int len);
 
};
 
#endif // MAINWINDOW_H
 

#include "mainwindow.h"

#include "ui_mainwindow.h"
#include "math.h"
#include <QDebug>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPointF pos;
    QPointF startPos(0,12);
    QPointF endPos(-12,0);
    QPointF agvPos(0,0);
    int len=12;
    pos=findPos(startPos, endPos,agvPos,  len);
    qDebug()<<pos.x()<<pos.y();
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
QPointF MainWindow::findPos(QPointF startPos, QPointF endPos, QPointF agvPos, int len)
{
    QPoint point1,point2;
    int m=0;
    float k;
    float b;
    //计算分子
    m=startPos.x()-endPos.x();
    //求直线的方程
    if(0==m)
    {
        k=100000;
        b=startPos.y()-k*startPos.x();
    }
    else
    {
        k=(endPos.y()-startPos.y())/(endPos.x()-startPos.x());
        b=startPos.y()-k*startPos.x();
 
    }
    qDebug()<<k<<b;
    //求直线与圆的交点 前提是圆需要与直线有交点
   if(fabs(k*agvPos.x()-agvPos.y()+b)/sqrt(k*k+b*b))
    {
 
        point1.setX((2*agvPos.x()-2*k*(b-agvPos.y())+sqrt(pow((2*k*(b-agvPos.y())-2*agvPos.x()),2)-4*(k*k+1)*((b-agvPos.y())*(b-agvPos.y())+agvPos.x()*agvPos.x()-len*len)))/(2*k*k+2));
        point2.setX((2*agvPos.x()-2*k*(b-agvPos.y())-sqrt(pow((2*k*(b-agvPos.y())-2*agvPos.x()),2)-4*(k*k+1)*((b-agvPos.y())*(b-agvPos.y())+agvPos.x()*agvPos.x()-len*len)))/(2*k*k+2));
        point1.setY(k*point1.x()+b);
        point2.setY(k*point2.x()+b);
    }
    qDebug()<<point1<<point2;
    //第一个点到终点的距离大于第二个点到终点坐标的距离,则返回的是第二个点坐标
    if((pow(point1.x()-endPos.x(),2)+pow(point1.y()-endPos.y(),2))>((pow(point2.x()-endPos.x(),2)+pow(point2.y()-endPos.y(),2))))
    {
            return point2;
     }
            else
    {
            return point1;
    }
 
 
 
 
 
 
}
 



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值