Создайте граф списка смежности из топологии в C++

Как новичок в С++, мне нужно сделать график списка смежности. Я хочу создать взвешенный график, который показывает отношения топологии между плоскостями и их углом как вес. Таким образом, в графе плоскости представляют вершины графа (например, v), а линии пересечения представляют ребра графа (например, v1v2). Каждая линия пересечения также имеет один атрибут. МОЯ программа генерирует такой текстовый файл:

край, атрибут, вес
v1v2, 1, 90
v1v3, 2, 45
v1v3, 2, 30
v2v3, 3, 90
...

А вот псевдокод, генерирующий txt-файл:

for (planes.begin, numberOFplanes, planei++){
  for(planes.begin+1, numberOFplanes, planej++){

    if (planei intersect planej){
        cout << ViVj << attribute << angle << nedl;
    }
  }
}

Я нашел класс ниже по этой ссылке (Реализация графа C++) и хочу реализовать в своем коде, но я не знаю, как это сделать, точнее, мне нужно указать числа плоскостей и их угол в качестве входных данных для класса графика для создания графика.

p.s. Я знаю, что класс графа из ссылки является направленным классом, и я не против создать ненаправленный класс, оба или хорошо.


person Bruce    schedule 08.01.2016    source источник
comment
@ 88877 мой ввод - это список самолетов.   -  person Bruce    schedule 08.01.2016
comment
Пример реализации неориентированного взвешенного графа: title="создание неориентированного взвешенного графа из матрицы смежности из csv"> stackoverflow.com/questions/47569823/   -  person alseether    schedule 04.12.2017


Ответы (1)


Не стесняйтесь поправлять меня, если я не понял тот или иной момент.

Давайте начнем с основных геометрических объектов, которые нам понадобятся:

//I considere here the one point + one orthogonal 
//representation of a plan
class Plan{
 public:
  //Constructor
  Node(const Point*& iPoint, const Vector*& iVector) {
    _point = iPoint;
    _vector = iVector;
  }

  float getAngleDifferencial(const Plan*& iPlan) {
    //well my math are a bit old too do the math 
    //but you should be fine here... I hope :)
  }

  //you may wanna add getter or stuff like that

 private:
  Point* _point;
  Vector* _vector;
}

Далее идут элементы графика:

class Node {
 public:
  Node(int iNumber,const Plan*& iPlan):
    _Id(iNumber) {
    _Plan = iPlan;
  }

 private:
  int _Id;
  Plan* _Plan;
}

class Edge {
 public:
  Edge(const Node*& iNode1,const Node*&iNode2) {
    if (iNode1->getId()==iNode2->getId()) {
      //throw Exception
    }
    _Node1 = iNode1;
    _Node2 = iNode2;
    _Weight = iNode1->getPlan()->getAngleDifferencial(iNode2->getPlan())
}

 private:
  Node* _Node1;
  Node* _Node2;
  float _Weight;
}

Наконец, вам нужно будет получить массив, чтобы разместить узлы и ребра и начать играть с ним.

Развлекайся :)

person 88877    schedule 08.01.2016