C++ 单一附合导线平差程序

news2024/12/24 7:44:51

一、以下图附合导线为例,图形如下:

二、第一步,读取测量数据,读取界面设计如下:

 读取数据文本文件格式如下:

(1)已知点坐标数据格式:

(2)角度观测值数据格式:

(3)边长观测值数据格式:

 读取文本文件的代码如下:

void TraverseAdjustment::onReadDataKnown()
{
    //打开文件对话框
    QString fileName = QFileDialog::getOpenFileName(this, tr("打开已知点数据"));
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        QMessageBox::StandardButton btnValue = QMessageBox::information(this, tr("提示"), tr("打开失败!"));

    //读取文本文件数据
    QTextStream stream(&file);
    pointKnown pk1;
    while (!stream.atEnd())
    {
        QString str = stream.readLine();
        QStringList list=str.split(",");
        pk1.number = list.at(0);
        pk1.x = list.at(1).toDouble();
        pk1.y = list.at(2).toDouble();
        ui.textEdit->append(str);
        vpKnown.push_back(pk1);
    }

    ui.lineEdit->setText(fileName);
}

说明:需要先创建一个字符串变量用于存储文件对话框返回的路径,然后创建一个文件操作对象,用返回路径进行初始化。使用open()函数打开文本文件,随后设置一个读写流对象,用于逐行读取文本,将单行文本分割后,赋值给创建的结构体对象,然后添加到vecctor中。

三、第二步,计算角度闭合差

观测值为左角时,有

{\alpha _{CD}}'=\alpha _{AB}-n*180+\sum\beta _{i}

f_{\beta }={\alpha }'_{CD}-\alpha _{CD}

其中n为导线转折角数,这里如图1的附合导线,n=8.

注意1:观测角度值之和应为各个观测角度(DMS度分秒格式)的十进制度数的总和,因此,需要将原始观测值逐一转换成十进制度,再求和。(原始角度观测数据为度分秒格式的) 

注意2:\alpha _{CD}等方位角的计算,由于atan()等三角函数返回的是弧度值,因此需要将结果转化成十进制度值再输出。利用坐标反算方法,得到已知边的方位角,如下:

\alpha _{AB}=atan(\left | y_{A} -y_{B}\right |/\left | x_{A}-x_{B} \right |)

(1)方位角计算代码如下:

double TraverseAdjustment::CoordinateInverse(double xa, double ya, double xb, double yb)
{
    double arfa_ab = atan(abs(yb - ya) / abs(xb - xa));//返回的是弧度值
    arfa_ab = Radian2Angle(arfa_ab);
    if (ya<yb&&xa>xb)
    {
        arfa_ab=180 - arfa_ab;
    }

    if (ya > yb && xa > xb)
    {
        arfa_ab = 180 + arfa_ab;
    }

    if (ya > yb && xa < xb)
    {
        arfa_ab = 360 - arfa_ab;
    }
    return arfa_ab;//返回十进制度数
}

 (2)闭合差计算代码如下:

void TraverseAdjustment::onAngleClosureError()
{
    double arfa_1=0;//角度观测值之和
    for (auto& val : vA)
    {
        double a = val.value;
        a = DMS2Angle(a);
        arfa_1 = arfa_1 + a;
    }

    qDebug() << arfa_1;
    qDebug() << DMS2Angle(1644.2828);

    double arfa_ab;//AB方位角值
    double arfa_cd;//CD方位角值

    arfa_ab = CoordinateInverse(vpKnown.at(0).x, vpKnown.at(0).y, vpKnown.at(1).x, vpKnown.at(1).y);
    arfa_cd = CoordinateInverse(vpKnown.at(2).x, vpKnown.at(2).y, vpKnown.at(3).x, vpKnown.at(3).y);
    qDebug() << arfa_ab;
    qDebug() << arfa_cd;
    qDebug() << DMS2Angle(303.2728);
    qDebug() << DMS2Angle(147.5628);
    Rab = arfa_ab;
    Rcd = arfa_cd;

    n = vA.size();
    double arfa_cd1 = 0;//理论角度值

    arfa_cd1 = arfa_ab - n * 180+arfa_1;

    if (arfa_cd1 > 360)
    {
        int t1 = arfa_cd1 / 360;
        arfa_cd1 = arfa_cd1 - t1 * 360;
    }

    double f_beta = arfa_cd1-arfa_cd;
    f_beta = f_beta * 3600;
    f = f_beta;

    ui.textEdit_2->append("角度闭合差:");
    ui.textEdit_2->append(QString::number(f_beta));
    ui.textEdit_2->append("限差:");
    ui.textEdit_2->append(QString::number(24*sqrt(n)));
    if (f_beta <= 24 * sqrt(n))
    {
        ui.textEdit_2->append("合格");
    }
    else
    {
        ui.textEdit_2->append("不合格");
    }
}

四、第三步,计算方位角

\hat{\beta _{i}}=\beta _{i}+v_{i} 

若角度闭合差附合限差,则将角度闭合差均分至各角度观测值(即求改正数),然后使用改正后的角度观测值计算各测站的方位角信息。观测值为左角时,有如下:

\alpha _{i}=\alpha _{i-1}+\beta _{i}-180

以此推算各测站方位角。

(1)方位角计算代码如下:

void TraverseAdjustment::CalculateAzimuth()
{
    //计算角度观测值改正数
    double t1 = -f / n;
    t1 = t1 / 3600;
    Angle a1;
    for (auto& val : vA)
    {
        a1.value = DMS2Angle(val.value)+t1;
        a1.number = val.number;
        a1.number1 = val.number1;
        a1.number2 = val.number2;
        va.push_back(a1);
    }

    ui.textEdit_2->clear();
    ui.textEdit_2->append("方位角结果:");
    Angle a2; double R1 = Rab;
    for (int i = 0; i < va.size(); i++)
    {
        double R = R1 + va.at(i).value-180;
        if (R > 360)
        {
            int t2 = R / 360;
            R = R - t2 * 360;
        }
        a2.number = va.at(i).number;
        a2.number1 = va.at(i).number1;
        a2.number2 = va.at(i).number2;
        a2.value = R;
        ui.textEdit_2->append(QString::number(R));
        vAzi.push_back(a2);
        R1 = R;
    }
}

五、第四步,计算坐标增量

 注意:这里的cos()函数等三角函数的输入值为弧度,应把方位角转化成护弧度在计算,否则结果错误。

(1)计算坐标增量的代码如下:

void TraverseAdjustment::onCalIncrement()
{
    Side s1; ui.textEdit_2->clear();
    ui.textEdit_2->append("X坐标增量:");
    for (int i = 0; i < vAzi.size(); i++)
    {
        s1.number1 = vAzi.at(i).number;
        s1.number2 = vAzi.at(i).number2;
        for (int j = 0; j < vS.size(); j++)
        {
            if (vAzi.at(i).number == vS.at(j).number1 && vAzi.at(i).number2 == vS.at(j).number2)
            {
                double b1 = vAzi.at(i).value;
                b1 = Angle2Radian(b1);
                s1.value = vS.at(j).value * cos(b1);//cos函数输入值需为弧度
                ui.textEdit_2->append(QString::number(s1.value));
                vXIn.push_back(s1);
                s1.value = vS.at(j).value * sin(b1);//sin函数输入值需为弧度
                vYIn.push_back(s1);
                break;
            }
        }
    }

    ui.textEdit_2->append("Y坐标增量:");
    for (auto& val : vYIn)
    {
        ui.textEdit_2->append(QString::number(val.value));
    }
}

六、第五步,计算坐标改正数

 这里只需按照上述公式计算即可。

(1)计算坐标改正数代码如下:

