Окружность

332
4
Всем привет, пишу библиотеку(движок) на java. Начал недавно и физики еще не затронулся, зато затронулся геометрии, вобщем надо(для теста) вывести в консоль точки окружность, все точки. И вот, собственно, я забыл ( а может и не знал ) как в окружности каждая точка меняет свои координаты, но при этом остается равноудаленной от центра. Вобщем у кого нет проблем с геометрией и кто, может, помнит эту формулу прошу помочь)
 
>вывести в консоль точки окружность, все точки
Чаво? Пройдись со словарем по своему тексту, плес.
***
Зависит от того, чем рисуешь. Но лучше не пытаться делать свой движок. Полно других(я 3 знаю)
 
Мне не проходиться нужно) мне нужно сгенерировать окружность ввиде точек на джава
 
c00a19e0cbc87eef326dfec5715342750d4f456a

Точек там бесконечно много
 
>просят помочь сгенерировать приближенную окружность из N точек
>даёт уравнение, описывающее окружность, с помощью которого, тем не менее, хрен сгенерируешь случайную точку на окружности

Сгенерировать точку на окружности чертовски просто, на самом деле.
Есть такая замечательная штука, изучаемая в курсе школьной алгебры\геометрии, как основное тригонометрическое тождество, а именно:
Код:
sin^2(a) + cos^2(a) = 1

Если вспомнить теорему Пифагора, то можно понять эту запись так:
Длина (сумма квадратов катетов) вектора {cos(a), sin(a)} = 1, то есть, какой бы аргумент в качестве угла для этих тригонометрических функций мы бы не подставляли, длина вектора всегда будет равна 1.
Вполне подходит для описания окружности.
Тебе остаётся сгенерировать набор из N точек, где формулу для описания точки в прямоугольных координатах я дал выше, а угол будет равномерно распределён в диапазоне от 0 до 2*PI

Если не хочешь думать
Если совсем не хочешь думать
Ну прям ваще
Остановись, ПОДУМОЙ
xO3btF_rvRc.jpg

Не открывай
float PI2 = Math.PI * 2F;
float radius = 20F;
for (float angle = 0F; angle < PI2; angle += PI2 / count) {
    float x = Math.cos(angle) * radius;
    float y = Math.sin(angle) * radius;
}
 
Oldestkon написал(а):
>просят помочь сгенерировать приближенную окружность из N точек
>даёт уравнение, описывающее окружность, с помощью которого, тем не менее, хрен сгенерируешь случайную точку на окружности

Сгенерировать точку на окружности чертовски просто, на самом деле.
Есть такая замечательная штука, изучаемая в курсе школьной алгебры\геометрии, как основное тригонометрическое тождество, а именно:
Код:
sin^2(a) + cos^2(a) = 1

Если вспомнить теорему Пифагора, то можно понять эту запись так:
Длина (сумма квадратов катетов) вектора {cos(a), sin(a)} = 1, то есть, какой бы аргумент в качестве угла для этих тригонометрических функций мы бы не подставляли, длина вектора всегда будет равна 1.
Вполне подходит для описания окружности.
Тебе остаётся сгенерировать набор из N точек, где формулу для описания точки в прямоугольных координатах я дал выше, а угол будет равномерно распределён в диапазоне от 0 до 2*PI

Если не хочешь думать
Если совсем не хочешь думать
Ну прям ваще
Остановись, ПОДУМОЙ
xO3btF_rvRc.jpg

Не открывай
float PI2 = Math.PI * 2F;
float radius = 20F;
for (float angle = 0F; angle < PI2; angle += PI2 / count) {
    float x = Math.cos(angle) * radius;
    float y = Math.sin(angle) * radius;
}
Лаал :lol:
 
Все, всем спасибо, нашел еще вариант: y^2 = R^2 - x^2:
Код:
int a = (R^2 - x^2)^(1/2);
int y = ( a >= -2 &&  a <= 2  )  ? a : 0;
Как то так)
 
Идеальный вариант.
hqdefault.jpg
 
