Uma curva algébrica é um certo "subconjunto 1D" do "plano 2D" que pode ser descrito como um conjunto de zeros {(x,y) in R^2 : f(x,y)=0 }
de um polinômio f
. Aqui, consideramos o plano 2D como o plano real R^2
, para que possamos imaginar facilmente como seria uma curva, basicamente algo que você pode desenhar com um lápis.
Exemplos:
0 = x^2 + y^2 -1
um círculo de raio 10 = x^2 + 2y^2 -1
uma elipse0 = xy
uma forma de cruz , basicamente a união do eixo xe do eixo y0 = y^2 - x
uma parábola0 = y^2 - (x^3 - x + 1)
uma curva elíptica0 = x^3 + y^3 - 3xy
o folium de Descartes0 = x^4 - (x^2 - y^2)
um lemniscato0 = (x^2 + y^2)^2 - (x^3 - 3xy^2)
um trifólio0 = (x^2 + y^2 - 1)^3 + 27x^2y^2
um astroide
Tarefa
Dado um polinômio f
(conforme definido abaixo) e os intervalos x / y, produz uma imagem em preto e branco de pelo menos 100x100 pixels que mostra a curva como linha preta em um fundo branco.
Detalhes
Cor : você pode usar quaisquer outras duas cores de sua escolha; deve ser fácil diferenciá-las.
Trama : em vez de uma imagem de pixel, você também pode exibir esta imagem como arte-ascii, onde o "pixel" do plano de fundo deve ser espaço / sublinhado ou outro caractere que "parece vazio" e a linha pode ser feita de um caractere que parece " cheio "como M
ou X
ou #
.
Você não precisa se preocupar com o alias.
Você só precisa plotar linhas onde o sinal do polinômio muda de um lado da linha para o outro (o que significa que você pode, por exemplo, usar o algoritmo do quadrado de marcha), não é necessário plotar corretamente "casos patológicos como 0 = x^2
onde o sinal ocorre" não muda ao passar de um lado da linha para o outro, mas a linha deve ser contínua e separar as regiões dos diferentes sinais de f(x,y)
.
Polinômio : O polinômio é dado como uma (m+1) x (n+1)
matriz / lista de listas de coeficientes (reais), no exemplo abaixo, os termos dos coeficientes são dados em sua posição:
[ 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]
Se preferir, você pode assumir que a matriz é quadrada (o que sempre pode ser feito com o preenchimento de zero necessário) e, se desejar, também pode assumir que o tamanho da matriz é dado como entradas adicionais.
A seguir, os exemplos acima são representados como uma matriz definida assim:
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]
Casos de teste com intervalo x / intervalo y:
(Em um formato não tão legível, mas melhor disponível para copiar e colar, disponível aqui no 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]
Eu tenho a inspiração para algumas curvas deste pdf.
m
x n
, mas (m+1)
x (n+1)
. O que tomamos como entrada:, m, n
ou m+1,n+1
? Ou podemos escolher?