资源简介
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
相关资源
- 汽车修理管理系统源码
- glut工具库
- UE4串口,蓝图可调用,4.24.3亲测可使
- graphics包包含graphics.lib.rar
- 华为机试题2020.zip
- 实验三:AES加密算法
- 鼠标自动点击程序
- CNFIX3.0.rar
- CMatrix
- Proteus8.9 仿真STM32407ZGT6系列基础模板
- GDI+柱状图
- 制作动画GIF的VC源代码,八叉树算法生
- 面向对象程序设计实验报告
- 进程状态转换包括创建、删除、调度
- 多机部署Hyperledger Fabric+Composer(两台
- 经典的背包问题九讲,必看
- 模拟退火算法解决TSP问题
- 操作系统设计一个按优先权调度算法
- 驱动执行应用层代码之KeuserModeCallba
- 虚拟磁盘MINIPORT驱动代码
- 最新的libssh2库源码
- 模拟IPINTERNET PROTOCOL数据分片和重组
- 火车车厢重排列问题 堆栈解决
- 山东大学数据结构课设箱子装箱问题
- som神经网络用于实现图像压缩
- 一种新的GEP 解码方法及其应用程序及
- 信息学奥赛一本通课后练习答案汇总
- 操作系统实验生产者与消费者实验报
- windows rpc基本使用Demo
- 基于QT实现2048小游戏
评论
共有 条评论