separatedMeshхранит номера треугольников, принадлежащих отдельному несвязанному мешу)
inline bool Collision::SeparateCollision() {
struct VertInfo
{
Vector3* Point;
unsigned int TriangleID;
};
VertInfo vert;
std::unordered_map<std::string, VertInfo> vertMap;
//Used to mark triangles whose membership has already been determined
std::vector<bool> triangleBool;
const int arr_len = 3;
float edgeArr[arr_len];
std::string hash;
hash.resize(arr_len * sizeof(float));
Graph graph{ unsigned int (GeneralCollider->Points.size() / 3)};
unsigned int sizeBeforeInsert;
// Get starting timepoint
auto start = std::chrono::high_resolution_clock::now();
//Create graph
for (size_t it = 0; it <= GeneralCollider->Points.size() - 1; it++)
{
vert.Point = &GeneralCollider->Points[it];
vert.TriangleID = it / 3;
edgeArr[0] = { vert.Point->X };
edgeArr[1] = { vert.Point->Y };
edgeArr[2] = { vert.Point->Z };
sizeBeforeInsert = vertMap.size();
//create hash
memcpy((char*)hash.data(), edgeArr, arr_len * sizeof(float));
//insert hash
std::pair<std::string, VertInfo> p(hash, vert);
vertMap.insert(p);
//chech if hash map not changed size after insert hash
//is not changed => found same edges => found adjacent triangles
if (sizeBeforeInsert == vertMap.size()) {
unsigned int TriangleID = vertMap.find(hash)->second.TriangleID;
graph.AddEdge(TriangleID, vert.TriangleID);
graph.AddEdge(vert.TriangleID, TriangleID);
}
}
triangleBool.resize(graph.GetAdjListSize());
Collision::PrimitivesCollider.push_back(new Collider);
std::vector<std::vector<int>> separatedMesh;
while (true) {
int notConnected = -1;
//Searches first triangle that does not belong to separated mesh
for (size_t i = 0; i < triangleBool.size(); i++)
{
if (triangleBool[i] == false) {
notConnected = i;
break;
}
}
if (notConnected == -1)
break;
separatedMesh.resize(separatedMesh.size() + 1);
graph.BFS(notConnected, &separatedMesh[separatedMesh.size() - 1]);
for (size_t i = 0; i < separatedMesh[separatedMesh.size() - 1].size(); i++)
{
triangleBool[separatedMesh[separatedMesh.size() - 1][i]] = true;
}
}
// Get ending timepoint
auto stop = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast <std::chrono::milliseconds>(stop - start);
std::cout << "Time taken by function: "
<< duration.count() << " milliseconds" << std::endl;
return true;
}
inline void Graph::AddEdge(int Src, int Dest) {
Graph::adjLists[Src].push_back(Dest);
}
inline Graph::Graph(unsigned int size) {
Graph::adjLists.resize(size);
Graph::visited.resize(size);
}
inline unsigned int Graph::GetAdjListSize() {
return Graph::adjLists.size();
}
graph.AddEdge(TriangleID, vert.TriangleID);
graph.AddEdge(vert.TriangleID, TriangleID);
if ((edge.Point1->X > edge.Point2->X) || (edge.Point1->X == edge.Point2->X && edge.Point1->Y > edge.Point2->Y) || (edge.Point1->X == edge.Point2->X && edge.Point1->Y == edge.Point2->Y && edge.Point1->Z > edge.Point2->Z))
Предположим что я повернул по оси x на некоторый угол a. После мне нужно имея эту матрицу перезаписать массив данных, определяющих позицию повернутой в пространстве точки(3 значения -x,y,z). Что из этих 9 значений является этой новой позицией?