Я пытаюсь создать программу на 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
Как суммировать прямоугольники между случайно сгенерированными кругами на плоскости? ⇐ C#
Место общения программистов C#
1731573519
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);
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79186068/how-to-sum-rectangles-between-randomly-generated-circles-on-a-plane[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия