2020-08-05

#include <iostream>
#include "XMatLib.h"
#include "alg.h"
#include "math.h"
#include "uwb_util.h"
#include <windows.h>
#include <sql.h>  
#include <sqlext.h>   
#include <odbcss.h>  


#define MAP202_flag 0
#define MapXmin 0
#define MapXmax 623
#define MapYmin 0
#define MapYmax 691

 

 

using namespace std;
const uint64_t c_Light_Speed = 29979245800;        //Speed of light c  cm/s 
const uint64_t CLOCK_COUNTS = 63897600000;        //1 second in internal clock counts
uint32_t target_Id[10] = { 0 };
uint32_t Device_ID = 0;
double a[4][3] = { {0,0,0} ,{0,0,0} ,{0,0,0} ,{0,0,0} };
TGlobalCfg g_GlobalConfig;
ALG_LOCADATA alg_data;
void Init_anchor(void);
void get_pos(uint64_t ts_1, uint64_t ts_2, uint64_t ts_3, uint64_t ts_4);
void get_pos_temp(uint64_t ts_1, uint64_t ts_2, uint64_t ts_3, uint64_t ts_4);
double BS[4][3] = {
    { 490, 10 ,253},
    { 124, 10 ,253},
    { 120, 693,255 },
    { 490, 693 ,267}
};
/***************************************************************************************************************
* NOTE      |
* ParamIn   |
* ParamOut  |
* Return    |
***************************************************************************************************************/

