Una curva algebraica es un cierto "subconjunto 1D" del "plano 2D" que puede describirse como un conjunto de ceros {(x,y) in R^2 : f(x,y)=0 }
de un polinomio f
. Aquí consideramos el plano 2D como el plano real, de R^2
modo que podemos imaginar fácilmente cómo podría ser esa curva, básicamente algo que se puede dibujar con un lápiz.
Ejemplos:
0 = x^2 + y^2 -1
un círculo de radio 10 = x^2 + 2y^2 -1
una elipse0 = xy
una forma de cruz , básicamente la unión del eje x y el eje y0 = y^2 - x
una parábola0 = y^2 - (x^3 - x + 1)
una curva elíptica0 = x^3 + y^3 - 3xy
el folio de Descartes0 = x^4 - (x^2 - y^2)
un lemniscate0 = (x^2 + y^2)^2 - (x^3 - 3xy^2)
un trifolium0 = (x^2 + y^2 - 1)^3 + 27x^2y^2
un astroide
Tarea
Dado un polinomio f
(como se define a continuación) y los rangos x / y, genera una imagen en blanco y negro de al menos 100x100 píxeles que muestra la curva como una línea negra sobre un fondo blanco.
Detalles
Color : puede usar cualquiera de los otros dos colores de su elección, debería ser fácil distinguirlos.
Trama : en lugar de una imagen de píxeles, también puede mostrar esta imagen como un arte gráfico, donde los "píxeles" de fondo deben ser espacios / subrayados u otro carácter que "se vea vacío" y la línea puede estar hecha de un carácter que se vea " completo "como M
o X
o #
.
No tiene que preocuparse por los alias.
Solo necesita trazar líneas donde el signo del polinomio cambia de un lado a otro de la línea (eso significa que podría, por ejemplo, usar el algoritmo de cuadrado de marcha), no tiene que trazar correctamente "casos patológicos como 0 = x^2
donde lo hace el signo no cambia cuando va de un lado de la línea al otro, pero la línea debe ser continua y separar las regiones de los diferentes signos de f(x,y)
.
Polinomio : el polinomio se proporciona como una (m+1) x (n+1)
matriz / lista de listas de coeficientes (reales), en el siguiente ejemplo, los términos de los coeficientes se dan en su posición:
[ 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]
Si lo prefiere, puede suponer que la matriz es cuadrada (lo que siempre se puede hacer con el relleno de cero necesario), y si lo desea, también puede suponer que el tamaño de la matriz se da como entradas adicionales.
A continuación, los ejemplos de arriba se representan como una matriz definida así:
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 prueba con rango x / rango y:
(En un formato no tan legible pero mejor para copiar y pegar disponible aquí en 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]
Tengo la inspiración para algunas curvas de este pdf.
m
x n
, sino (m+1)
x (n+1)
. ¿Qué tomamos como entrada: m, n
o m+1,n+1
? ¿O podemos elegir?