Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
96 / 25 / 20
Регистрация: 17.09.2014
Сообщений: 1,334
1

Случайные координаты на заданном расстоянии от точки

19.09.2016, 00:21. Просмотров 3310. Ответов 8


Есть некое 3х мерное пространство, обусловленное координатами X Y Z.

Есть координатная точка:
X1 = 8
Y1 = -13
Z1 = 120

Нужно получить 2ю случайную точку, но чтобы она не была дальше от 1й на 50единиц.
Как можно используя функцию рандома рассчитать, чтобы не вылезало за пределы этой сферы вокруг 1й точки?

Я думаю нужно по очереди идти.
Допустим по оси X берётся полноценно случайная координата:

X2 = X1 + RAND от -50 до 50

Далее по оси Y случайное число имеет меньший диапазон.
Если по оси X, будет 50 единиц, тогда чтобы не вылезать за окружность по оси Y может быть только 0.

Я геометрию вообще не знаю, поэтому я подумал просто вычитать из 50 (допустимый радиус) то самое рандомное число для оси X.

Y2 = Y1 + RAND от -(50 - (RAND от -50 до 50)) до (50 - (RAND от -50 до 50))

Блин... Лучше ближе к коду покажу:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Допустим оно сгенерирует даже отрицательное число
#define RANDOM_NUM(%0,%1) (rand() % (%1 - %0 + 1) + %0)
// Приводит к положительному
void ABC(n) {return n ? n : -n};
 
// Это просто чтобы было понятней где X Y и Z
enum _:XYZ{x, y, z}
 
int point1[XYZ] = {8, -13, 120}; // Первая точка
int point2[XYZ]; // Вторая точка
 
int rX = RANDOM_NUM(-50, 50); // Случайное число для оси X
 
point2[x] = point1[x] + rX; // Получили координату по оси X
 
int rY = 50 - ABC(rX); // Отнимаем от допустимого радиуса то самое случайное число, приведенное к положительному.
 
point2[y] = point2[x] + RANDOM_NUM(-rY, rY); // Получаем 2ю координату по оси Y
Дальше я зашёл в тупик...

Вообще наверное есть формула, я подозреваю подошла бы:
Найти длину биссектрисы прямоугольного треугольника...

Вернее найти 1 из катетов, зная длину 2го катета и длину биссектрисы.

Кто чем может помогите пожалуйста ))
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.09.2016, 00:21
Ответы с готовыми решениями:

Координаты точки, находящейся на заданном расстоянии от отрезка
Доброго времени суток, форумчане. Имеется отрезок AB. Необходимо найти координаты точки D,...

Найти координаты точки на отрезке при известном расстоянии до неё
Есть отрезок с известными координатами начала и конца, допустим А(х1, у1) и B(x2, y2). Как найти...

Найти координаты точки, делящей отрезок в заданном отношении
3)Найти координаты точки, делящей отрезок с координатами (X1, Y1, Z1) и (X2, Y2, Z2) в отношении M...

В заданном текстовом файле каждая тройка натуральных чисел задает координаты точки и ее цвет. Получить на экране последние из точек одного цвета.
1) С генерировать случайные данные отвечающих условию задачи и сохранить в текстовом редакторе 2)...

8
586 / 453 / 147
Регистрация: 09.12.2013
Сообщений: 2,386
Записей в блоге: 2
19.09.2016, 00:25 2
Берёте "Сферическая система координат", радиус у вас фиксированный, углы зенит и азимут оба случайные.
1
96 / 25 / 20
Регистрация: 17.09.2014
Сообщений: 1,334
19.09.2016, 00:54  [ТС] 3
Загуглил, ничего не понял.
Зато на бумажке нарисовал сетку XY, по оси Х случайная координата, от этой координаты поднимаем под 90 градусов к оси Х до окружности.
От окружности к центру сетки, получился прямоугольный треугольник с 2мя известными сторонами.
Загуглил, сумма квадратов сторон равна чему - то там...
0
586 / 453 / 147
Регистрация: 09.12.2013
Сообщений: 2,386
Записей в блоге: 2
19.09.2016, 01:35 4
Да та же "Полярная система координат", только для 3х измерений.
1
96 / 25 / 20
Регистрация: 17.09.2014
Сообщений: 1,334
19.09.2016, 02:37  [ТС] 5
Я решил, треугольники рулят. ))

Всего 2 формулы нужно было.


Название: 2.png
Просмотров: 83