int main()
{
    double orginData[4];
    char qBuff[100] = { 0 };
    system("mode con cols=150 lines=50");
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTitleW(L"UWB定位引擎");

    SQLHENV henv = SQL_NULL_HENV;
    SQLHANDLE dbc;
    const char dsn[] = "DRIVER={SQL Server};SERVER=19.87.3.157;DATABASE=zhao;UID=sa;PWD=ZCX213526";

    //TODO 
    RETCODE retcode = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &dbc);

    SQLCHAR outstr[1024];
    SQLSMALLINT outstrlen;
    retcode = SQLDriverConnect(dbc, NULL, (SQLCHAR*)dsn, SQL_NTS, outstr, sizeof(outstr), &outstrlen, SQL_DRIVER_NOPROMPT);
    if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO))
    {
        printf("连接失败!\n");
        system("PAUSE");
        return -1;
    }

    SQLHSTMT stmt;
    int intTemp = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
    if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt))
    {
        printf("Failed to connect");
        system("PAUSE");
        return -1;
    }


    bool flag = true;
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
    retcode = SQLSetStmtAttr(stmt, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER)SQL_BIND_BY_COLUMN, SQL_IS_INTEGER);
    while (true)
    {
        double Pos[2] = { 0 };
        double x = 0;
        double y = 0;
        SQLLEN timeStamp[4] = { 0 };
        SQLCHAR time[32], pos[32];
        SQLINTEGER target, loc_sn;
        SQLLEN mLen;

        retcode = SQLExecDirect(stmt, (SQLCHAR*)("SELECT  TOP 1 * FROM uwb_tb  WHERE pos IS NULL AND anchor_a IS NOT NULL AND anchor_b IS NOT NULL AND anchor_c IS NOT NULL AND anchor_d IS NOT NULL ORDER BY loc_sn DESC"), SQL_NTS);
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
        {
            /*  句柄、列、变量类型、接收缓冲、缓冲长度、返回的长度   */
            SQLBindCol(stmt, 1, SQL_C_LONG, &target, 4, &mLen);
            SQLBindCol(stmt, 2, SQL_C_LONG, &loc_sn, 4, &mLen);
            SQLBindCol(stmt, 3, SQL_C_SBIGINT, &timeStamp[0], 8, &mLen);
            SQLBindCol(stmt, 4, SQL_C_SBIGINT, &timeStamp[1], 8, &mLen);
            SQLBindCol(stmt, 5, SQL_C_SBIGINT, &timeStamp[2], 8, &mLen);
            SQLBindCol(stmt, 6, SQL_C_SBIGINT, &timeStamp[3], 8, &mLen);
            SQLBindCol(stmt, 7, SQL_C_CHAR, time, 32, &mLen);
        }
        else if (retcode == SQL_NO_DATA)
        {
            system("PAUSE");
            continue;
        }

        if (true == flag)
        {
            SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
            flag = !flag;
        }
        else
        {
            SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY);
            flag = !flag;
        }
        //printf("into while get pos !!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
        //遍历数据  


        while (true)
        {
            retcode = SQLFetch(stmt);
            if (retcode == SQL_NO_DATA_FOUND)
            {
                break;
            }
            else if (retcode == SQL_ERROR)
            {
                printf("fetch error\n");
                break;
            }
            else
            {
                
                Device_ID = (uint32_t)target;
                Init_anchor();
                get_pos(timeStamp[0], timeStamp[1], timeStamp[2], timeStamp[3]);
                get_pos_temp(timeStamp[0], timeStamp[1], timeStamp[2], timeStamp[3]);

                printf("%s\t %d\t %d\t %llu\t %llu\t %llu\t %llu\t %f\t%f\t\n\n", time, target, loc_sn, timeStamp[0], timeStamp[1], timeStamp[2], timeStamp[3],alg_data.tagInfo.Mat_PosX, alg_data.tagInfo.Mat_PosY);
                //get_pos_temp(timeStamp[0], timeStamp[1], timeStamp[2], timeStamp[3]);
            }
        }
        SQLFreeHandle(SQL_HANDLE_STMT, stmt);
        retcode = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

            sprintf(qBuff, "UPDATE uwb_tb SET pos=\'%f,%f\' WHERE target=%d AND loc_sn=%d", a[3][0], a[3][1], target, loc_sn);

            retcode = SQLExecDirect(stmt, (SQLCHAR*)qBuff, SQL_NTS);
            if (retcode != SQL_SUCCESS)
            {
                printf("[%d]>>%s\n", retcode, qBuff);
            }
        

        memset(qBuff, 0, sizeof(qBuff));

    }

    SQLFreeHandle(SQL_HANDLE_STMT, stmt);
    SQLDisconnect(dbc);
    SQLFreeHandle(SQL_HANDLE_DBC, dbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);

    system("PAUSE");
    return 0;

}
/***************************************************************************************************************
* NOTE      |
* ParamIn   |
* ParamOut  |
* Return    |
***************************************************************************************************************/
#if MAP202_flag
void Init_anchor(void)
{
    g_GlobalConfig.select_count = 5;

    memset(&alg_data, 0, sizeof(alg_data));
    alg_data.tagInfo.TagId = Device_ID;
    alg_data.tagInfo.BaseStationNum = 4;
    alg_data.tagInfo.loca_mode = 1;
    alg_data.tagInfo.dimension = 2;
    alg_data.tagInfo.fPresetHeight = 50.0;//80.0;//150
    alg_data.tagInfo.qCurTime = _Xtime_get_ticks() / 10000;
    alg_data.tagInfo.b18 = 0x52;
    alg_data.tagInfo.b19 = 3;
    alg_data.tagInfo.w1A = 0x44C;
    alg_data.tagInfo.qw8 = 3;
    alg_data.tagInfo.u38 = 2;
    alg_data.tagInfo.MapLevel = 1;

    alg_data.anchor_data[0].AnchorId = 0x20070018050392;
    //alg_data.anchor_data[0].timestamp = 0xE77B55010B;
    //alg_data.anchor_data[0].timestamp2 = alg_data.anchor_data[0].timestamp;
    alg_data.anchor_data[0].FirstSignalLv = -83.23f;
    //alg_data.anchor_data[0].FirstSignalLv = -10.23f;
    alg_data.anchor_data[0].SignalLv = -79.21f;
    alg_data.anchor_data[0].PosX = 62;//485
    alg_data.anchor_data[0].PosY = 261.0f;//10
    alg_data.anchor_data[0].PosZ = 370;//245

    alg_data.anchor_data[1].AnchorId = 0x20070018050469;
    //alg_data.anchor_data[1].timestamp = 0xE77B550104;
    //alg_data.anchor_data[1].timestamp2 = alg_data.anchor_data[1].timestamp;
    alg_data.anchor_data[1].FirstSignalLv = -87.43;
    //alg_data.anchor_data[0].FirstSignalLv = -10.23f;
    alg_data.anchor_data[1].SignalLv = -79.67;
    alg_data.anchor_data[1].PosX = 669;//109
    alg_data.anchor_data[1].PosY = 207.0f;//10
    alg_data.anchor_data[1].PosZ = 339;

    alg_data.anchor_data[2].AnchorId = 0x20070018050282;
    //alg_data.anchor_data[2].timestamp = 0xE77B54FFE5;
    //alg_data.anchor_data[2].timestamp2 = alg_data.anchor_data[2].timestamp;
    alg_data.anchor_data[2].FirstSignalLv = -95.28;
    //alg_data.anchor_data[0].FirstSignalLv = -10.23f;
    alg_data.anchor_data[2].SignalLv = -80.53;
    alg_data.anchor_data[2].PosX = 709;//515
    alg_data.anchor_data[2].PosY = 1097.0f;//609
    alg_data.anchor_data[2].PosZ = 340;//245


    alg_data.anchor_data[3].AnchorId = 0x20070018050464;
    //alg_data.anchor_data[3].timestamp = 0xE77B550015;
    //alg_data.anchor_data[0].FirstSignalLv = -10.23f;
    alg_data.anchor_data[3].SignalLv = -76.57;
    alg_data.anchor_data[3].PosX = 57;//119
    alg_data.anchor_data[3].PosY = 1097.0f;//690.0f;
    alg_data.anchor_data[3].PosZ = 340;//258

    for (uint i = 0; i < alg_data.tagInfo.BaseStationNum; i++)
    {
        alg_data.anchor_data[i].bUse50 = 1;
        alg_data.anchor_data[i].has_tdoa = 1;
        alg_data.anchor_data[i].qw8 = 1;
    }
}
#else
void Init_anchor(void)
{
    g_GlobalConfig.select_count = 5;

    memset(&alg_data, 0, sizeof(alg_data));
    alg_data.tagInfo.TagId = Device_ID;
    alg_data.tagInfo.BaseStationNum = 4;
    alg_data.tagInfo.loca_mode = 1;
    alg_data.tagInfo.dimension = 2;
    alg_data.tagInfo.fPresetHeight = 80.0;//80.0;//150
    alg_data.tagInfo.qCurTime = _Xtime_get_ticks() / 10000;
    alg_data.tagInfo.b18 = 0x52;
    alg_data.tagInfo.b19 = 23;//3
    alg_data.tagInfo.w1A = 0x44C;
    alg_data.tagInfo.qw8 = 3;
    alg_data.tagInfo.u38 = 2;
    alg_data.tagInfo.MapLevel = 1;

    alg_data.anchor_data[0].AnchorId = 0x20070018050392;
    //alg_data.anchor_data[0].timestamp = 0xE77B55010B;
    //alg_data.anchor_data[0].timestamp2 = alg_data.anchor_data[0].timestamp;
    alg_data.anchor_data[0].FirstSignalLv = -83.23f;
    //alg_data.anchor_data[0].FirstSignalLv = -10.23f;
    alg_data.anchor_data[0].SignalLv = -79.21f;
    alg_data.anchor_data[0].PosX = 490;//485
    alg_data.anchor_data[0].PosY = 10.0f;//10
    alg_data.anchor_data[0].PosZ = 253;//245

    alg_data.anchor_data[1].AnchorId = 0x20070018050469;
    //alg_data.anchor_data[1].timestamp = 0xE77B550104;
    //alg_data.anchor_data[1].timestamp2 = alg_data.anchor_data[1].timestamp;
    alg_data.anchor_data[1].FirstSignalLv = -87.43;
    //alg_data.anchor_data[0].FirstSignalLv = -10.23f;
    alg_data.anchor_data[1].SignalLv = -79.67;
    alg_data.anchor_data[1].PosX = 124;//109
    alg_data.anchor_data[1].PosY = 10.0f;//10
    alg_data.anchor_data[1].PosZ = 253;

    alg_data.anchor_data[2].AnchorId = 0x20070018050282;
    //alg_data.anchor_data[2].timestamp = 0xE77B54FFE5;
    //alg_data.anchor_data[2].timestamp2 = alg_data.anchor_data[2].timestamp;
    alg_data.anchor_data[2].FirstSignalLv = -95.28;
    //alg_data.anchor_data[0].FirstSignalLv = -10.23f;
    alg_data.anchor_data[2].SignalLv = -80.53;
    alg_data.anchor_data[2].PosX = 120;//515
    alg_data.anchor_data[2].PosY = 693.0f;//609
    alg_data.anchor_data[2].PosZ = 255;//245


    alg_data.anchor_data[3].AnchorId = 0x20070018050464;
    //alg_data.anchor_data[3].timestamp = 0xE77B550015;
    //alg_data.anchor_data[0].FirstSignalLv = -10.23f;
    alg_data.anchor_data[3].SignalLv = -76.57;
    alg_data.anchor_data[3].PosX = 490;//119
    alg_data.anchor_data[3].PosY = 693.0f;//690.0f;
    alg_data.anchor_data[3].PosZ = 267;//258

    for (uint i = 0; i < alg_data.tagInfo.BaseStationNum; i++)
    {
        alg_data.anchor_data[i].bUse50 = 1;
        alg_data.anchor_data[i].has_tdoa = 1;
        alg_data.anchor_data[i].qw8 = 1;
    }
}
#endif
/***************************************************************************************************************
* NOTE      |
* ParamIn   |
* ParamOut  |
* Return    |
***************************************************************************************************************/
bool comp_timestamp(const TAnchorData& a, const TAnchorData& b)
{
    return (int64)b.timestamp2 > (int64)a.timestamp;
}
/***************************************************************************************************************
* NOTE      |
* ParamIn   |
* ParamOut  |
* Return    |
***************************************************************************************************************/
bool comp_tdoa(const TAnchorData& a, const TAnchorData& b)
{
    return b.tdoa > a.tdoa;
}
/***************************************************************************************************************
* NOTE      |
* ParamIn   |
* ParamOut  |
* Return    |
***************************************************************************************************************/
int CalcTdoa(ALG_LOCADATA* pLocData)
{
    int ret = 0;

    if (g_GlobalConfig.select_count < 4)
    {
        pLocData->tagInfo.err_94 = 14;
        return 0;
    }
    arma::Mat<double> locMat1(pLocData->tagInfo.BaseStationNum, 5);
    locMat1.zeros();

    std::sort(pLocData->anchor_data,
        &pLocData->anchor_data[pLocData->tagInfo.BaseStationNum], comp_timestamp);

    uint UseCount = 0;

    for (uint i = 0; i < pLocData->tagInfo.BaseStationNum; i++)
    {
        TAnchorData* pAnchor = &pLocData->anchor_data[i];
        (*(arma::Mat<uint64>*) & locMat1)(i, 0) = pAnchor->AnchorId;
        locMat1(i, 1) = pAnchor->PosX;
        locMat1(i, 2) = pAnchor->PosY;
        locMat1(i, 3) = pAnchor->PosZ;
        (*(arma::Mat<uint64>*) & locMat1)(i, 4) = pAnchor->timestamp2;
        UseCount++;
    }

    if (UseCount < 4)
    {
        pLocData->tagInfo.err_94 = 50;
        return 0;
    }

    //locMat1.print();
    //cout << "subview=======" << endl;

    uint start_row = 0;
    for (start_row = 1; start_row <= (UseCount - 3); start_row++)
    {
        arma::subview<double> sv1 = locMat1.submat(0, 1, 0, 2);
        arma::subview<double> sv2 = locMat1.submat(1, 1, 1, 2);
        arma::subview<double> sv3 = locMat1.submat(0, 1, 0, 2);
        arma::subview<double> sv4 = locMat1.submat(2, 1, 2, 2);

        Glue_sv_sv_join GlueA(sv1, sv2);
        Glue_sv_sv_join GlueB(sv3, sv4);
        arma::Glue<Glue_sv_sv_join, Glue_sv_sv_join, arma::glue_join_cols> glue_glue_mat(GlueA, GlueB);

        //求行列式
        double detv = XMatLib::det_glue(glue_glue_mat);
        if (detv != 0.0f)
            break;

        arma::subview_row<double> sv_row1 = locMat1.row(2);
        arma::subview_row<double> sv_rowi = locMat1.row(2 + start_row);

        arma::subview_row<double> sv_tmprow = locMat1.row(2);
        sv_tmprow = sv_rowi;
        sv_tmprow = locMat1.row(2 + start_row);
        sv_tmprow = sv_row1;
    }
    if (start_row > (UseCount - 3))
        return 0;

    arma::Mat<double> tmpMat1(0, 0);
    uint i_row = 4;
    for (start_row = 3; i_row <= UseCount; start_row++)
    {
        double row3i_x = locMat1(start_row, 1);
        double row3i_y = locMat1(start_row, 2);
        double row0_x = locMat1(0, 1);
        double row0_y = locMat1(0, 2);
        double row1_x = locMat1(1, 1);
        double row1_y = locMat1(1, 2);
        double row2_x = locMat1(2, 1);
        double row2_y = locMat1(2, 2);

        //求出前三个基站与最后一个基站的坐标距离
        double dis0_3i = std::sqrt((row0_x - row3i_x) * (row0_x - row3i_x) + (row0_y - row3i_y) * (row0_y - row3i_y));
        double dis1_3i = std::sqrt((row1_x - row3i_x) * (row1_x - row3i_x) + (row1_y - row3i_y) * (row1_y - row3i_y));
        double dis2_3i = std::sqrt((row2_x - row3i_x) * (row2_x - row3i_x) + (row2_y - row3i_y) * (row2_y - row3i_y));
        //cout << dis0_3i << "  " << dis1_3i << "  " << dis2_3i << endl;
        if (dis1_3i >= dis0_3i && dis2_3i >= dis1_3i)
            break;

        i_row++;
    }
    if (i_row > UseCount)
    {
        tmpMat1 = locMat1.row(3);
        i_row = 4;
    }
    else
    {
        tmpMat1 = locMat1.row(i_row - 1);
    }

    arma::Mat<double> tmpMat2(0, 0);
    int select_count = g_GlobalConfig.select_count;
    if (g_GlobalConfig.select_count >= 5 && UseCount > 4)
    {
        if (UseCount < g_GlobalConfig.select_count)
            select_count = UseCount;
        locMat1.shed_row(i_row - 1);
        tmpMat2 = locMat1.rows(3, select_count - 2);
    }

    arma::subview<double> sv_tmprow = tmpMat1.row(0);
    arma::subview<double> sv_row1 = locMat1.rows(0, 2);

    //arma::mat tmpMat3(0, 0);
    //arma::Glue<arma::subview<double>, arma::subview<double>, arma::glue_join_cols> glue_svsv(sv_row1, sv_tmprow);
    //arma::Glue<Glue_sv_sv_join, arma::mat, arma::glue_join_cols> glue_glue_mat(glue_svsv, tmpMat2);
    //arma::glue_join_cols::apply(tmpMat3, glue_glue_mat);

    arma::mat tmpMat3 = arma::join_cols(sv_row1, sv_tmprow, tmpMat2);

    int tMat3_n_rows = tmpMat3.n_rows;
    if (tmpMat3.n_rows)
    {
        uint64_t timestamp0 = (*(arma::Mat<uint64>*) & tmpMat3)(0, 4);
        for (int i = 0; i < tmpMat3.n_rows; i++)
        {
            // timespan / CLOCK_COUNTS 为 TDOA
            // TDOA 值乘以光速,就是标签到两个基站距离差的观测值
            uint64_t timestamp_tmp = (*(arma::Mat<uint64>*) & tmpMat3)(i, 4);
            double timespan = (double)((uint32_t)timestamp_tmp - (uint32_t)timestamp0);
            tmpMat3(i, 4) = timespan / CLOCK_COUNTS * c_Light_Speed;
        }
    }
    else
    {
        tMat3_n_rows = 0;
    }

    for (uint i = 0; i < pLocData->tagInfo.BaseStationNum; i++)
    {
        for (int m = 0; m < tMat3_n_rows; m++)
        {
            if ((*(arma::Mat<uint64>*) & tmpMat3)(m, 0) == pLocData->anchor_data[i].AnchorId)
            {
                pLocData->anchor_data[i].tdoa = tmpMat3(m, 4);
                pLocData->anchor_data[i].has_tdoa = 1;
                break;
            }
        }
    }

    std::sort(pLocData->anchor_data,
        &pLocData->anchor_data[pLocData->tagInfo.BaseStationNum], comp_tdoa);
    ret = 1;
    return ret;
}
/***************************************************************************************************************
* NOTE      |
* ParamIn   |
* ParamOut  |
* Return    |
***************************************************************************************************************/
int CalcM3(std::vector<double>& vecPosX, std::vector<double>& vecPosY, std::vector<double>& vecPosZ, std::vector<double>& vecR, Loc12_Node_Item* pTagPos, char b18, double factor, double fPresetHeight)
{
    int ret = 0;
    int tdoa_num = vecPosX.size() - 1;
    arma::mat locMatX(vecPosX.size(), 1);
    arma::mat locMatY(vecPosX.size(), 1);
    arma::mat locMatZ(vecPosX.size(), 1);
    arma::mat locMatR(vecPosX.size() - 1, 1);

    memcpy((double*)locMatX.mem, vecPosX.data(), sizeof(double) * vecPosX.size());
    memcpy((double*)locMatY.mem, vecPosY.data(), sizeof(double) * vecPosX.size());
    memcpy((double*)locMatZ.mem, vecPosZ.data(), sizeof(double) * vecPosX.size());
    memcpy((double*)locMatR.mem, vecR.data() + 1, sizeof(double) * tdoa_num);

    arma::mat DisMat(4, 1);
    arma::mat AverageMat(1, 2);
    AverageMat(0, 0) = pTagPos->average_X;
    AverageMat(0, 1) = pTagPos->average_Y;
    DisMat(0, 0) = pTagPos->min_posX;
    DisMat(1, 0) = pTagPos->max_posX;
    DisMat(2, 0) = pTagPos->min_posY;
    DisMat(3, 0) = pTagPos->max_posY;

    int Span_b18 = b18 - pTagPos->b18;
    if (Span_b18 < 0)
        Span_b18 += 0x100;

    double b18_factor = Span_b18 / factor;
    arma::Mat<double> tmpMat1(tdoa_num, tdoa_num);
    tmpMat1.fill(200.0);
    arma::mat matD1 = arma::diagmat(tmpMat1);
    tmpMat1 += matD1;

    arma::Mat<double> tmpMat2(2, 2);
    tmpMat2.fill(2.0);
    arma::mat matD2 = arma::diagmat(tmpMat2);
    tmpMat2 = matD2;

    matD1 = arma::inv(tmpMat1);
    matD2 = arma::inv(tmpMat2);

    double svd_max1 = arma::norm(tmpMat1, 2);
    double svd_max2 = arma::norm(tmpMat2, 2);

    double fen1 = 1.0 / std::sqrt(std::pow(6.28, tdoa_num) * svd_max1);
    double fen2 = 1.0 / std::sqrt(std::pow(6.28, 2.0) * svd_max2);

    arma::Mat<double> tmpMat3(1, 2);
    tmpMat3.fill(0.0);

    double tmpb18_200 = b18_factor * 200.0;
    if (factor <= 20.0)
    {
        DisMat(0, 0) -= tmpb18_200;
        DisMat(1, 0) += tmpb18_200;
        DisMat(2, 0) -= tmpb18_200;
        DisMat(3, 0) += tmpb18_200;
    }
    else
    {
        DisMat(0, 0) -= tmpb18_200 + 100.0;
        DisMat(1, 0) += tmpb18_200 + 100.0;
        DisMat(2, 0) -= tmpb18_200 + 100.0;
        DisMat(3, 0) += tmpb18_200 + 100.0;
    }

    arma::mat tmpMat_d1(2, 1);
    arma::mat tmpMat_d2(1, 2);
    arma::mat tmpMat_d3(1, 2);
    tmpMat_d1.row(0) = DisMat.row(0);
    tmpMat_d1.row(1) = DisMat.row(2);
    double tmpd1 = DisMat(1, 0) - DisMat(0, 0);
    double tmpd2 = DisMat(3, 0) - DisMat(2, 0);

    int tmp1 = (int)(tmpd1 / 20.0 + 1.0 + 0.5);
    int tmp2 = (int)(tmpd2 / 20.0 + 1.0 + 0.5);
    int tmp1x2 = tmp1 * tmp2;
    if (tmp1x2 <= 0)
        return 0;

    static int LastFix = 0;
    int tmpFix = LastFix;
    if (!LastFix)
    {
        tmpFix = 2 * tmp1x2;
        LastFix = tmpFix;
    }
    if (tmp1x2 > tmpFix)
        return 0;

    arma::mat locMatX1(tmp1x2, 1);
    arma::mat locMatY1(tmp1x2, 1);
    for (int i = 0; i < tmp2; i++)
    {
        for (int m = 0; m < tmp1; m++)
        {
            locMatX1(i * tmp1 + m, 0) = tmpMat_d1(0, 0) + m * 20;
            locMatY1(i * tmp1 + m, 0) = tmpMat_d1(1, 0) + i * 20;
        }
    }
    arma::mat locMatX3(tmp1x2, 1);
    for (int i = 0; i < tmp1x2; i++)
    {
        locMatX3(i, 0) = 1.0 / (double)tmp1x2;
    }

    arma::mat tmpOutMat1(tdoa_num, tmp1x2);
    arma::mat tmpOutMat2(tmp1x2, 1);
    arma::mat tmpOutMat3(tmp1x2, 1);
    arma::mat tmpOutMat4(tmp1x2, 1);

    for (int i = 0; i < tmp1x2; i++)
    {
        arma::mat tmp_MatX = (locMatX.row(0) - locMatX1.row(i)) * (locMatX.row(0) - locMatX1.row(i));
        arma::mat tmp_MatY = (locMatY.row(0) - locMatY1.row(i)) * (locMatY.row(0) - locMatY1.row(i));
        arma::mat tmp_MatZ = (locMatZ.row(0) - fPresetHeight) * (locMatZ.row(0) - fPresetHeight);

        arma::mat tmpResult = tmp_MatX + tmp_MatY + tmp_MatZ;
        arma::mat mat_sqrt = arma::sqrt(tmpResult);
        tmpOutMat2.row(i) = mat_sqrt;
    }
    arma::mat tmpOutMat5(1, 1);
    for (int i = 0; i < tmp1x2; i++)
    {
        arma::mat tmp = locMatX.rows(1, tdoa_num) - locMatX1(i, 0);
        arma::mat tmp_MatX = arma::pow(tmp, 2);

        tmp = locMatY.rows(1, tdoa_num) - locMatY1(i, 0);
        arma::mat tmp_MatY = arma::pow(tmp, 2);

        tmp = locMatZ.rows(1, tdoa_num) - fPresetHeight;
        arma::mat tmp_MatZ = arma::pow(tmp, 2);

        arma::mat tmpResult = tmp_MatX + tmp_MatY + tmp_MatZ;
        tmpOutMat1.col(i) = arma::sqrt(tmpResult) - tmpOutMat2(i, 0);

        tmp = tmpOutMat1.col(i) - locMatR;
        tmpOutMat3.row(i) = XMatLib::row2col(tmp) * matD1 * tmp;

        double dexp = exp(tmpOutMat3(i, 0) * -0.5) * fen1 * locMatX3(i, 0);
        tmpOutMat4(i, 0) = dexp;

        tmpOutMat5(0, 0) += dexp;
    }

    arma::rowvec minrow = arma::min<arma::mat>(tmpOutMat3);
    if (minrow(0, 0) <= 100.0)
    {
        arma::mat out(tmp1x2, 2);
        out.zeros();
        if (tmpOutMat5(0, 0) == 0.0)
        {
            tmpMat3.col(0) = AverageMat.col(0);
            tmpMat3.col(1) = AverageMat.col(1);
            DisMat.row(0) *= 100.0;
            DisMat.row(1) *= 100.0;
            DisMat.row(2) *= 100.0;
            DisMat.row(3) *= 100.0;
        }
        else
        {
            for (int i = 0; i < tmp1x2; i++)
            {
                tmpOutMat4(i, 0) /= tmpOutMat5(0, 0);
                tmpMat3.col(0) += tmpOutMat4.row(i) * locMatX1.row(i);
                tmpMat3.col(1) += tmpOutMat4.row(i) * locMatY1.row(i);
            }
            out.insert_cols(0, locMatX1);
            out.insert_cols(1, locMatY1);
            out.shed_cols(2, 3);
            int rown = 0;
            for (int i = 0; i < tmp1x2; i++)
            {
                if (tmpOutMat4(i, 0) >= 0.01 / tmp1x2 / 400.0)
                {
                    tmpMat_d2.insert_rows(rown, out.row(i));
                    rown++;
                }
            }
            if (rown)
            {
                tmpMat_d2.shed_rows(rown, rown);
                arma::mat mat_min = arma::min<arma::mat>(tmpMat_d2);
                arma::mat mat_max = arma::max<arma::mat>(tmpMat_d2);
                DisMat.row(0) = mat_min.col(0);
                DisMat.row(1) = mat_max.col(0);
                DisMat.row(2) = mat_min.col(1);
                DisMat.row(3) = mat_max.col(1);
                tmpMat_d1.row(0) = DisMat.row(0);
                tmpMat_d1.row(1) = DisMat.row(2);
                double dtmp = DisMat(1, 0) - DisMat(0, 0);
                int itmp1 = dtmp / 10.0 + 1.0 + 0.5;
                dtmp = DisMat(3, 0) - DisMat(2, 0);
                int itmp2 = dtmp / 10.0 + 1.0 + 0.5;
                int tmp1x2 = itmp1 * itmp2;
                if (tmp1x2 <= LastFix)
                {
                    arma::mat vTmpMatX(tmp1x2, 1); vTmpMatX.zeros();
                    arma::mat vTmpMatY(tmp1x2, 1); vTmpMatY.zeros();
                    for (int i = 0; i < itmp2; i++)
                    {
                        for (int m = 0; m < itmp1; m++)
                        {
                            vTmpMatX(i * itmp1 + m, 0) = tmpMat_d1(0, 0) + m * 10;
                            vTmpMatY(i * itmp1 + m, 0) = tmpMat_d1(1, 0) + i * 10;
                        }
                    }
                    arma::mat vTmpMatX3(tmp1x2, 2);
                    vTmpMatX3.insert_cols(0, vTmpMatX);
                    vTmpMatX3.insert_cols(1, vTmpMatY);
                    vTmpMatX3.shed_cols(2, 3);

                    arma::mat vTmpMat4(tmp1x2, 1);
                    for (int i = 0; i < tmp1x2; i++)
                    {
                        arma::mat tmp = vTmpMatX3.row(i) - tmpMat3;
                        arma::mat tmp2 = (tmp)*matD2 * -0.5;
                        tmp2 *= XMatLib::row2col(tmp);
                        vTmpMat4.row(i) = arma::exp(tmp2) * fen2;
                    }

                    arma::mat OMat1(tdoa_num, tmp1x2);
                    arma::mat OMat2(tmp1x2, 1);
                    arma::mat OMat3(tmp1x2, 1);
                    arma::mat OMat4(tmp1x2, 1);

                    for (int i = 0; i < tmp1x2; i++)
                    {
                        arma::mat tmp_MatX = (locMatX.row(0) - vTmpMatX.row(i)) * (locMatX.row(0) - vTmpMatX.row(i));
                        arma::mat tmp_MatY = (locMatY.row(0) - vTmpMatY.row(i)) * (locMatY.row(0) - vTmpMatY.row(i));
                        arma::mat tmp_MatZ = (locMatZ.row(0) - fPresetHeight) * (locMatZ.row(0) - fPresetHeight);

                        arma::mat tmpResult = tmp_MatX + tmp_MatY + tmp_MatZ;
                        arma::mat mat_sqrt = arma::sqrt(tmpResult);
                        OMat2.row(i) = mat_sqrt;
                    }
                    tmpOutMat5(0, 0) = 0.0;
                    for (int i = 0; i < tmp1x2; i++)
                    {
                        arma::mat tmp = locMatX.rows(1, tdoa_num) - vTmpMatX(i, 0);
                        arma::mat tmp_MatX = arma::pow(tmp, 2);

                        tmp = locMatY.rows(1, tdoa_num) - vTmpMatY(i, 0);
                        arma::mat tmp_MatY = arma::pow(tmp, 2);

                        tmp = locMatZ.rows(1, tdoa_num) - fPresetHeight;
                        arma::mat tmp_MatZ = arma::pow(tmp, 2);

                        arma::mat tmpResult = tmp_MatX + tmp_MatY + tmp_MatZ;
                        OMat1.col(i) = arma::sqrt(tmpResult) - OMat2(i, 0);

                        tmp = OMat1.col(i) - locMatR;
                        OMat3.row(i) = XMatLib::row2col(tmp) * matD1 * tmp;

                        double dexp = exp(OMat3(i, 0) * -0.5) * fen1 * vTmpMat4(i, 0);
                        OMat4(i, 0) = dexp;

                        tmpOutMat5(0, 0) += dexp;
                    }
                    if (tmpOutMat5(0, 0) == 0.0)
                    {
                        DisMat.row(0) -= 100.0;
                        DisMat.row(1) += 100.0;
                        DisMat.row(2) -= 100.0;
                        DisMat.row(3) += 100.0;
                        tmpMat_d1.row(0) = DisMat.row(0);
                        tmpMat_d1.row(1) = DisMat.row(2);
                    }
                    else
                    {
                        tmpMat3(0, 0) = 0.0;
                        tmpMat3(0, 1) = 0.0;
                        for (int i = 0; i < tmp1x2; i++)
                        {
                            OMat4(i, 0) /= tmpOutMat5(0, 0);
                            tmpMat3.col(0) += OMat4.row(i) * vTmpMatX.row(i);
                            tmpMat3.col(1) += OMat4.row(i) * vTmpMatY.row(i);
                        }
                        int rown = 0;
                        for (int i = 0; i < tmp1x2; i++)
                        {
                            if (OMat4(i, 0) >= 0.01 / tmp1x2 / 400.0)
                            {
                                tmpMat_d3.insert_rows(rown, vTmpMatX3.row(i));
                                rown++;
                            }
                        }
                        if (rown)
                        {
                            tmpMat_d3.shed_rows(rown, rown);
                            arma::mat mat_min = arma::min<arma::mat>(tmpMat_d3);
                            arma::mat mat_max = arma::max<arma::mat>(tmpMat_d3);
                            DisMat.row(0) = mat_min.col(0);
                            DisMat.row(1) = mat_max.col(0);
                            DisMat.row(2) = mat_min.col(1);
                            DisMat.row(3) = mat_max.col(1);

                            //goto 104
                        }
                    }
                }
            }    // end if (rown)
        }
    }
    else    // if (minrow(0, 0) <= 100.0)
    {
        DisMat.row(0) -= 100.0;
        DisMat.row(1) += 100.0;
        DisMat.row(2) -= 100.0;
        DisMat.row(3) += 100.0;
        tmpMat_d1.row(0) = DisMat.row(0);
        tmpMat_d1.row(1) = DisMat.row(2);

        double dtmp = DisMat(1, 0) - DisMat(0, 0);
        int itmp1 = dtmp / 20.0 + 1.0 + 0.5;
        dtmp = DisMat(3, 0) - DisMat(2, 0);
        int itmp2 = dtmp / 20.0 + 1.0 + 0.5;
        int tmp1x2 = itmp1 * itmp2;
        if (tmp1x2 <= LastFix)
        {
            arma::mat vTmpMatX(tmp1x2, 1); vTmpMatX.zeros();
            arma::mat vTmpMatY(tmp1x2, 1); vTmpMatY.zeros();
            for (int i = 0; i < itmp2; i++)
            {
                for (int m = 0; m < itmp1; m++)
                {
                    vTmpMatX(i * itmp1 + m, 0) = tmpMat_d1(0, 0) + m * 20;
                    vTmpMatY(i * itmp1 + m, 0) = tmpMat_d1(1, 0) + i * 20;
                }
            }

            arma::mat vTmpMatX3(tmp1x2, 2);
            vTmpMatX3.insert_cols(0, vTmpMatX);
            vTmpMatX3.insert_cols(1, vTmpMatY);
            vTmpMatX3.shed_cols(2, 3);

            arma::mat locMatX3(tmp1x2, 1);
            for (int i = 0; i < tmp1x2; i++)
            {
                locMatX3(i, 0) = 1.0 / (double)tmp1x2;
            }

            arma::mat tmpOutMat1(tdoa_num, tmp1x2);
            arma::mat tmpOutMat2(tmp1x2, 1);
            arma::mat tmpOutMat3(tmp1x2, 1);
            arma::mat tmpOutMat4(tmp1x2, 1);

            for (int i = 0; i < tmp1x2; i++)
            {
                arma::mat tmp_MatX = (locMatX.row(0) - vTmpMatX.row(i)) * (locMatX.row(0) - vTmpMatX.row(i));
                arma::mat tmp_MatY = (locMatY.row(0) - vTmpMatY.row(i)) * (locMatY.row(0) - vTmpMatY.row(i));
                arma::mat tmp_MatZ = (locMatZ.row(0) - fPresetHeight) * (locMatZ.row(0) - fPresetHeight);

                arma::mat tmpResult = tmp_MatX + tmp_MatY + tmp_MatZ;
                arma::mat mat_sqrt = arma::sqrt(tmpResult);
                tmpOutMat2.row(i) = mat_sqrt;
            }
            tmpOutMat5(0, 0) = 0.0;
            for (int i = 0; i < tmp1x2; i++)
            {
                arma::mat tmp = locMatX.rows(1, tdoa_num) - vTmpMatX(i, 0);
                arma::mat tmp_MatX = arma::pow(tmp, 2);

                tmp = locMatY.rows(1, tdoa_num) - vTmpMatY(i, 0);
                arma::mat tmp_MatY = arma::pow(tmp, 2);

                tmp = locMatZ.rows(1, tdoa_num) - fPresetHeight;
                arma::mat tmp_MatZ = arma::pow(tmp, 2);

                arma::mat tmpResult = tmp_MatX + tmp_MatY + tmp_MatZ;
                tmpOutMat1.col(i) = arma::sqrt(tmpResult) - tmpOutMat2(i, 0);

                tmp = tmpOutMat1.col(i) - locMatR;
                tmpOutMat3.row(i) = XMatLib::row2col(tmp) * matD1 * tmp;

                double dexp = exp(tmpOutMat3(i, 0) * -0.5) * fen1 * locMatX3(i, 0);
                tmpOutMat4(i, 0) = dexp;

                tmpOutMat5(0, 0) += dexp;
            }
            if (tmpOutMat5(0, 0) == 0.0)
            {
                DisMat.row(0) -= 100.0;
                DisMat.row(1) += 100.0;
                DisMat.row(2) -= 100.0;
                DisMat.row(3) += 100.0;
                tmpMat_d1.row(0) = DisMat.row(0);
                tmpMat_d1.row(1) = DisMat.row(2);
            }
            else
            {
                tmpMat3(0, 0) = 0.0;
                tmpMat3(0, 1) = 0.0;
                for (int i = 0; i < tmp1x2; i++)
                {
                    tmpOutMat4(i, 0) /= tmpOutMat5(0, 0);
                    tmpMat3.col(0) += tmpOutMat4.row(i) * vTmpMatX.row(i);
                    tmpMat3.col(1) += tmpOutMat4.row(i) * vTmpMatY.row(i);
                }
                int rown = 0;
                for (int i = 0; i < tmp1x2; i++)
                {
                    if (tmpOutMat4(i, 0) >= 0.01 / tmp1x2 / 400.0)
                    {
                        tmpMat_d3.insert_rows(rown, vTmpMatX3.row(i));
                        rown++;
                    }
                }
                if (rown)
                {
                    tmpMat_d3.shed_rows(rown, rown);
                    arma::mat mat_min = arma::min<arma::mat>(tmpMat_d3);
                    arma::mat mat_max = arma::max<arma::mat>(tmpMat_d3);
                    DisMat.row(0) = mat_min.col(0);
                    DisMat.row(1) = mat_max.col(0);
                    DisMat.row(2) = mat_min.col(1);
                    DisMat.row(3) = mat_max.col(1);
                }
            }
        }
    }

    //label_104
    arma::mat tmp = locMatX - tmpMat3(0, 0);
    arma::mat OutX = arma::pow(tmp, 2);

    tmp = locMatY - tmpMat3(0, 1);
    arma::mat OutY = arma::pow(tmp, 2);

    tmp = locMatZ - fPresetHeight;
    arma::mat OutZ = arma::pow(tmp, 2);

    arma::mat tmpResult = OutX + OutY + OutZ;
    arma::mat mat_sqrt = arma::sqrt(tmpResult);
    tmp = mat_sqrt.rows(1, tdoa_num) - mat_sqrt(0, 0);
    tmp = tmp - locMatR;
    tmp = (XMatLib::row2col(tmp) * tmp) / tdoa_num;
    if (tmp(0, 0) > 10000.0)
    {
        tmpMat3.col(0) = AverageMat.col(0);
        tmpMat3.col(1) = AverageMat.col(1);
    }
    InsertToLoc12(pTagPos->tagId,
        pTagPos->b18,
        tmpMat3(0, 0),
        tmpMat3(0, 1),
        DisMat(0, 0),
        DisMat(1, 0),
        DisMat(2, 0),
        DisMat(3, 0)
    );

    ret = 1;

    return ret;
}
/***************************************************************************************************************
* NOTE      |
* ParamIn   |
* ParamOut  |
* Return    |
***************************************************************************************************************/
int LocateM3(ALG_LOCADATA* pLocData)
{
    int ret = 0;
    std::vector<double> vec_PosX;
    std::vector<double> vec_PosY;
    std::vector<double> vec_PosZ;
    std::vector<double> vec_R;

    GetPosFromAnchor(vec_PosX, pLocData, 'x');
    GetPosFromAnchor(vec_PosY, pLocData, 'y');
    GetPosFromAnchor(vec_PosZ, pLocData, 'z');
    GetPosFromAnchor(vec_R, pLocData, 'r');

    double min_PosX = 0.0, max_PosX = 0.0;
    if (vec_PosX.size() > 0)
    {
        min_PosX = *min_element(vec_PosX.begin(), vec_PosX.end());
        max_PosX = *max_element(vec_PosX.begin(), vec_PosX.end());
    }
    double min_PosY = 0.0, max_PosY = 0.0;
    if (vec_PosY.size() > 0)
    {
        min_PosY = *min_element(vec_PosY.begin(), vec_PosY.end());
        max_PosY = *max_element(vec_PosY.begin(), vec_PosY.end());
    }

    MAP_LOC12_NODE::iterator it = g_Loc12.find(pLocData->tagInfo.TagId);
    Loc12_Node_Item* pTagPos = nullptr;
    if (it == g_Loc12.end())
    {
        InsertToLoc12(pLocData->tagInfo.TagId,
            pLocData->tagInfo.b18,
            (max_PosX + min_PosX) / 2,
            (max_PosY + min_PosY) / 2,
            min_PosX,
            max_PosX,
            min_PosY,
            max_PosY
        );

        pTagPos = &g_Loc12[pLocData->tagInfo.TagId];
    }
    else
        pTagPos = &it->second;

    double factor = GetFactor(pLocData->tagInfo.b19);
    int calcret = CalcM3(vec_PosX, vec_PosY, vec_PosZ, vec_R,
        pTagPos, pLocData->tagInfo.b18, factor, pLocData->tagInfo.fPresetHeight);;

    if (!calcret)
    {
        if (vec_PosX.size() > 0)
        {
            min_PosX = *min_element(vec_PosX.begin(), vec_PosX.end());
            max_PosX = *max_element(vec_PosX.begin(), vec_PosX.end());
        }
        if (vec_PosY.size() > 0)
        {
            min_PosY = *min_element(vec_PosY.begin(), vec_PosY.end());
            max_PosY = *max_element(vec_PosY.begin(), vec_PosY.end());
        }

        InsertToLoc12(pLocData->tagInfo.TagId,
            pLocData->tagInfo.b18,
            (max_PosX + min_PosX) / 2,
            (max_PosY + min_PosY) / 2,
            min_PosX,
            max_PosX,
            min_PosY,
            max_PosY
        );

        pTagPos = &g_Loc12[pLocData->tagInfo.TagId];
        calcret = CalcM3(vec_PosX, vec_PosY, vec_PosZ, vec_R, pTagPos, pLocData->tagInfo.b18, factor, pLocData->tagInfo.fPresetHeight);
        if (!calcret)
        {
            pLocData->tagInfo.err_94 = 93;
            ret = 0;
        }
    }
    else
    {
        pLocData->tagInfo.bMat_CalOk = 1;
        pLocData->tagInfo.Mat_PosX = pTagPos->average_X;
        pLocData->tagInfo.Mat_PosY = pTagPos->average_Y;
        pLocData->tagInfo.Mat_PosZ = pLocData->tagInfo.fPresetHeight;
        ret = 1;
    }

    return ret;
}
/***************************************************************************************************************
* NOTE      |
* ParamIn   |
* ParamOut  |
* Return    |
***************************************************************************************************************/
void Loc1(ALG_LOCADATA* pLocData)
{
    CalcTdoa(pLocData);
    LocateM3(pLocData);
}
/***************************************************************************************************************
* NOTE      |
* ParamIn   |
* ParamOut  |
* Return    |
***************************************************************************************************************/
void get_pos(uint64_t ts_1, uint64_t ts_2, uint64_t ts_3, uint64_t ts_4)
{
    alg_data.anchor_data[0].timestamp2 =alg_data.anchor_data[0].timestamp = ts_1;
    alg_data.anchor_data[1].timestamp2 = alg_data.anchor_data[1].timestamp = ts_2;
    alg_data.anchor_data[2].timestamp2 = alg_data.anchor_data[2].timestamp = ts_3;
    alg_data.anchor_data[3].timestamp2 = alg_data.anchor_data[3].timestamp = ts_4;

    Loc1(&alg_data);
}

