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 значений является этой новой позицией?