Una curva algebrica è un certo "sottoinsieme 1D" del "piano 2D" che può essere descritto come un insieme di zeri {(x,y) in R^2 : f(x,y)=0 }
di un polinomio f
. Qui consideriamo il piano 2D come il piano reale in R^2
modo tale da poter facilmente immaginare come potrebbe apparire una tale curva, in pratica una cosa che puoi disegnare con una matita.
Esempi:
0 = x^2 + y^2 -1
un cerchio di raggio 10 = x^2 + 2y^2 -1
un'ellisse0 = xy
una forma a croce , fondamentalmente l'unione dell'asse x e dell'asse y0 = y^2 - x
una parabola0 = y^2 - (x^3 - x + 1)
una curva ellittica0 = x^3 + y^3 - 3xy
il folio di Cartesio0 = x^4 - (x^2 - y^2)
un lemniscato0 = (x^2 + y^2)^2 - (x^3 - 3xy^2)
un trifolium0 = (x^2 + y^2 - 1)^3 + 27x^2y^2
un astroide
Compito
Dato un polinomio f
(come definito di seguito) e gli intervalli x / y, genera un'immagine in bianco e nero di almeno 100x100 pixel che mostra la curva come linea nera su uno sfondo bianco.
Dettagli
Colore : puoi usare altri due colori a tua scelta, dovrebbe essere facile distinguerli.
Trama : invece di un'immagine pixel puoi anche generare questa immagine come ascii-art, in cui i "pixel" di sfondo dovrebbero essere spazio / sottolineato o un altro carattere che "sembra vuoto" e la linea può essere fatta di un carattere che sembra " pieno "come M
o X
o #
.
Non devi preoccuparti di aliasing.
Devi solo tracciare linee in cui il segno del polinomio cambia da un lato all'altro della linea (ciò significa che potresti ad esempio usare l'algoritmo del quadrato in marcia), non devi tracciare correttamente "casi patologici come 0 = x^2
dove il segno fa non cambiare quando si passa da un lato all'altro della linea, ma la linea dovrebbe essere continua e separare le regioni dei diversi segni di f(x,y)
.
Polinomio : il polinomio è dato come una (m+1) x (n+1)
matrice / elenco di elenchi di coefficienti (reali), nell'esempio seguente i termini dei coefficienti sono riportati nella loro posizione:
[ 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 preferisci, puoi assumere che la matrice sia quadrata (cosa che può sempre essere eseguita con il necessario riempimento di zero) e, se lo desideri, puoi anche supporre che la dimensione della matrice sia data come input adizionali.
Di seguito, gli esempi di cui sopra sono rappresentati come una matrice definita in questo modo:
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]
Casi di test con intervallo x / intervallo y:
(In un formato non così leggibile ma meglio copia-incolla disponibile qui su 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]
Ho preso l'ispirazione per alcune curve da questo pdf.
m
x n
, ma (m+1)
x (n+1)
. Cosa prendiamo come input:, m, n
oppure m+1,n+1
? Oppure possiamo scegliere?