Нужно, чтобы функция создания вершины присваивала ей случайные координаты - C#
Формулировка задачи:
Здравствуйте, я пишу программу, которая генерирует графы и мне нужно, чтобы функция создания вершины присваивала ей случайные координаты и радиус окружности с центром в этой вершине, но для каждой вершины все эти параметры получаются одинаковыми.
Скорее всего, проблема в методах creatingNode и конструкторе Graph.
Результаты вот такие:
0.07 6.2 3
0.07 6.2 3
0.07 6.2 3
0.07 6.2 3
Первое число - радиус, второе - абсцисса, третье - ордината
public class Graph
{
public struct node // Структура для хранения вершин
{
public int id; // Уникальный идентификатор
public double radius; // Радиус приёмопередатчика
public double x; // Абсцисса
public double y; // Ордината
public int degree; // Степень вершины
public List<int> arclist; // Список вершин, смежных данной
};
public List<node> nodes = new List<node>(); // Вектор вершин графа
int numberOfNodes; // Количество вершин
public int numberOfArcs; // Количество рёбер
bool connected; // Хранит true, если граф связный, или false, если это не так
double generalRadius; // Если радиус всех вершин одинаковый, то он хранится здесь, в противном случае generalRadius = -1
//double instantOfTime;
Random rand = new Random(unchecked((int)(DateTime.Now.Ticks)));
static double GenerateDigit(Random rng)
{
return Convert.ToDouble(rng.Next(100));
}
private node creatingNode(int inId) // Функция генерирует вершину с id=inId
{
node outNode = new node();
outNode.id = inId;
outNode.degree = 0;
outNode.radius = GenerateDigit(rand) / 100;
outNode.x = GenerateDigit(rand) / 10;
outNode.y = GenerateDigit(rand) / 10;
List<int> parclist = new List<int>();
outNode.arclist = parclist;
return outNode;
}
private void addingArc( node node1, node node2) // Связывает ребром вершины node1 и node2
{
node1.arclist.Add(node2.id);
node1.degree++;
node2.arclist.Add(node1.id);
node2.degree++;
numberOfArcs++;
}
double calculatingDistance(node node1, node node2) // Вычисляет расстояние между вершинами node1 и node2
{
return Math.Sqrt((node2.x - node1.x) * (node2.x - node1.x) + (node2.y - node1.y) * (node2.y - node1.y));
}
bool arcExist(node node1, node node2) // Проверяем, достаёт ли сигнал одной вершины до другой
{
if (node2.radius >= calculatingDistance(node1, node2) || node1.radius >= calculatingDistance(node1, node2))
return true;
else
return false;
}
public bool isConnected() // Выясняет, является ли граф связным
{
for (int i = 0; i < nodes.Count(); i++)
if (nodes[i].degree == 0)
return false;
return true;
}
public Graph() // Генерирует граф
{
numberOfNodes = rand.Next(99) + 2; // Задаём количество вершин от 2 до 100
for (int i = 0; i < numberOfNodes; i++) // Заполняем вектор nodes вершинами
{
node cNode = new node();
cNode = creatingNode(i);
nodes.Add(cNode);
}
for (int i = 0; i < nodes.Count(); i++) // Связываем нужные вершины рёбрами
for (int j = 0; j < nodes.Count(); j++)
if (arcExist(nodes[i], nodes[j]) && i < j)
addingArc( nodes[i], nodes[j]);
//connected = isConnected(); // Обозначаем связность сгенерированного графа
//generalRadius = isGeneralRadius(); // И его generalRadius
}Решение задачи: «Нужно, чтобы функция создания вершины присваивала ей случайные координаты»
textual
Листинг программы
foreach (Graph.node item in new Graph().nodes)
{
Console.WriteLine("{0} {1} {2}", item.radius, item.x, item.y);
}