Размер: 621 байт
Название: 1.png
Просмотров: 83

Размер: 650 байт

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int point1[3] = {23, -453, -5}; 
        
int rx; rx = random_num(-50, 50);       // Рандом X
        
int rxc; rxc = abs(rx);             // Абсолют X
        
int x; x = sqroot(50 * 50 - (rxc * rxc));   // Максимальное смещение для Y
        
int ry; ry = random_num(-x, x);         // Рандом Y
        
int ryc; ryc = abs(ry);             // Абсолют Y
        
int y; y = sqroot(rxc * rxc + (ryc * ryc)); // Находим гипотенузу X и Y(2 одинаковых треугольника), будующий катет для Z
        
int z; z = sqroot(50 * 50 - (y * y));       // Максимальное смещение для оси Z
 
int point2[3];
 
point2[0] = point1[] + rx;
point2[1] = point1[] + ry;
point2[2] = point1[] + random_num(-z, z);
0
96 / 25 / 20
Регистрация: 17.09.2014
Сообщений: 1,334
19.09.2016, 03:24  [ТС] 6
П.с. Проверил, работает. Только в основном к краю сферы долбит, процентов 10 от длины радиуса.
Ввёл ещё одну переменную, это сам радиус сферы.
Проверил, работает отлично.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int point1[3] = {23, -453, -5}; 
 
int r; r = random_num(0, 50);           // Чтобы к 1й точке близко тоже было
 
int rx; rx = random_num(-r, r);         // Рандом X
        
int rxc; rxc = abs(rx);             // Абсолют X
        
int x; x = sqroot(r * r - (rxc * rxc));     // Максимальное смещение для Y
        
int ry; ry = random_num(-x, x);         // Рандом Y
        
int ryc; ryc = abs(ry);             // Абсолют Y
        
int y; y = sqroot(rxc * rxc + (ryc * ryc)); // Находим гипотенузу X и Y(2 одинаковых треугольника), будующий катет для Z
        
int z; z = sqroot(r * r - (y * y));     // Максимальное смещение для оси Z
 
int point2[3];
 
point2[0] = point1[] + rx;
point2[1] = point1[] + ry;
point2[2] = point1[] + random_num(-z, z);
0
1462 / 1170 / 551
Регистрация: 08.01.2012
Сообщений: 4,513
19.09.2016, 08:56 7
Лучший ответ Сообщение было отмечено артист как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    double x1=8,y1=-13,z1=120;
    srand(unsigned(time(0)));
    double l=1+rand()%50;
    double a=rand()%360*M_PI/180;
    double z2=z1+l*cos(a);
    double dl=l*sin(a);
    double b=rand()%360*M_PI/180;
    double x2=x1+dl*cos(b);
    double y2=y1+dl*sin(b);
    //проверим
    double dx=x2-x1;
    double dy=y2-y1;
    double dz=z2-z1;
    dl=sqrt(dx*dx+dy*dy);
    cout<<l<<"="<<sqrt(dl*dl+dz*dz)<<endl;
1
Эксперт С++
3206 / 1733 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
19.09.2016, 17:10 8
Цитата Сообщение от артист Посмотреть сообщение
Проверил, работает отлично.
Ну, вы цель не указали. Если должно по объему шара равномерно раскидывать, то среднее расстояние до случайной точки должно быть около 37,5.
1
96 / 25 / 20
Регистрация: 17.09.2014
Сообщений: 1,334
02.08.2017, 22:28  [ТС] 9
Придумал способ легче.

Берётся случайный 1й вектор, умножается на случайное число(от минимума до границ сферы) и прибавляется к координатам.

Добавлено через 16 секунд
Придумал способ легче.

Берётся случайный 1й вектор, умножается на случайное число(от минимума до границ сферы) и прибавляется к координатам.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2017, 22:28

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

Даны координаты вершин треугольника и координаты некоторой точки внутри него. Найти расстояние от данной точки до ближайшей стороны треугольника
Даны координаты вершин треугольника и координаты некоторой точки внутри него. Найти расстояние от...

Рамки на заданном расстоянии
Как сделать что бы рамки не склеивались между собой, а были на конкретно заданном расстояние?

Найти координаты точек, находящихся на максимальном расстоянии
program record5;{найти координаты точек, находящихся на максимальном расстоянии}; type Coord...

Получить значение ячейки, находящейся на заданном расстоянии от выделенной
Дорогие друзья! Подскажите можно написать следующий макрос в Эксель. Задача следующая: есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.