• 大小: 8KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-14
  • 语言: 其他
  • 标签: c+  

资源简介

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


评论

共有 条评论