资源简介
obb树的完整代码,可以运行,测试函数需要自己根据自己需要写导入数据的函数。

代码片段和文件信息
#pragma once
#pragma execution_character_set(“utf-8“)
#include
//协方差矩阵
Eigen::Matrix3f MATRIXOP::CalculateCovariance(Eigen::MatrixXf pVertices)
{
Eigen::Matrix3f covariance;
//求取列向量均值
Eigen::MatrixXf meanVec = pVertices.colwise().mean();
//将列向量均值从MatrixXf 转换为行向量 RowVectorXf
Eigen::RowVectorXf meanVecRow(Eigen::RowVectorXf::Map(meanVec.data() pVertices.cols()));
//求取上述的零均值列向量矩阵
Eigen::MatrixXf zeroMeanMat = pVertices;
//计算协方差矩阵
zeroMeanMat.rowwise() -= meanVecRow;
if (pVertices.rows() == 1)
covariance = (zeroMeanMat.adjoint()*zeroMeanMat) / static_cast(pVertices.rows());
else
covariance = (zeroMeanMat.adjoint()*zeroMeanMat) / static_cast(pVertices.rows() - 1);
return covariance;
}
//特征值//特征向量//排序(按照特征值从大到小排序)//schmidt正交
Eigen::Matrix3f MATRIXOP::CalculateEigenvectors(Eigen::Matrix3f covariance)
{
EigenSolver eig(covariance);
//特征值
Eigen::Matrix3f eigenvalue = eig.pseudoEigenvalueMatrix();
//特征向量
Eigen::Matrix3f eigenvectors = eig.pseudoEigenvectors();
//对特征值进行从大到小排序
Eigen::RowVector3f eigenvalueVec = eigenvalue.colwise().sum();
unsigned int index[3] = { 012 };
for (int i = 0; i< 2; i++)
for (int j = 0;j< 2 - i;j++)
if (eigenvalueVec[j] < eigenvalueVec[j + 1])
{
float temp = eigenvalueVec[j];
eigenvalueVec[j] = eigenvalueVec[j + 1];
eigenvalueVec[j + 1] = temp;
int temp_index = index[j];
index[j] = index[j + 1];
index[j + 1] = temp_index;
}
Matrix3f Sorted_eigenvector;
Matrix3f Sorted_eigenvalue(eigenvalueVec.asDiagonal());
for (unsigned i = 0; i < 3; i++)
{
Sorted_eigenvector.col(i) = eigenvectors.col(index[i]);
}
//schmidt正交
Matrix3f schmidt_eigenvector;
for (unsigned int i = 0; i < 3; i++)
{
schmidt_eigenvector.col(i) = Sorted_eigenvector.col(i);
for (unsigned int j = 1; j <= i; j++)
{
schmidt_eigenvector.col(i) -= schmidt_template(Sorted_eigenvector.col(i) schmidt_eigenvector.col(j - 1));
}
schmidt_eigenvector.col(i).normalized();
}
return schmidt_eigenvector;
}
//schmidt正交的单步计算模板
Eigen::Vector3f MATRIXOP::schmidt_template(Eigen::Vector3f vector0 Eigen::Vector3f vector1)
{
Vector3f schmidt_vector = vector0.dot(vector1) / vector1.squaredNorm() * vector1;
return schmidt_vector;
}
//一维容器转换为矩阵
Eigen::MatrixXf MATRIXOP::vector_trans_matrix(vector vertex)
{
vector Vertices;
Eigen::RowVector3f rowvector;
for (unsigned int i = 0; i < vertex.size() / 3; i++)
{
for (unsigned int j = 0; j < 3; j++)
{
rowvector(j) = vertex[3 * i + j];
}
Vertices.push_back(rowvector);
}
unsigned int numVertices = Vertices.size();
Eigen::MatrixXf pVertices(numVertices 3);
for (unsigned int i = 0; i < numVertices; i++)
{
pVertices.row(i) = Vertices[i];
}
return pVertices;
}
//glm对应矩阵变换-缩放矩阵//size缩放尺寸一般定义第四个元素为1.0
Eigen::Matrix4f MATRIXOP::scal_matrix(Eigen::Vector4f & size)
{
Eigen::Matrix4f sc
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2482 2018-09-28 16:37 OBB.h
文件 3426 2018-09-28 16:37 OBBtree.cpp
文件 1202 2018-09-28 16:42 OBBtree.h
文件 1956 2018-09-28 16:35 test_main.cpp
文件 4731 2018-09-28 16:37 MATRIXOP.cpp
文件 1249 2018-09-28 16:38 MATRIXOP.h
文件 9332 2018-09-28 16:37 OBB.cpp
----------- --------- ---------- ----- ----
24378 7
相关资源
- FreeRTOS采样ADC+KEY事件信号+DMA串口收发
- STM32F103RC+ADC+DMA多通道采样LCD显示
- VisualStudioUninstaller vs卸载工具
- 组态王驱动开发包3.0.0.7(中文)
- 多窗口后台鼠标连点器
- 使用选择性重传协议实现UDP可靠通信
- VC 获得文件属性 获取文件的创建时
- 读者写者问题(读者优先,写者优先
- 用VC 编写的仿QQ聊天室程序源代码
- 外点法程序
- 外罚函数程序
- qt-电子点菜系统
- 现代谱估计算法 music ESPRIT 谐波分解
- 推箱子及人工智能寻路C 源代码
- 自己写的航空订票系统c 版--数据结构
- 数据结构实验魔王语言
- MUSIC算法c 实现
- C 餐厅叫号系统(QT平)
- 国际象棋c 完整版
-
ob
jectARX给Auto CAD加工具条 - 画图程序MFC/VC/VC CRectTracker 串行化
- MFC网络编程实例
- c 课程设计 职工信息管理系统
- VC 游戏编程—附源代码
- IpHlpApi.h&IpHlpApi.lib
- 清华大学 c 郑莉 ppt课件
- c 程序判断离散数学中命题公式
- 多项式求和(数据结构C 版)
- vc 6.0开发的流程图编辑器
- VC 天空盒(skyBox)实现(附源代码)
评论
共有 条评论