void TraverseAdjustment::onCalCorrection()
{
    ui.textEdit_2->clear();
    ui.textEdit_2->append("X增量改正数:");
    //计算坐标增量之和
    double detax = 0;
    double detay = 0;

    for (auto& val : vXIn)
    {
        double b1 = val.value;
        detax = detax + b1;
    }

    for (auto& val : vYIn)
    {
        double b1 = val.value;
        detay = detay + b1;
    }

    //计算坐标增量闭合差
    fx = detax - (vpKnown.at(2).x - vpKnown.at(1).x);
    fy = detay - (vpKnown.at(2).y - vpKnown.at(1).y);

    //计算坐标改正数
    double s1 = 0;//导线边距离之和
    for (auto& val : vS)
    {
        s1 = s1 + val.value;
    }

    Side s2;
    for (int i = 0; i<vXIn.size(); i++)
    {
        double d;
        for (int j=0; j < vS.size(); j++)
        {
            if (vXIn.at(i).number1 == vS.at(j).number1 && vXIn.at(i).number2 == vS.at(j).number2)
            {
                d = vS.at(j).value;
            }
        }
        s2.number1 = vXIn.at(i).number1;
        s2.number2 = vXIn.at(i).number2;
        s2.value = -fx / s1 * d;
        ui.textEdit_2->append(QString::number(s2.value));
        vX.push_back(s2);
    }

    ui.textEdit_2->append("Y增量改正数:");
    for (int i = 0; i < vYIn.size(); i++)
    {
        double d;
        for (int j = 0; j < vS.size(); j++)
        {
            if (vYIn.at(i).number1 == vS.at(j).number1 && vYIn.at(i).number2 == vS.at(j).number2)
            {
                d = vS.at(j).value;
            }
        }
        s2.number1 = vXIn.at(i).number1;
        s2.number2 = vXIn.at(i).number2;
        s2.value = -fy / s1 * d;
        ui.textEdit_2->append(QString::number(s2.value));
        vY.push_back(s2);
    }
}

七、第六步,计算未知点坐标值

按公式计算即可。

(1)计算坐标值代码如下:

void TraverseAdjustment::onCalCoordinate()
{
    ui.textEdit_2->clear();
    ui.textEdit_2->append("改正后X增量:");
    double x0 = vpKnown.at(1).x;
    double y0 = vpKnown.at(1).y;

    for (int i=0;i<vXIn.size();i++)
    {
        vXIn.at(i).value = vXIn.at(i).value + vX.at(i).value;
        ui.textEdit_2->append(QString::number(vXIn.at(i).value));
    }

    ui.textEdit_2->append("改正后Y增量:");
    for (int i = 0; i < vYIn.size(); i++)
    {
        vYIn.at(i).value = vYIn.at(i).value + vY.at(i).value;
        ui.textEdit_2->append(QString::number(vYIn.at(i).value));
    }
    
    ui.textEdit_2->append("X坐标:");
    pointKnown pk1; int t2 = 0;
    for (auto& val : vXIn)
    {
        pk1.number = val.number1;
        pk1.x = x0 + val.value;
        pk1.y = y0 + vYIn.at(t2).value;
        vp.push_back(pk1);
        x0 = pk1.x;
        y0 = pk1.y;
        if (t2 <= vYIn.size()-2)
        {
            ui.textEdit_2->append(QString::number(pk1.x, 'f', 8));
        }
        t2++;
    }

    ui.textEdit_2->append("Y坐标:");
    vp.pop_back();
    for (auto& val : vp)
    {
        ui.textEdit_2->append(QString::number(val.y,'f',8));
    }
}

 八、程序运行结果如下:

 九、上述计算结果均校对过,结果准确。附上完整代码

//.cpp文件
#include "TraverseAdjustment.h"

TraverseAdjustment::TraverseAdjustment(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(onReadDataKnown()));
    connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(onReadDataAngle()));
    connect(ui.pushButton_3, SIGNAL(clicked()), this, SLOT(onReadDataSide()));
    connect(ui.pushButton_5, SIGNAL(clicked()), this, SLOT(onAngleClosureError()));
    connect(ui.pushButton_4, SIGNAL(clicked()), this, SLOT(CalculateAzimuth()));
    connect(ui.pushButton_6, SIGNAL(clicked()), this, SLOT(onCalIncrement()));
    connect(ui.pushButton_7, SIGNAL(clicked()), this, SLOT(onCalCorrection()));
    connect(ui.pushButton_8, SIGNAL(clicked()), this, SLOT(onCalCoordinate()));
    ui.lineEdit->setReadOnly(true);
    ui.lineEdit_2->setReadOnly(true);
    ui.lineEdit_3->setReadOnly(true);
    ui.textEdit->setReadOnly(true);
    ui.textEdit_2->setReadOnly(true);
    ui.textEdit->append("读入数据展示:");
}

