Алгебраїчна крива - це певне "1D підмножина" "2D-площини", яке можна описати як набір нулів {(x,y) in R^2 : f(x,y)=0 }
многочлена f
. Тут ми розглядаємо 2D-площину як справжню площину R^2
таку, що ми можемо легко уявити, як може виглядати така крива, в основному річ, яку можна намалювати олівцем.
Приклади:
0 = x^2 + y^2 -1
коло радіуса 10 = x^2 + 2y^2 -1
еліпс0 = xy
хрест форма, в основному , об'єднання осі абсцис і вісь ординат0 = y^2 - x
парабола0 = y^2 - (x^3 - x + 1)
еліптичної кривої0 = x^3 + y^3 - 3xy
фолія Декарта0 = x^4 - (x^2 - y^2)
лемнікат0 = (x^2 + y^2)^2 - (x^3 - 3xy^2)
трифолій0 = (x^2 + y^2 - 1)^3 + 27x^2y^2
астроїд
Завдання
Давши поліном f
(як визначено нижче) та діапазони x / y, вивести чорно-біле зображення розміром не менше 100x100 пікселів, що показує криву як чорну лінію на білому тлі.
Деталі
Колір : Ви можете використовувати будь-які два інші кольори на ваш вибір, їх просто просто розпізнати.
Сюжет : Замість піксельного зображення ви також можете виводити це зображення як ascii-art, де фоновим "пікселями" повинен бути пробіл / підкреслення або інший символ, який "виглядає порожнім", а лінія може бути складена з символу, який виглядає " повний "як M
або X
або #
.
Вам не доведеться турбуватися про згладжування.
Вам потрібно лише побудувати лінії, де знак полінома змінюється з однієї сторони лінії на іншу (це означає, що ви могли б, наприклад, використовувати алгоритм квадратичного маршу), вам не потрібно правильно будувати "патологічні випадки, наприклад, 0 = x^2
коли це робить знак не змінюватись при переході від однієї сторони лінії до іншої, але ця лінія повинна бути безперервною і розділяти області різних знаків f(x,y)
.
Поліном : Поліном наводиться у вигляді (m+1) x (n+1)
матриці / списку списків (реальних) коефіцієнтів, у прикладі нижче наведені умови коефіцієнтів у їхньому положенні:
[ 1 * 1, 1 * x, 1 * x^2, 1 * x^3, ... , 1 * x^n ]
[ y * 1, y * x, y * x^2, y * x^4, ... , y * x^n ]
[ ... , ... , ... , ... , ... , ... ]
[ y^m * 1, y^m * x, y^m * x^2, y^m * x^3 , ..., y^m * x^n]
Якщо ви віддаєте перевагу, ви можете вважати, що матриця має квадратну форму (що завжди можна зробити за допомогою необхідної нульової прокладки), а якщо ви хочете, ви також можете припустити, що розмір матриці задається як додаткові входи.
Далі приклади зверху представлені у вигляді матриці, визначеної так:
Circle: Ellipse: Parabola: Cross: Elliptic Curve: e.t.c
[-1, 0, 1] [-1, 0, 1] [ 0,-1] [ 0, 0] [-1, 1, 0,-1]
[ 0, 0, 0] [ 0, 0, 0] [ 0, 0] [ 0, 1] [ 0, 0, 0, 0]
[ 1, 0, 0] [ 2, 0, 0] [ 1, 0] [ 1, 0, 0, 0]
Тестові приклади з діапазоном x / y:
(У не такому читабельному, але кращому форматі, який можна скопіювати, вставити тут, на пастібі .)
Circle:
[-1, 0, 1] [-2,2] [-2,2]
[ 0, 0, 0]
[ 1, 0, 0]
Ellipse:
[-1, 0, 1] [-2,2] [-1,1]
[ 0, 0, 0]
[ 2, 0, 0]
Cross:
[ 0, 0] [-1,2] [-2,1]
[ 0, 1]
Parabola:
[ 0,-1] [-1,3] [-2,2]
[ 0, 0]
[ 1, 0]
Elliptic Curve:
[-1, 1, 0,-1] [-2,2] [-3,3]
[ 0, 0, 0, 0]
[ 1, 0, 0, 0]
Folium of Descartes:
[ 0, 0, 0, 1] [-3,3] [-3,3]
[ 0, -3, 0, 0]
[ 0, 0, 0, 0]
[ 1, 0, 0, 0]
Lemniscate:
[ 0, 0, -1, 0, 1] [-2,2] [-1,1]
[ 0, 0, 0, 0, 0]
[ 1, 0, 0, 0, 0]
Trifolium:
[ 0, 0, 0,-1, 1] [-1,1] [-1,1]
[ 0, 0, 0, 0, 0]
[ 0, 3, 2, 0, 0]
[ 0, 0, 0, 0, 0]
[ 1, 0, 0, 0, 0]
Astroid:
[ -1, 0, 3, 0, -3, 0, 1] [-1,1] [-1,1]
[ 0, 0, 0, 0, 0, 0, 0]
[ 3, 0, 21, 0, 3, 0, 0]
[ 0, 0, 0, 0, 0, 0, 0]
[ -3, 0, 3, 0, 0, 0, 0]
[ 0, 0, 0, 0, 0, 0, 0]
[ 1, 0, 0, 0, 0, 0, 0]
Я отримав натхнення для деяких кривих цього PDF-файлу.
m
x n
, а (m+1)
x (n+1)
. Що ми беремо як вхідні дані: m, n
або m+1,n+1
? Або ми можемо вибрати?