Krzywa algebraiczna jest pewnym „podzbiorem 1D” „płaszczyzny 2D”, który można opisać jako zbiór zer {(x,y) in R^2 : f(x,y)=0 }
wielomianu f
. Uważamy tutaj płaszczyznę 2D za rzeczywistą, R^2
dzięki czemu możemy łatwo wyobrazić sobie, jak mogłaby wyglądać taka krzywa, w zasadzie rzecz, którą można narysować ołówkiem.
Przykłady:
0 = x^2 + y^2 -1
okrąg o promieniu 10 = x^2 + 2y^2 -1
elipsa0 = xy
przekroju kształt w zasadzie Związek osi x i na osi y0 = y^2 - x
parabola0 = y^2 - (x^3 - x + 1)
eliptyczna krzywa0 = x^3 + y^3 - 3xy
folium Kartezjusza0 = x^4 - (x^2 - y^2)
lemniscate0 = (x^2 + y^2)^2 - (x^3 - 3xy^2)
trifolium0 = (x^2 + y^2 - 1)^3 + 27x^2y^2
astroid
Zadanie
Biorąc pod uwagę wielomian f
(jak zdefiniowano poniżej) i zakresy x / y, wysyłaj czarno-biały obraz o wielkości co najmniej 100 x 100 pikseli, który pokazuje krzywą jako czarną linię na białym tle.
Detale
Kolor : możesz użyć dowolnych dwóch innych kolorów, po prostu łatwo je rozróżnić.
Fabuła : Zamiast obrazu pikselowego możesz również wyprowadzić ten obraz jako ascii-art, gdzie „piksele” w tle powinny być spacją / podkreśleniem lub innym znakiem, który „wygląda na pusty”, a linia może być utworzona z postaci, która wygląda na „ pełny ”jak M
lub X
lub #
.
Nie musisz się martwić aliasingiem.
Musisz tylko wykreślić linie, w których znak wielomianu zmienia się z jednej strony linii na drugą (co oznacza, że możesz np. Użyć algorytmu marszowego kwadratu), nie musisz poprawnie wykreślić „przypadków patologicznych, takich jak 0 = x^2
znak nie zmieniaj się, przechodząc z jednej strony linii na drugą. Ale linia powinna być ciągła i oddzielać regiony różnych znaków f(x,y)
.
Wielomian : Wielomian podano jako (m+1) x (n+1)
macierz / listę list (rzeczywistych) współczynników, w poniższym przykładzie warunki współczynników podano w ich pozycji:
[ 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]
Jeśli wolisz, możesz założyć, że macierz jest kwadratowa (co zawsze można zrobić z niezbędnym uzupełnieniem zerowym), a jeśli chcesz, możesz również założyć, że rozmiar matrycy jest podany jako dodatkowe dane wejściowe.
Poniżej przykłady z góry są przedstawione jako macierz zdefiniowana w następujący sposób:
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]
Przypadki testowe z zakresem x / y:
(W niezbyt czytelnym, ale lepszym formacie umożliwiającym kopiowanie i wklejanie, dostępnym tutaj na pastebin .)
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]
Inspiracja do niektórych krzywych pochodzi z tego pliku pdf.
m
x n
, ale (m+1)
x (n+1)
. Co przyjmujemy za dane wejściowe: m, n
lub m+1,n+1
? Czy możemy wybrać?