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