Задача, собственно, в следующем:
Есть окружность радиуса R, количество точек N, и минимально допустимое значение разброса расстояний между точками. Необходимо сгенерировать N случайных точек, чтобы они были помещены внутрь окружности, и расстояние между ними не было меньше допустимого минимального разброса.
C/C++
Распределение случайных точек внутри окружности радиуса R и с центром (x, y)
Это возможно далеко не при всех отношениях чисел R, N и дистанции разброса d. Вот так можно попробовать:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <ctime>
using namespace std;
double r()
{
return 1. * rand() / RAND_MAX;
}
int main()
{
const double τ = 6.2831853071795864769;
int i, j, k, l, m, N, timeold;
double X, Y, R, a, b, c, d;
cout.precision(17);
while (1)
{
k = 0;
cout << "X Y R N d » ";
cin >> X >> Y >> R >> N >> d;
double *x = new double [N];
double *y = new double [N];
timeold = time(NULL);
back: srand(timeold);
for (i = 0; i < N; i++)
{
l = 1;
while (l)
{
m = 1;
b = R * r();
c = τ * r();
x[k] = X + b * cos(c);
y[k] = Y + b * sin(c);
for (j = 0; j < k; j++)
if (pow(x[k] - x[j], 2) + pow(y[k] - y[j], 2) < d)
{
m = 0;
break;
}
if (m) l = 0;
if (time(NULL) == timeold + 1) goto back;
}
printf("%4d)%20.10f%19.10f\n", k + 1, x[k], y[k]);
k++;
}
cout << k << endl;
}
}
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <ctime>
using namespace std;
double r()
{
return 1. * rand() / RAND_MAX;
}
int main()
{
const double τ = 6.2831853071795864769;
int i, j, k, l, m, N, timeold;
double X, Y, R, a, b, c, d;
cout.precision(17);
while (1)
{
k = 0;
cout << "X Y R N d » ";
cin >> X >> Y >> R >> N >> d;
double *x = new double [N];
double *y = new double [N];
timeold = time(NULL);
back: srand(timeold);
for (i = 0; i < N; i++)
{
l = 1;
while (l)
{
m = 1;
b = R * r();
c = τ * r();
x[k] = X + b * cos(c);
y[k] = Y + b * sin(c);
for (j = 0; j < k; j++)
if (pow(x[k] - x[j], 2) + pow(y[k] - y[j], 2) < d)
{
m = 0;
break;
}
if (m) l = 0;
if (time(NULL) == timeold + 1) goto back;
}
printf("%4d)%20.10f%19.10f\n", k + 1, x[k], y[k]);
k++;
}
cout << k << endl;
}
}
максимум точек запихнуть?
Дмитрий Межевой
а как расставить решаешь сам? Ну вот и сначала в вектор МАКСИМУМ пар координат ХУ, а потом уже случайную координату ХУ ищешь в векторе или близкую у ним
Дмитрий Межевой
Или другой вариант - xy на этой сетке выбираешь как x0y0 это центр окружности Скажем номер точки= ху / шаг, а точка получается НОМЕР ТОЧКИ * шаг + ху. Непонятно сразу? Мне просто возиться лень
Дмитрий Межевой
а чтобы не повторяться сделаешь квадратную матрицу размером Диаметр / ШАГ и там номер точки это индексы матрицы и присвоишь им 1 если точка выставлена иначе ищешь свободную ближайшую. Это задача явно не универская. Так что алгоритма и так достаточно
Похожие вопросы
- Помогите понять код : return NOD(y, x%y)
- Определить находиться ли точка внутри круга, С++
- Помогите пожалуйста построить таблицу значений функции y = f(x) для x ∈ [a, b] с шагом h (с помощью условного оператора)
- Соси++ (с++) Множество точек в трехмерном пространстве и сфера радиуса. СТРУКТУРЫ
- Что означает эта формула? sqr(x)+sqr(y)<=1
- Программа по C++. Определить координаты радиусы и центра сферы.
- Найти решение уравнения(arccos(x-1)+x^3-4=0) на указанном диапазоне ([0.5;1.9]). используя численный метод-Метод Ньютона
- C++ Выведите в порядке возрастания все простые числа на отрезке [l;r]. Оформите решение в виде функции bool
- Написать кусочек С++Выведите в порядке возрастания все простые числа на отрезке [l;r]. Оформите решение в виде функции
- Помогите пожалуйста с Массивами .В языке С .Заполнил 2-мерный массив N и M случайными числами дальше не понимаю.
Да, и ещё, даже если N точек удастся задать, надо же каким-то образом позаботиться об равномерной вероятности их распределения, а не просто о случайном формировании массива точек! 。◕‿◕。