TraverseAdjustment::~TraverseAdjustment()
{}

void TraverseAdjustment::onCalCoordinate()
{
    ui.textEdit_2->clear();
    ui.textEdit_2->append("改正后X增量:");
    double x0 = vpKnown.at(1).x;
    double y0 = vpKnown.at(1).y;

    for (int i=0;i<vXIn.size();i++)
    {
        vXIn.at(i).value = vXIn.at(i).value + vX.at(i).value;
        ui.textEdit_2->append(QString::number(vXIn.at(i).value));
    }

    ui.textEdit_2->append("改正后Y增量:");
    for (int i = 0; i < vYIn.size(); i++)
    {
        vYIn.at(i).value = vYIn.at(i).value + vY.at(i).value;
        ui.textEdit_2->append(QString::number(vYIn.at(i).value));
    }
    
    ui.textEdit_2->append("X坐标:");
    pointKnown pk1; int t2 = 0;
    for (auto& val : vXIn)
    {
        pk1.number = val.number1;
        pk1.x = x0 + val.value;
        pk1.y = y0 + vYIn.at(t2).value;
        vp.push_back(pk1);
        x0 = pk1.x;
        y0 = pk1.y;
        if (t2 <= vYIn.size()-2)
        {
            ui.textEdit_2->append(QString::number(pk1.x, 'f', 8));
        }
        t2++;
    }

    ui.textEdit_2->append("Y坐标:");
    vp.pop_back();
    for (auto& val : vp)
    {
        ui.textEdit_2->append(QString::number(val.y,'f',8));
    }
}

void TraverseAdjustment::onCalCorrection()
{
    ui.textEdit_2->clear();
    ui.textEdit_2->append("X增量改正数:");
    //计算坐标增量之和
    double detax = 0;
    double detay = 0;

    for (auto& val : vXIn)
    {
        double b1 = val.value;
        detax = detax + b1;
    }

    for (auto& val : vYIn)
    {
        double b1 = val.value;
        detay = detay + b1;
    }

    //计算坐标增量闭合差
    fx = detax - (vpKnown.at(2).x - vpKnown.at(1).x);
    fy = detay - (vpKnown.at(2).y - vpKnown.at(1).y);

    //计算坐标改正数
    double s1 = 0;//导线边距离之和
    for (auto& val : vS)
    {
        s1 = s1 + val.value;
    }

    Side s2;
    for (int i = 0; i<vXIn.size(); i++)
    {
        double d;
        for (int j=0; j < vS.size(); j++)
        {
            if (vXIn.at(i).number1 == vS.at(j).number1 && vXIn.at(i).number2 == vS.at(j).number2)
            {
                d = vS.at(j).value;
            }
        }
        s2.number1 = vXIn.at(i).number1;
        s2.number2 = vXIn.at(i).number2;
        s2.value = -fx / s1 * d;
        ui.textEdit_2->append(QString::number(s2.value));
        vX.push_back(s2);
    }

    ui.textEdit_2->append("Y增量改正数:");
    for (int i = 0; i < vYIn.size(); i++)
    {
        double d;
        for (int j = 0; j < vS.size(); j++)
        {
            if (vYIn.at(i).number1 == vS.at(j).number1 && vYIn.at(i).number2 == vS.at(j).number2)
            {
                d = vS.at(j).value;
            }
        }
        s2.number1 = vXIn.at(i).number1;
        s2.number2 = vXIn.at(i).number2;
        s2.value = -fy / s1 * d;
        ui.textEdit_2->append(QString::number(s2.value));
        vY.push_back(s2);
    }
}

