Страницы

Поиск по вопросам

пятница, 7 февраля 2020 г.

Как построить эллипс в консоли?

#java #математика


................
......**........
.....*..*.......
....*....*......
....*....*......
....*....*......
.....*..*.......
......**........
................ 



Что-то вроде такого

А именно не могу понять как использовать формулу x^2/a^2 + y^2/b^2 = 1
    


Ответы

Ответ 1



Формулу использовать так: выражаете одну переменную через другую, получается что-то вроде x = sqrt(a^2*(1-y^2/b^2), где y изменяется от -b до b (обычно выражают наоборот - y через x, но так как "изображение" в консоли строится сверху вниз, то имеет смысл выражать x через y). Эта формула уже позволяет построить правую половину эллипса (x обозначает количество точек перед звездочкой от вертикальной оси симметрии). Чтобы построить левую половину, нужно выразить отступ звездочек от левого края рисунка, например так: a - x. Если нужен отступ от левого края, добавляете еще константу. Строка из звездочек и точек будет составляться примерно так: round(xx)*'.' + '*' + 2*round(x)*'.' + '*' + round(xx)*'.' Это псевдокод (на самом деле "валидный" код на python), умножение обозначает количество повторений символа, сложение - сцепление строк, round - округление к ближайшему целому числу, xx = a - x. С учетом того, что при y = 0 вторая координата тоже равна нулю, и должна рисоваться только одна звездочка, нужно подправить эту "формулу" так: '.'*round(xx) + '*' + (2*round(x)-1)*'.' + int(round(x)>0)*'*' + '.'*round(xx) (int в данном случае приводит булевое значение к целому) Пример того что получится (параметры a = 6, b = 6): ......*...... ...*.....*... ..*.......*.. .*.........*. *...........* *...........* *...........* *...........* *...........* .*.........*. ..*.......*.. ...*.....*... ......*...... Если нужна более "гладкая" кривая (без разрывов в первой и последней строке, например), нужно смотреть в сторону алгоритма Брезенхэма.

Комментариев нет:

Отправить комментарий