Как суммировать прямоугольники между случайно сгенерированными кругами на плоскости?C#

Место общения программистов C#
Ответить
Anonymous
 Как суммировать прямоугольники между случайно сгенерированными кругами на плоскости?

Сообщение Anonymous »

Я пытаюсь создать программу на C#, которая генерировала бы n точек, образующих центры непересекающихся кругов радиусом r в плоскости 200 на 200 (координаты для x и y: [-100+r, 100 -r]) и создайте набор непересекающихся, не перекрывающихся прямоугольников между этими кругами. Программа выдает сумму площадей всех этих прямоугольников. Моя проблема в том, что он дает мне ответ от 5000000 до 6000000, что значительно превышает теоретический максимум.
Я попробовал разделить общую сумму на 200, сравнивая квадраты расстояний, это дает ответы в ожидаемый диапазон, но я не знаю, действительно ли это ошибка или просто совпадение (N=867 и r=2,0)
Я не уверен, что ошибка есть в этой части, но всё равно (это консольная программа конечно):
public void GenerateRectangles()
{
var usedCenters = new HashSet();

foreach (var point1 in circleCenters)
{
if (usedCenters.Contains(point1)) continue;

foreach (var point2 in circleCenters)
{
if (point1 == point2 || usedCenters.Contains(point2)) continue;

double dx = point2.x - point1.x;
double dy = point2.y - point1.y;
double distanceSquared = dx * dx + dy * dy;

if (distanceSquared >= (2 * Radius) * (2 * Radius))
{
double length = Math.Sqrt(distanceSquared) - 2 * Radius;
double width = CalculateShortestDistance(point1, point2) - Radius;

var rectangleCoords = CreateRectangle(point1, point2, width, length);
rectangleBoundaries.Add((rectangleCoords, width * length));
totalAreaOfRectangles.Add(width * length);

usedCenters.Add(point1);
usedCenters.Add(point2);
break;
}
}
}

HandleRemainingPoints(usedCenters);
}

private double CalculateShortestDistance((double x, double y) point1, (double x, double y) point2)
{
double dx = point2.x - point1.x;
double dy = point2.y - point1.y;
return Math.Sqrt(dx * dx + dy * dy);
}

private List CreateRectangle((double x, double y) point1, (double x, double y) point2, double width, double length)
{
double dx = point2.x - point1.x;
double dy = point2.y - point1.y;

double normalX = dy; // Normal vector components
double normalY = -dx;

double magnitude = Math.Sqrt(normalX * normalX + normalY * normalY);
normalX /= magnitude;
normalY /= magnitude;

var point3 = (point1.x + normalX * width, point1.y + normalY * width);
var point4 = (point2.x + normalX * width, point2.y + normalY * width);

return new List { point1, point2, point4, point3 };
}

и, возможно, в этой части, но я не совсем понимаю, как это происходит, поскольку это просто добавление переменных из списка:
public void CalculateTotalArea()
{
double totalArea = 0;
foreach (var area in totalAreaOfRectangles)
{
totalArea += area;
}
Console.WriteLine("Total Area Occupied by Rectangles: " + totalArea);
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... on-a-plane
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»