Я делаю x + R * sin (или cos, не помню)  и z + R * cos (или sin, не помню) углов.
 
Ну да, это самое оптимальное правильное решение.
Что предлагает ТС, что выдвигают в его дублированной теме - бред, формула выше от Heitem, во-первых, даёт:
AdRVKR.png

, во-вторых, ему потребуется два прохода для двух знаков, чтобы сгенерировать окружность. Это раз. Мелочь, правда.
Окружность будет неравномерная, это два и самое главное. Это незаметно, пока пространство бесконечное, или мб у топикстартера хороший квантовый пека?
Неравномерность возникает от того, что ТС прошагивает по оси абсцисс каждый раз ровно взятое количество пространства. Между точками на окружности же, расстояние будет совершенно разное (корень - нелинейная функция), когда должно быть одинаково.
Может, мне пояснят, в чём профит шагать по оси X и вычислять для каждой точки значение Y, если можно это сделать нормальным путём с помощью тригонометрических функций для ровно заданного количества точек на окружности, равномерно распределённых на ней?
 
Можно, но мне для этого плана не столь важна была точность, мне просто было надо пройтись по всем точкам окружности в джаве и записать их координаты шагом - 0.1 в два массива: x и y, после циклом вывести на экран.
 
Действительно, по x^2+y^2=r^2, частицы будут спавнится неравномерно.
Но ТС нужно же в консоль выводить.

Кстати, возможно алгоритм Брезенхема будет работать намного быстрее. Хотя у х86 есть инструкции вычисления и квадратного корня и синусов, наверняка они не столь быстрые.
 
XD
Код:
x = 2.0
y = 0
R = 2

print(str(round(x, 1)) + " ; " + str(round((R**2 - x**2)**(1/2), 2)))

for i in range(20):
    x -= 0.2
    a = +(R**2 - x**2)**(1/2)
    if ( float(a) >= -2.0 and  float(a) <= 2.0 ):
        y = a
    print(str(round(x, 2)) + " ; " + str(round(y, 2)))

print("\n*************************\n");

x = 2.0
y = 0
R = 2

print(str(round(x, 1)) + " ; " + str(round((R**2 - x**2)**(1/2), 2)))

for i in range(20):
    x -= 0.2
    a = -(R**2 - x**2)**(1/2)
    if ( float(a) >= -2.0 and  float(a) <= 2.0 ):
        y = a
    print(str(round(x, 2)) + " ; " + str(round(y, 2)))
Output:
Код:
2.0 ; 0.0
1.8 ; 0.87
1.6 ; 1.2
1.4 ; 1.43
1.2 ; 1.6
1.0 ; 1.73
0.8 ; 1.83
0.6 ; 1.91
0.4 ; 1.96
0.2 ; 1.99
0.0 ; 2.0
-0.2 ; 1.99
-0.4 ; 1.96
-0.6 ; 1.91
-0.8 ; 1.83
-1.0 ; 1.73
-1.2 ; 1.6
-1.4 ; 1.43
-1.6 ; 1.2
-1.8 ; 0.87
-2.0 ; 0.0

*************************

2.0 ; 0.0
1.8 ; -0.87
1.6 ; -1.2
1.4 ; -1.43
1.2 ; -1.6
1.0 ; -1.73
0.8 ; -1.83
0.6 ; -1.91
0.4 ; -1.96
0.2 ; -1.99
0.0 ; -2.0
-0.2 ; -1.99
-0.4 ; -1.96
-0.6 ; -1.91
-0.8 ; -1.83
-1.0 ; -1.73
-1.2 ; -1.6
-1.4 ; -1.43
-1.6 ; -1.2
-1.8 ; -0.87
-2.0 ; -0.0

Я упрям. Разве неравномерно?
 
Конечно неравномерно. У тебя же разные расстояния между соседними точками. В начале и в конце больше, а посередине меньше.
Но для вывода в консоль приблизительно так и требуется.
 
Ладно. Вобщем всем спасибо)
 
Назад
Сверху