空间3点投影定位算法
来源:互联网 发布:淘宝客源码免费下载 编辑:程序博客网 时间:2024/05/16 07:06
空间3点投影定位算法
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.
环境:
主机:WIN7
开发环境:Qt
说明:
<<仿GPS的4星定位程序>>(http://blog.csdn.net/jdh99/article/details/7349771)提供了空间4点定位1点的算法.实际中此算法需要4个基站有较大的高度差,如果在同一高度则定位误差很大.实际中,定位基站一般装在同一平面.利用平面投影可以将空间定位转换为平面定位从而避免这个问题.
具体做法:
每个基站具有平面坐标(x,y)以及一个高度h.测到距离d后,对距离进行平面投影处理:d = sqrt(d^2 - h^2).接下来就是平面定位.
测试程序:
界面widget.ui:
<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"> <class>Widget</class> <widget class="QWidget" name="Widget"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>561</width> <height>372</height> </rect> </property> <property name="windowTitle"> <string>Widget</string> </property> <widget class="QPushButton" name="pushButton"> <property name="geometry"> <rect> <x>60</x> <y>270</y> <width>75</width> <height>23</height> </rect> </property> <property name="text"> <string>计算</string> </property> </widget> <widget class="QLineEdit" name="p1x"> <property name="geometry"> <rect> <x>60</x> <y>70</y> <width>41</width> <height>20</height> </rect> </property> <property name="text"> <string>0</string> </property> </widget> <widget class="QLineEdit" name="d1"> <property name="geometry"> <rect> <x>360</x> <y>70</y> <width>113</width> <height>20</height> </rect> </property> <property name="text"> <string>1</string> </property> </widget> <widget class="QLabel" name="label"> <property name="geometry"> <rect> <x>210</x> <y>20</y> <width>181</width> <height>21</height> </rect> </property> <property name="font"> <font> <pointsize>16</pointsize> </font> </property> <property name="text"> <string>空间3点投影定位</string> </property> </widget> <widget class="QLabel" name="label_2"> <property name="geometry"> <rect> <x>10</x> <y>70</y> <width>48</width> <height>12</height> </rect> </property> <property name="text"> <string>第1点:</string> </property> </widget> <widget class="QLabel" name="label_3"> <property name="geometry"> <rect> <x>300</x> <y>70</y> <width>48</width> <height>12</height> </rect> </property> <property name="text"> <string>距离:</string> </property> </widget> <widget class="QLabel" name="label_4"> <property name="geometry"> <rect> <x>10</x> <y>110</y> <width>48</width> <height>12</height> </rect> </property> <property name="text"> <string>第2点:</string> </property> </widget> <widget class="QLabel" name="label_5"> <property name="geometry"> <rect> <x>300</x> <y>110</y> <width>48</width> <height>12</height> </rect> </property> <property name="text"> <string>距离:</string> </property> </widget> <widget class="QLabel" name="label_6"> <property name="geometry"> <rect> <x>10</x> <y>150</y> <width>48</width> <height>12</height> </rect> </property> <property name="text"> <string>第3点:</string> </property> </widget> <widget class="QLabel" name="label_7"> <property name="geometry"> <rect> <x>300</x> <y>150</y> <width>48</width> <height>12</height> </rect> </property> <property name="text"> <string>距离:</string> </property> </widget> <widget class="QLineEdit" name="p2x"> <property name="geometry"> <rect> <x>60</x> <y>110</y> <width>41</width> <height>20</height> </rect> </property> <property name="text"> <string>0</string> </property> </widget> <widget class="QLineEdit" name="d2"> <property name="geometry"> <rect> <x>360</x> <y>110</y> <width>113</width> <height>20</height> </rect> </property> <property name="text"> <string>1.414</string> </property> </widget> <widget class="QLineEdit" name="p3x"> <property name="geometry"> <rect> <x>60</x> <y>150</y> <width>41</width> <height>20</height> </rect> </property> <property name="text"> <string>1</string> </property> </widget> <widget class="QLineEdit" name="d3"> <property name="geometry"> <rect> <x>360</x> <y>150</y> <width>113</width> <height>20</height> </rect> </property> <property name="text"> <string>1</string> </property> </widget> <widget class="QLabel" name="label_10"> <property name="geometry"> <rect> <x>310</x> <y>250</y> <width>48</width> <height>12</height> </rect> </property> <property name="text"> <string>定位:</string> </property> </widget> <widget class="QLineEdit" name="outx"> <property name="geometry"> <rect> <x>350</x> <y>270</y> <width>113</width> <height>20</height> </rect> </property> </widget> <widget class="QLineEdit" name="outy"> <property name="geometry"> <rect> <x>350</x> <y>290</y> <width>113</width> <height>20</height> </rect> </property> </widget> <widget class="QLabel" name="label_11"> <property name="geometry"> <rect> <x>320</x> <y>270</y> <width>21</width> <height>16</height> </rect> </property> <property name="text"> <string>x:</string> </property> </widget> <widget class="QLabel" name="label_12"> <property name="geometry"> <rect> <x>320</x> <y>290</y> <width>21</width> <height>16</height> </rect> </property> <property name="text"> <string>y:</string> </property> </widget> <widget class="QLineEdit" name="p1y"> <property name="geometry"> <rect> <x>100</x> <y>70</y> <width>41</width> <height>20</height> </rect> </property> <property name="text"> <string>0</string> </property> </widget> <widget class="QLineEdit" name="p1z"> <property name="geometry"> <rect> <x>140</x> <y>70</y> <width>41</width> <height>20</height> </rect> </property> <property name="text"> <string>0</string> </property> </widget> <widget class="QLineEdit" name="p2y"> <property name="geometry"> <rect> <x>100</x> <y>110</y> <width>41</width> <height>20</height> </rect> </property> <property name="text"> <string>1</string> </property> </widget> <widget class="QLineEdit" name="p2z"> <property name="geometry"> <rect> <x>140</x> <y>110</y> <width>41</width> <height>20</height> </rect> </property> <property name="text"> <string>0</string> </property> </widget> <widget class="QLineEdit" name="p3y"> <property name="geometry"> <rect> <x>100</x> <y>150</y> <width>41</width> <height>20</height> </rect> </property> <property name="text"> <string>1</string> </property> </widget> <widget class="QLineEdit" name="p3z"> <property name="geometry"> <rect> <x>140</x> <y>150</y> <width>41</width> <height>20</height> </rect> </property> <property name="text"> <string>0</string> </property> </widget> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/></ui>
矩阵头文件_matrix.h:
#ifndef _MATRIX_H#define _MATRIX_H//头文件#include <stdio.h>#include <stdlib.h>//矩阵数据结构//二维矩阵struct _Matrix{ int m; int n; float *arr;};//矩阵方法//设置mnvoid matrix_set(struct _Matrix *m,int mm,int nn);//设置mvoid matrix_set_m(struct _Matrix *m,int mm);//设置nvoid matrix_set_n(struct _Matrix *m,int nn);//初始化void matrix_init(struct _Matrix *m);//释放void matrix_free(struct _Matrix *m);//读取i,j坐标的数据//失败返回-31415,成功返回值float matrix_read(struct _Matrix *m,int i,int j);//写入i,j坐标的数据//失败返回-1,成功返回1int matrix_write(struct _Matrix *m,int i,int j,float val);//矩阵运算//成功返回1,失败返回-1int matrix_add(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);//C = A - B//成功返回1,失败返回-1int matrix_subtract(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);//C = A * B//成功返回1,失败返回-1int matrix_multiply(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);//行列式的值,只能计算2 * 2,3 * 3//失败返回-31415,成功返回值float matrix_det(struct _Matrix *A);//求转置矩阵,B = AT//成功返回1,失败返回-1int matrix_transpos(struct _Matrix *A,struct _Matrix *B);//求逆矩阵,B = A^(-1)//成功返回1,失败返回-1int matrix_inverse(struct _Matrix *A,struct _Matrix *B);//矩阵拷贝:A = B//成功返回1,失败返回-1int matrix_copy(struct _Matrix *A,struct _Matrix *B);//求方程根,A * X = B,//成功返回1,答案保存在C中,失败返回-1//要求:A必须是方阵,如果A是m*m方阵,则B必须是m * 1,C必须是m * 1int matrix_solve(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);//利用克莱姆法则求方程根,A * X = B,//成功返回1,答案保存在C中,失败返回-1//要求:A必须是方阵,如果A是m*m方阵,则B必须是m * 1,C必须是m * 1int matrix_det_solve(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C);//定位函数//PI:输入3点坐标,格式:是3 * 2维//D:4点距离未知点距离数组//PO:输出坐标//成功返回1,失败返回-1int locate(struct _Matrix *PI,float *D,float *PO);#endif
矩阵函数_matrix.cpp:
#include "_matrix.h"//矩阵方法//设置mnvoid matrix_set(struct _Matrix *m,int mm,int nn){ m->m = mm; m->n = nn;}//设置mvoid matrix_set_m(struct _Matrix *m,int mm){ m->m = mm;}//设置nvoid matrix_set_n(struct _Matrix *m,int nn){ m->n = nn;}//初始化void matrix_init(struct _Matrix *m){ m->arr = (float *)malloc(m->m * m->n * sizeof(float));}//释放void matrix_free(struct _Matrix *m){ free(m->arr);}//读取i,j坐标的数据//失败返回-31415,成功返回值float matrix_read(struct _Matrix *m,int i,int j){ if (i >= m->m || j >= m->n) { return -31415; } return *(m->arr + i * m->n + j);}//写入i,j坐标的数据//失败返回-1,成功返回1int matrix_write(struct _Matrix *m,int i,int j,float val){ if (i >= m->m || j >= m->n) { return -1; } *(m->arr + i * m->n + j) = val; return 1;}//矩阵运算//成功返回1,失败返回-1int matrix_add(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C){ int i = 0; int j = 0; //判断是否可以运算 if (A->m != B->m || A->n != B->n || \ A->m != C->m || A->n != C->n) { return -1; } //运算 for (i = 0;i < C->m;i++) { for (j = 0;j < C->n;j++) { matrix_write(C,i,j,matrix_read(A,i,j) + matrix_read(B,i,j)); } } return 1;}//C = A - B//成功返回1,失败返回-1int matrix_subtract(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C){ int i = 0; int j = 0; //判断是否可以运算 if (A->m != B->m || A->n != B->n || \ A->m != C->m || A->n != C->n) { return -1; } //运算 for (i = 0;i < C->m;i++) { for (j = 0;j < C->n;j++) { matrix_write(C,i,j,matrix_read(A,i,j) - matrix_read(B,i,j)); } } return 1;}//C = A * B//成功返回1,失败返回-1int matrix_multiply(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C){ int i = 0; int j = 0; int k = 0; float temp = 0; //判断是否可以运算 if (A->m != C->m || B->n != C->n || \ A->n != B->m) { return -1; } //运算 for (i = 0;i < C->m;i++) { for (j = 0;j < C->n;j++) { temp = 0; for (k = 0;k < A->n;k++) { temp += matrix_read(A,i,k) * matrix_read(B,k,j); } matrix_write(C,i,j,temp); } } return 1;}//行列式的值,只能计算2 * 2,3 * 3//失败返回-31415,成功返回值float matrix_det(struct _Matrix *A){ float value = 0; //判断是否可以运算 if (A->m != A->n || (A->m != 2 && A->m != 3)) { return -31415; } //运算 if (A->m == 2) { value = matrix_read(A,0,0) * matrix_read(A,1,1) - matrix_read(A,0,1) * matrix_read(A,1,0); } else { value = matrix_read(A,0,0) * matrix_read(A,1,1) * matrix_read(A,2,2) + \ matrix_read(A,0,1) * matrix_read(A,1,2) * matrix_read(A,2,0) + \ matrix_read(A,0,2) * matrix_read(A,1,0) * matrix_read(A,2,1) - \ matrix_read(A,0,0) * matrix_read(A,1,2) * matrix_read(A,2,1) - \ matrix_read(A,0,1) * matrix_read(A,1,0) * matrix_read(A,2,2) - \ matrix_read(A,0,2) * matrix_read(A,1,1) * matrix_read(A,2,0); } return value;}//求转置矩阵,B = AT//成功返回1,失败返回-1int matrix_transpos(struct _Matrix *A,struct _Matrix *B){ int i = 0; int j = 0; //判断是否可以运算 if (A->m != B->n || A->n != B->m) { return -1; } //运算 for (i = 0;i < B->m;i++) { for (j = 0;j < B->n;j++) { matrix_write(B,i,j,matrix_read(A,j,i)); } } return 1;}//求逆矩阵,B = A^(-1)//成功返回1,失败返回-1int matrix_inverse(struct _Matrix *A,struct _Matrix *B){ int i = 0; int j = 0; int k = 0; struct _Matrix m; float temp = 0; float b = 0; //判断是否可以运算 if (A->m != A->n || B->m != B->n || A->m != B->m) { return -1; } /* //如果是2维或者3维求行列式判断是否可逆 if (A->m == 2 || A->m == 3) { if (det(A) == 0) { return -1; } } */ //增广矩阵m = A | B初始化 matrix_set_m(&m,A->m); matrix_set_n(&m,2 * A->m); matrix_init(&m); for (i = 0;i < m.m;i++) { for (j = 0;j < m.n;j++) { if (j <= A->n - 1) { matrix_write(&m,i,j,matrix_read(A,i,j)); } else { if (i == j - A->n) { matrix_write(&m,i,j,1); } else { matrix_write(&m,i,j,0); } } } } //高斯消元 //变换下三角 for (k = 0;k < m.m - 1;k++) { //如果坐标为k,k的数为0,则行变换 if (matrix_read(&m,k,k) == 0) { for (i = k + 1;i < m.m;i++) { if (matrix_read(&m,i,k) != 0) { break; } } if (i >= m.m) { return -1; } else { //交换行 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,k,j); matrix_write(&m,k,j,matrix_read(&m,k + 1,j)); matrix_write(&m,k + 1,j,temp); } } } //消元 for (i = k + 1;i < m.m;i++) { //获得倍数 b = matrix_read(&m,i,k) / matrix_read(&m,k,k); //行变换 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,i,j) - b * matrix_read(&m,k,j); matrix_write(&m,i,j,temp); } } } //变换上三角 for (k = m.m - 1;k > 0;k--) { //如果坐标为k,k的数为0,则行变换 if (matrix_read(&m,k,k) == 0) { for (i = k + 1;i < m.m;i++) { if (matrix_read(&m,i,k) != 0) { break; } } if (i >= m.m) { return -1; } else { //交换行 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,k,j); matrix_write(&m,k,j,matrix_read(&m,k + 1,j)); matrix_write(&m,k + 1,j,temp); } } } //消元 for (i = k - 1;i >= 0;i--) { //获得倍数 b = matrix_read(&m,i,k) / matrix_read(&m,k,k); //行变换 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,i,j) - b * matrix_read(&m,k,j); matrix_write(&m,i,j,temp); } } } //将左边方阵化为单位矩阵 for (i = 0;i < m.m;i++) { if (matrix_read(&m,i,i) != 1) { //获得倍数 b = 1 / matrix_read(&m,i,i); //行变换 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,i,j) * b; matrix_write(&m,i,j,temp); } } } //求得逆矩阵 for (i = 0;i < B->m;i++) { for (j = 0;j < B->m;j++) { matrix_write(B,i,j,matrix_read(&m,i,j + m.m)); } } //释放增广矩阵 matrix_free(&m); return 1;}//矩阵拷贝:A = B//成功返回1,失败返回-1int matrix_copy(struct _Matrix *A,struct _Matrix *B){ int i = 0; int j = 0; if (A->m != B->m || A->n != B->n) { return -1; } for (i = 0;i < A->m;i++) { for (j = 0;j < A->n;j++) { matrix_write(B,i,j,matrix_read(A,i,j)); } } return 1;}//求方程根,A * X = B,//成功返回1,答案保存在C中,失败返回-1//要求:A必须是方阵,如果A是m*m方阵,则B必须是m * 1,C必须是m * 1int matrix_solve(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C){ int i = 0; int j = 0; int k = 0; struct _Matrix m; float temp = 0; float b = 0; //判断是否可以运算 if (A->m != A->n || B->n != 1 || A->m != B->m || \ C->n != 1 || A->m != C->m) { return -1; } /* //如果是2维或者3维求行列式判断是否可逆 if (A->m == 2 || A->m == 3) { if (det(A) == 0) { return -1; } } */ //增广矩阵m = A | B初始化 matrix_set_m(&m,A->m); matrix_set_n(&m,A->m + 1); matrix_init(&m); for (i = 0;i < m.m;i++) { for (j = 0;j < m.n;j++) { if (j <= A->n - 1) { matrix_write(&m,i,j,matrix_read(A,i,j)); } else { matrix_write(&m,i,j,matrix_read(B,i,0)); } } } //高斯消元 //变换下三角 for (k = 0;k < m.m - 1;k++) { //如果坐标为k,k的数为0,则行变换 if (matrix_read(&m,k,k) == 0) { for (i = k + 1;i < m.m;i++) { if (matrix_read(&m,i,k) != 0) { break; } } if (i >= m.m) { return -1; } else { //交换行 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,k,j); matrix_write(&m,k,j,matrix_read(&m,k + 1,j)); matrix_write(&m,k + 1,j,temp); } } } //消元 for (i = k + 1;i < m.m;i++) { //获得倍数 b = matrix_read(&m,i,k) / matrix_read(&m,k,k); //行变换 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,i,j) - b * matrix_read(&m,k,j); matrix_write(&m,i,j,temp); } } } //变换上三角 for (k = m.m - 1;k > 0;k--) { //如果坐标为k,k的数为0,则行变换 if (matrix_read(&m,k,k) == 0) { for (i = k + 1;i < m.m;i++) { if (matrix_read(&m,i,k) != 0) { break; } } if (i >= m.m) { return -1; } else { //交换行 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,k,j); matrix_write(&m,k,j,matrix_read(&m,k + 1,j)); matrix_write(&m,k + 1,j,temp); } } } //消元 for (i = k - 1;i >= 0;i--) { //获得倍数 b = matrix_read(&m,i,k) / matrix_read(&m,k,k); //行变换 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,i,j) - b * matrix_read(&m,k,j); matrix_write(&m,i,j,temp); } } } //将左边方阵化为单位矩阵 for (i = 0;i < m.m;i++) { if (matrix_read(&m,i,i) != 1) { //获得倍数 b = 1 / matrix_read(&m,i,i); //行变换 for (j = 0;j < m.n;j++) { temp = matrix_read(&m,i,j) * b; matrix_write(&m,i,j,temp); } } } //求得解 for (i = 0;i < C->m;i++) { matrix_write(C,i,0,matrix_read(&m,i,m.n - 1)); } //释放增广矩阵 matrix_free(&m); return 1;}//利用克莱姆法则求方程根,A * X = B,//成功返回1,答案保存在C中,失败返回-1//要求:A必须是方阵,如果A是m*m方阵,则B必须是m * 1,C必须是m * 1int matrix_det_solve(struct _Matrix *A,struct _Matrix *B,struct _Matrix *C){ struct _Matrix m; float det_m; float det_m_temp; int i = 0; int j = 0; //初始化m matrix_set_m(&m,A->m); matrix_set_n(&m,A->n); matrix_init(&m); //得到A的行列式值 det_m = matrix_det(A); //判断是否有效 if (det_m == 0) { matrix_free(&m); return -1; } for (i = 0;i < 2;i++) { //得到新的行列式 matrix_copy(A,&m); for (j = 0;j < 2;j++) { matrix_write(&m,j,i,matrix_read(B,j,0)); } det_m_temp = matrix_det(&m); //求解 matrix_write(C,i,0,det_m_temp / det_m); } matrix_free(&m); return 1;}//定位函数//PI:输入3点坐标,格式:是3 * 2维//D:3点距离未知点距离数组//PO:输出坐标//成功返回1,失败返回-1int locate(struct _Matrix *PI,float *D,float *PO){ int i = 0; int j = 0; struct _Matrix A; struct _Matrix B; struct _Matrix C; float temp = 0; //判断是否可以运算 if (PI->m != 3 || PI->n != 2) { return -1; } //初始化ABC矩阵 matrix_set_m(&A,2); matrix_set_n(&A,2); matrix_init(&A); matrix_set_m(&B,2); matrix_set_n(&B,1); matrix_init(&B); matrix_set_m(&C,2); matrix_set_n(&C,1); matrix_init(&C); //初始化A矩阵 for (i = 0;i < 2;i++) { for (j = 0;j < 2;j++) { temp = matrix_read(PI,i + 1,j) - matrix_read(PI,i,j); matrix_write(&A,i,j,temp); } } //初始化B矩阵 for (i = 0;i < 2;i++) { temp = matrix_read(PI,i + 1,0) * matrix_read(PI,i + 1,0); temp += matrix_read(PI,i + 1,1) * matrix_read(PI,i + 1,1); temp -= matrix_read(PI,i,0) * matrix_read(PI,i,0); temp -= matrix_read(PI,i,1) * matrix_read(PI,i,1); temp -= D[i + 1] * D[i + 1] - D[i] * D[i]; temp /= 2; matrix_write(&B,i,0,temp); } //解方程 //if (matrix_solve(&A,&B,&C) > 0) if (matrix_det_solve(&A,&B,&C) > 0) { PO[0] = matrix_read(&C,0,0); PO[1] = matrix_read(&C,1,0); return 1; } return -1;}
widget.h:
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include "public.h"#include "_four_point_locate.h"#include "_Matrix.h"namespace Ui { class Widget;}class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget();private: Ui::Widget *ui; _Four_Point_Locate four_point_locate; _Matrix pi; float d[3]; float p[2];private slots: void on_pushButton_clicked();};#endif // WIDGET_H
widget.cpp:
#include "widget.h"#include "ui_widget.h"#include "math.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); //初始化矩阵 matrix_set(&pi,3,2); matrix_init(&pi);}Widget::~Widget(){ delete ui;}void Widget::on_pushButton_clicked(){ bool ok; float h = 0; int i = 0; int j = 0; float temp = 0; //距离 d[0] = ui->d1->text().toFloat(&ok); d[1] = ui->d2->text().toFloat(&ok); d[2] = ui->d3->text().toFloat(&ok); //获得坐标 matrix_write(&pi,0,0,ui->p1x->text().toFloat(&ok)); matrix_write(&pi,0,1,ui->p1y->text().toFloat(&ok)); h = ui->p1z->text().toFloat(&ok); d[0] = sqrt(d[0] * d[0] - h * h); matrix_write(&pi,1,0,ui->p2x->text().toFloat(&ok)); matrix_write(&pi,1,1,ui->p2y->text().toFloat(&ok)); h = ui->p2z->text().toFloat(&ok); d[1] = sqrt(d[1] * d[1]- h * h); matrix_write(&pi,2,0,ui->p3x->text().toFloat(&ok)); matrix_write(&pi,2,1,ui->p3y->text().toFloat(&ok)); h = ui->p3z->text().toFloat(&ok); d[2] = sqrt(d[2] * d[2] - h * h); qDebug() << "pi" << matrix_read(&pi,0,0) << matrix_read(&pi,0,1); qDebug() << "pi" << matrix_read(&pi,1,0) << matrix_read(&pi,1,1); qDebug() << "pi" << matrix_read(&pi,2,0) << matrix_read(&pi,2,1); qDebug() << "d:" << d[0] << d[1] << d[2]; if (locate(&pi,d,p) > 0) { //成功 ui->outx->setText(QString::number(p[0])); ui->outy->setText(QString::number(p[1])); } else { //失败 ui->outx->setText("fail"); ui->outy->setText("fail"); }}
运行效果:
- 空间3点投影定位算法
- 计算空间点到平面的投影点坐标
- 计算空间点到平面的投影点坐标(代码)
- 用OpenGL实现三维点到屏幕空间的投影
- SIFT算法关键点定位中对尺度空间DoG函数进行曲线拟合求极值点的数学过程
- 三点定位算法 -- 链接
- 5.6.3 投影和均匀裁剪空间
- 点到平面的投影算法备忘笔记
- 点到平面的投影算法备忘笔记
- 3维空间到2维空间投影的分类
- Direct3D中投影空间内的点坐标与屏幕上点的对应关系
- Direct3D中投影空间内的点坐标与屏幕上点的对应关系
- 投影算法
- 线性代数:子空间投影
- 子空间投影
- 子空间投影
- 【模块】二维三点定位算法
- 基于rssi的三点定位算法
- pyGTK_读书笔记_Tutorial Chapter 5&6_Widget Overview and Button Widget
- Android_listview分页加载更多
- 十招教你从程序员转向企业家
- 查找目录中所有带中文字符的文件,并列出中文所在的行
- 获得本周所有日期
- 空间3点投影定位算法
- hibernate.properties
- Android开发常见错误及技巧
- mysql存储引擎:InnoDB和MyISAM的区别与优劣
- flex move
- Android传感器编程入门
- 推动100家软件和信息服务业企业向云计算服务转型
- spring aop切点表达式函数
- flex sprite