void  get_pos_temp(uint64_t ts_1, uint64_t ts_2, uint64_t ts_3, uint64_t ts_4)
{
    uint32_t Xmin, Xmax, Ymin, Ymax,Zmin,Zmax;
    double TEMP1 = 10000000, TEMP2 = 10000000, TEMP3 = 10000000;
    double K1, K2, K3, K4, K5, K6;

    double d12 = (double)((int64_t)ts_1 - (int64_t)ts_2) / 2.13;
    double d23 = (double)((int64_t)ts_2 - (int64_t)ts_3)/2.13;
    double d34 = (double)((int64_t)ts_3 - (int64_t)ts_4) / 2.13;
    double d41 = (double)((int64_t)ts_4 - (int64_t)ts_1) / 2.13;
    double d13 = (double)((int64_t)ts_1 - (int64_t)ts_3) / 2.13;
    double d24 = (double)((int64_t)ts_2 - (int64_t)ts_4) / 2.13;
    
    Xmin = (alg_data.tagInfo.Mat_PosX - 100 > MapXmin ? (alg_data.tagInfo.Mat_PosX - 100) : MapXmin);
    Xmax = (alg_data.tagInfo.Mat_PosX + 100 > MapXmax ? MapXmax: (alg_data.tagInfo.Mat_PosX + 100) );

    Ymin = (alg_data.tagInfo.Mat_PosX - 100 > MapYmin ? (alg_data.tagInfo.Mat_PosY - 100) : MapYmin);
    Ymax = (alg_data.tagInfo.Mat_PosX + 100 > MapYmax ? MapXmax : (alg_data.tagInfo.Mat_PosY + 100));

    Zmin = 40; Zmax = 150;
#if 1
    for (uint32_t i = Zmin;i< Zmax;i++)
    {
        for (uint32_t j = Xmin; j < Xmax; j++)
        {
            for (uint32_t w = Ymin; w < Ymax; w++)
            {
                K1 = sqrt(pow(BS[0][0] - j, 2) + pow(BS[0][1] - w, 2) + pow(BS[0][2] - i, 2)) - sqrt(pow(j - BS[1][0], 2) + pow(w - BS[1][1], 2) + pow(i - BS[1][2], 2));
                K2 = sqrt(pow(BS[1][0] - j, 2) + pow(BS[1][1] - w, 2) + pow(BS[1][2] - i, 2)) - sqrt(pow(j - BS[2][0], 2) + pow(w - BS[2][1], 2) + pow(i - BS[2][2], 2));
                K3 = sqrt(pow(BS[2][0] - j, 2) + pow(BS[2][1] - w, 2) + pow(BS[2][2] - i, 2)) - sqrt(pow(j - BS[3][0], 2) + pow(w - BS[3][1], 2) + pow(i - BS[3][2], 2));
                K4 = sqrt(pow(BS[3][0] - j, 2) + pow(BS[3][1] - w, 2) + pow(BS[3][2] - i, 2)) - sqrt(pow(j - BS[0][0], 2) + pow(w - BS[0][1], 2) + pow(i - BS[0][2], 2));
                K5 = sqrt(pow(BS[0][0] - j, 2) + pow(BS[0][1] - w, 2) + pow(BS[0][2] - i, 2)) - sqrt(pow(j - BS[2][0], 2) + pow(w - BS[2][1], 2) + pow(i - BS[2][2], 2));
                K6 = sqrt(pow(BS[1][0] - j, 2) + pow(BS[1][1] - w, 2) + pow(BS[1][2] - i, 2)) - sqrt(pow(j - BS[3][0], 2) + pow(w - BS[3][1], 2) + pow(i - BS[3][2], 2));

                if (TEMP1 > pow(d12- K1,2)+ pow(d23 - K2, 2) + pow(d34 - K3, 2) + pow(d41 - K4, 2))
                {
                    TEMP1 = pow(d12 - K1, 2) + pow(d23 - K2, 2) + pow(d34 - K3, 2) + pow(d41 - K4, 2);
                    a[0][0] = j;
                    a[0][1] = w;
                    a[0][2] = i;
                    
                }

                if (TEMP2 > pow(d13-K5,2)+ pow(d24 - K6, 2))
                {
                    TEMP2 = pow(d13 - K5, 2) + pow(d24 - K6, 2);
                    a[1][0] = j;
                    a[1][1] = w;
                    a[1][2] = i;
                
                }

                if (TEMP3 > pow(d13 - K5, 2) + pow(d41 - K4, 2) + pow(d12 - K1, 2))
                {
                    TEMP3 = pow(d13 - K5, 2) + pow(d41 - K4, 2) + pow(d12 - K1, 2);
                    a[2][0] = j;
                    a[2][1] = w;
                    a[2][2] = i;


                }
                w += 1;
            }
            j += 1;
        }
        i += 3;
    }

    printf("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\r\n", a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2], a[2][0], a[2][1], a[2][2]);

    a[3][0] = a[0][0] * 0.25 + a[1][0] * 0.25 + a[2][0] * 0.3 + alg_data.tagInfo.Mat_PosX * 0.2;
    a[3][1] = a[0][1] * 0.25 + a[1][1] * 0.25 + a[2][1] * 0.3 + alg_data.tagInfo.Mat_PosY * 0.2;
    a[3][2] = a[1][2];
#endif
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

试探你的温柔耶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值