#include "calcArcCenterPoint.h"
calcArcCenterPoint::calcArcCenterPoint(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.btn_calc, SIGNAL(clicked()), this, SLOT(slotCalcArcCenter()));
connect(ui.btn_clear, SIGNAL(clicked()), this, SLOT(slotClear()));
}
void calcArcCenterPoint::calcArcCenter(Point p1, Point p2,double dRadius, Point & center1,Point & center2)
{
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;
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);
}
}
bool calcArcCenterPoint::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)
{
std::cout << "\n输入了相同的点!\n";
return false;
}
if ((2 * dRadius) >= dDistance)
return true;
else
{
std::cout << "\n两点间距离大于直径!\n";
return false;
}
}
double calcArcCenterPoint::Y_Coordinates(double x, double y, double k, double x0)
{
return k * x0 - k * x + y;
}
void calcArcCenterPoint::slotClear()
{
ui.lineEdit_arc1X->clear();
ui.lineEdit_arc1y->clear();
ui.lineEdit_arc2x->clear();
ui.lineEdit_arc2y->clear();
ui.lineEdit_radiu->clear();
ui.lineEdit_resX1->clear();
ui.lineEdit_resY1->clear();
ui.lineEdit_resX2->clear();
ui.lineEdit_resY2->clear();
}
void calcArcCenterPoint::slotCalcArcCenter()
{
//圆弧1坐标
double x1 = ui.lineEdit_arc1X->text().toDouble();
double y1 = ui.lineEdit_arc1y->text().toDouble();
double x2 = ui.lineEdit_arc2x->text().toDouble();
double y2 = ui.lineEdit_arc2y->text().toDouble();
double radiu = ui.lineEdit_radiu->text().toDouble();
Point p1;
p1.x = x1;
p1.y = y1;
Point p2;
p2.x = x2;
p2.y = y2;
Point centerp1;
Point centerp2;
calcArcCenter(p1,p2, radiu, centerp1, centerp2);
ui.lineEdit_resX1->setText(QString::number(centerp1.x));
ui.lineEdit_resY1->setText(QString::number(centerp1.y));
ui.lineEdit_resX2->setText(QString::number(centerp2.x));
ui.lineEdit_resY2->setText(QString::number(centerp2.y));
}