直线与圆的交点

时间:2021-08-25 04:18:45

直线与圆的交点

已知直线上两个点 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;
    }
 


 
 
 
 
}