void TraverseAdjustment::onCalIncrement()
{
    Side s1; ui.textEdit_2->clear();
    ui.textEdit_2->append("X坐标增量:");
    for (int i = 0; i < vAzi.size(); i++)
    {
        s1.number1 = vAzi.at(i).number;
        s1.number2 = vAzi.at(i).number2;
        for (int j = 0; j < vS.size(); j++)
        {
            if (vAzi.at(i).number == vS.at(j).number1 && vAzi.at(i).number2 == vS.at(j).number2)
            {
                double b1 = vAzi.at(i).value;
                b1 = Angle2Radian(b1);
                s1.value = vS.at(j).value * cos(b1);//cos函数输入值需为弧度
                ui.textEdit_2->append(QString::number(s1.value));
                vXIn.push_back(s1);
                s1.value = vS.at(j).value * sin(b1);//sin函数输入值需为弧度
                vYIn.push_back(s1);
                break;
            }
        }
    }

    ui.textEdit_2->append("Y坐标增量:");
    for (auto& val : vYIn)
    {
        ui.textEdit_2->append(QString::number(val.value));
    }
}

void TraverseAdjustment::onReadDataKnown()
{
    //打开文件对话框
    QString fileName = QFileDialog::getOpenFileName(this, tr("打开已知点数据"));
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        QMessageBox::StandardButton btnValue = QMessageBox::information(this, tr("提示"), tr("打开失败!"));

    //读取文本文件数据
    QTextStream stream(&file);
    pointKnown pk1;
    while (!stream.atEnd())
    {
        QString str = stream.readLine();
        QStringList list=str.split(",");
        pk1.number = list.at(0);
        pk1.x = list.at(1).toDouble();
        pk1.y = list.at(2).toDouble();
        ui.textEdit->append(str);
        vpKnown.push_back(pk1);
    }

    ui.lineEdit->setText(fileName);
}

void TraverseAdjustment::onReadDataAngle()
{
    //打开文件对话框
    QString fileName = QFileDialog::getOpenFileName(this, tr("打开角度观测数据"));
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        QMessageBox::StandardButton btnValue = QMessageBox::information(this, tr("提示"), tr("打开失败!"));

    //读取数据
    QTextStream stream(&file);
    Angle va1;
    while (!stream.atEnd())
    {
        QString str = stream.readLine();
        QStringList list = str.split(",");
        va1.number = list.at(0);
        va1.number1 = list.at(1);
        va1.number2 = list.at(2);
        va1.value = list.at(3).toDouble();
        ui.textEdit->append(str);
        vA.push_back(va1);
    }
    ui.lineEdit_2->setText(fileName);
}

void TraverseAdjustment::onReadDataSide()
{
    //打开文件对话框
    QString fileName = QFileDialog::getOpenFileName(this, tr("打开边长观测数据"));
    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        QMessageBox::StandardButton btnValue = QMessageBox::information(this, tr("提示"), tr("打开失败!"));

    //读取数据
    QTextStream stream(&file);
    Side vs1;
    while (!stream.atEnd())
    {
        QString str = stream.readLine();
        QStringList list = str.split(",");
        vs1.number1 = list.at(0);
        vs1.number2 = list.at(1);
        vs1.value = list.at(2).toDouble();
        ui.textEdit->append(str);
        vS.push_back(vs1);
    }
    ui.lineEdit_3->setText(fileName);
}

void TraverseAdjustment::CalculateAzimuth()
{
    //计算角度观测值改正数
    double t1 = -f / n;
    t1 = t1 / 3600;
    Angle a1;
    for (auto& val : vA)
    {
        a1.value = DMS2Angle(val.value)+t1;
        a1.number = val.number;
        a1.number1 = val.number1;
        a1.number2 = val.number2;
        va.push_back(a1);
    }

    ui.textEdit_2->clear();
    ui.textEdit_2->append("方位角结果:");
    Angle a2; double R1 = Rab;
    for (int i = 0; i < va.size(); i++)
    {
        double R = R1 + va.at(i).value-180;
        if (R > 360)
        {
            int t2 = R / 360;
            R = R - t2 * 360;
        }
        a2.number = va.at(i).number;
        a2.number1 = va.at(i).number1;
        a2.number2 = va.at(i).number2;
        a2.value = R;
        ui.textEdit_2->append(QString::number(R));
        vAzi.push_back(a2);
        R1 = R;
    }
}

double TraverseAdjustment::Angle2Radian(double a)
{
    a = a * 0.017453293;
    return a;
}

double TraverseAdjustment::Radian2Angle(double a)
{
    a = a * 57.29578;
    return a;
}

double TraverseAdjustment::DMS2Angle(double a)
{
    int deg; double min, sed;
    deg = int(a);
    min = int((a - deg) * 100);
    sed = ((a - deg) * 100 - min) * 100;
    return deg + min / 60 + sed / 3600;
}

void TraverseAdjustment::onAngleClosureError()
{
    double arfa_1=0;//角度观测值之和
    for (auto& val : vA)
    {
        double a = val.value;
        a = DMS2Angle(a);
        arfa_1 = arfa_1 + a;
    }

    qDebug() << arfa_1;
    qDebug() << DMS2Angle(1644.2828);

    double arfa_ab;//BA方位角值
    double arfa_cd;//CD方位角值

    arfa_ab = CoordinateInverse(vpKnown.at(0).x, vpKnown.at(0).y, vpKnown.at(1).x, vpKnown.at(1).y);
    arfa_cd = CoordinateInverse(vpKnown.at(2).x, vpKnown.at(2).y, vpKnown.at(3).x, vpKnown.at(3).y);
    qDebug() << arfa_ab;
    qDebug() << arfa_cd;
    qDebug() << DMS2Angle(303.2728);
    qDebug() << DMS2Angle(147.5628);
    Rab = arfa_ab;
    Rcd = arfa_cd;

    n = vA.size();
    double arfa_cd1 = 0;//理论角度值

    arfa_cd1 = arfa_ab - n * 180+arfa_1;

    if (arfa_cd1 > 360)
    {
        int t1 = arfa_cd1 / 360;
        arfa_cd1 = arfa_cd1 - t1 * 360;
    }

    double f_beta = arfa_cd1-arfa_cd;
    f_beta = f_beta * 3600;
    f = f_beta;

    ui.textEdit_2->append("角度闭合差:");
    ui.textEdit_2->append(QString::number(f_beta));
    ui.textEdit_2->append("限差:");
    ui.textEdit_2->append(QString::number(24*sqrt(n)));
    if (f_beta <= 24 * sqrt(n))
    {
        ui.textEdit_2->append("合格");
    }
    else
    {
        ui.textEdit_2->append("不合格");
    }
}

double TraverseAdjustment::CoordinateInverse(double xa, double ya, double xb, double yb)
{
    double arfa_ab = atan(abs(yb - ya) / abs(xb - xa));//返回的是弧度值
    arfa_ab = Radian2Angle(arfa_ab);
    if (ya<yb&&xa>xb)
    {
        arfa_ab=180 - arfa_ab;
    }

    if (ya > yb && xa > xb)
    {
        arfa_ab = 180 + arfa_ab;
    }

    if (ya > yb && xa < xb)
    {
        arfa_ab = 360 - arfa_ab;
    }
    return arfa_ab;//返回十进制度数
}
//.h文件
#pragma once

#include <QtWidgets/QWidget>
#include "ui_TraverseAdjustment.h"
#include<QFileDialog>
#include<QFile>
#include<QMessageBox>
#include<QTextStream>
#include<QStringList>
#pragma execution_character_set("UTF-8")
#include"math.h"
#include<qDebug>


struct pointKnown
{
    QString number;
    double x;
    double y;
};

struct Angle 
{
    QString number;
    QString number1;
    QString number2;
    double value;
};

struct Side
{
    QString number1;
    QString number2;
    double value;
};


class TraverseAdjustment : public QWidget
{
    Q_OBJECT

public:
    TraverseAdjustment(QWidget *parent = nullptr);
    ~TraverseAdjustment();

public:
    std::vector<pointKnown> vpKnown;//已知点坐标
    std::vector<Angle> vA;//角度观测值
    std::vector<Side> vS;//边长观测值
    double f;//角度闭合差
    int n;//导线边数
    std::vector<Angle> va;//添加改正数后的角度值
    std::vector<Angle> vAzi;//方位角值
    double Rab, Rcd;//已知起始、终止边对应方位角
    std::vector<Side> vXIn;//坐标增量X
    std::vector<Side> vYIn;//坐标增量Y
    double fx, fy;//坐标增量闭合差
    std::vector<Side> vX;//X增量改正数
    std::vector<Side> vY;//Y增量改正数
    std::vector<pointKnown> vp;//各测点最终坐标值

public slots:
    void onReadDataKnown();
    void onReadDataAngle();
    void onReadDataSide();
    void onAngleClosureError();
    void CalculateAzimuth();
    void onCalIncrement();
    void onCalCorrection();
    void onCalCoordinate();

public:
    double Angle2Radian(double a);
    double DMS2Angle(double a);
    double Radian2Angle(double a);
    double CoordinateInverse(double xa, double ya, double xb, double yb);

private:
    Ui::TraverseAdjustmentClass ui;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1424952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中仕公考:公务员和事业单位哪个更难?

公务员有稳定的职位和福利待遇&#xff0c;一直是众多求职者的选择&#xff0c;事业单位招聘也吸引着大量求职者&#xff0c;许多人都在纠结于公务员和事业单位考试应该怎么选择。 先来看看公务员考试&#xff0c;公务员考试主要包括国家公务员考试和省级公务员考试。国家公务…

vue3动态循环引入本地静态图片资源

解决方法一 根据官网的提示&#xff0c;我找到了最简单的方法&#xff0c;就是在将asset 前面加上src。 解决方法二 关于第二个方法&#xff0c;官网说&#xff1a;“实际上&#xff0c;Vite 并不需要在开发阶段处理这些代码&#xff01;在生产构建时&#xff0c;Vite 才会进行…

Git命令窗口:创建一个.bashrc文件,别名实现git log (代替冗余的指令)查询提交修改日志功能

在我们的用户下创建一个.bashrc文件&#xff0c;然后添加如下代码。即可实现我们命令窗口由于每次想要看到好的效果而输入几条指令的问题。 这里我们就只需要使用 git-log 代替我们的git log。这样在命令窗口看到的效果就清晰明了。

在Android Studio中配置OpenCV

在Android Studio中配置OpenCV 1 下载OpenCV2 导入OpenCV模块3 修改配置4 增加依赖5 拷贝libopencv_java.so6 Activity中加入代码1 下载OpenCV 下载OpenCV的Android包并解压。 2 导入OpenCV模块 在Android应用中,导入OpenCV模块。 导入目录时选择Opencv Android中的sdk目…

铁轨语义分割(Unet结合resnet系列)

数据介绍 一类是图片&#xff0c;一类是图像标签。 引入库&#xff0c;处理数据 import torch.nn as nn import torch import torch.nn.functional as F import os from PIL import Image import torch from torch.utils.data import Dataset import torchvision.transfor…

分布式事务(二)—— CAP和Base理论

系列目录&#xff1a; 《分布式事务&#xff08;一&#xff09;—— 事务的基本概念》 一、CAP理论 cap理论是分布式系统的理论基石 1、Consistency[一致性] 即操作成功并返回客户端后&#xff0c;所有节点在同一时间的数据完全一致&#xff0c;这就是分布式的一致性。一致…

分享个前端工具-取色调色工具

这里虽然贴了两个&#xff0c;但推荐 Pipette. PipetteWin22.10.22.zip: https://download.csdn.net/download/rainyspring4540/88799632 图标&#xff1a; 界面&#xff1a; ColorPix https://download.csdn.net/download/rainyspring4540/88799642 图标&#xff1a; 界面…

在Windows11的WSL上运行Llama2-7b-chat 后记

往期的Llama2-7b-chat中我们试用了官方的demo&#xff0c;但是那个demo只能在代码中传入固定的对话&#xff0c;我稍微修改了一下&#xff0c;使其能在命令行中不间断对话&#xff08;不具备记忆功能&#xff09; 代码 import os import torch os.environ[PL_TORCH_DISTRIBUT…

基于 LLM+LlamaIndex+NebulaGraph,构建大模型知识图谱的检索(RAG)方法

最近&#xff0c;围绕着利用 LLM&#xff08;Language Model&#xff09;和知识图谱&#xff08;KG&#xff0c;Knowledge Graphs&#xff09;构建RAG&#xff08;Retrieval Augmented Generation&#xff09;流程引起了很多关注。 在本文中&#xff0c;让我们通过利用 LlamaI…

Linux部署DataEase数据分析工具并结合内网穿透实现任意设备远程查看数据

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

DolphinScheduler管理数仓任务规范

目录 一、DolphinScheduler调度数仓任务现状分析 2.1 一个任务流构建数仓所有的逻辑节点 2.2 每个逻辑节点构建一个任务流 二、数仓任务管理调度需求分析 三、DolphinScheduler数仓开发任务管理规范 四、结语 前言&#xff1a;大数据领域对多种任务都有调度需求&#xff…

modbus协议和示例

协议 主机读写 从站地址&#xff08;8bit&#xff09;功能码 &#xff08;8bit&#xff09;起始地址&#xff08;16bit&#xff09;数量&#xff08;16bit&#xff09;CRC&#xff08;16bit&#xff09; 从机对主机读取的回复 从站地址&#xff08;8bit&#xff09;功能码 …

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献&#xff1a;《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心 一、独立中线模块的三相四线拓扑 独立中线模块是控制中线电压恒为母线一半&#xff0c;同时为零序电流ineu提供通路。不平衡负载的零序电流会导致中线电压脉动&#xff0c;因此需要控制…

Python第十三章(递归与lamada)

一。引用类型 不可变类型&#xff1a;在改变原有类型的数据后&#xff0c;值的地址也会进行更改 包括&#xff1a;整数&#xff0c;浮点数&#xff0c;字符串&#xff0c;元组 用id()&#xff1a;进行判断是否十进制地址是否一样 可变类型&#xff1a;在改变原有类型后&…

一文教你如何本地搭建Qchan图床网站实现公网远程访问

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

endnote设置引用格式

1在这上面找到合适的style&#xff0c;比如搜索nature methods https://endnote.com/downloads/styles/​​​​​​2.下载到的ens用endnote打开&#xff0c;可以导入nature methods格式 3.引用的时候发现显示的插入是4-7&#xff0c;但是看了最近nature methods的是4,5,6,7 …

C/C++实现无序入参的命令解析工具

C/C实现无序入参的命令解析工具 1 实现思路2 主要功能3 效果展示3.1 直接运行代码图3.2help命令执行效果图3.3命令行执行命令解析效果图 4 代码实现5 代码下载 1 实现思路 基本介绍&#xff1a; 思路来源于atlas,atc(模型转换工具)&#xff0c;该工具对命令支持众多&#xff0…

多智能体强化学习--MAPPO(pytorch代码详解)

标题 代码详解Actor和Critic网络的设置 代码详解 代码链接&#xff08;点击跳转&#xff09; Actor和Critic网络的设置 基本设置&#xff1a;3个智能体、每个智能体观测空间18维。Actor网络&#xff1a;实例化一个actor对象&#xff0c;input-size是18Critic网络&#xff1…

Shell脚本——免交互

目录 一、Here Document免交互 1、免交互概述 2、语法格式 2.1示例&#xff1a;免交互方式实现对行数的统计&#xff0c;将要统计的内容置于标记EOF之间&#xff0c;直接将内容传给wc-l来统计 3、变量设定 ①变量图换成实际值 ②整行内容作为变量并输出结果 ③使输出内…

杠杆交易在伦敦金市场的优势与风险

伦敦金作为黄金市场的灯塔&#xff0c;每天吸引着全球投资者的目光。伦敦金的特殊地位使得以它为基准的杠杆交易成为众多投资者追逐的目标。在这篇文章中&#xff0c;我们将深入探讨伦敦金杠杆交易的奥秘&#xff0c;带你揭开这一盛宴的神秘面纱。 伦敦金杠杆交易的核心在于通过…