Trazar un círculo centrado
Intro
Radio dado \$r\$, dibuje un círculo en el centro de la pantalla.
Salvadera.
El reto
He aquí un sencillo desafío.
Trace un círculo usando la fórmula \$x^2+y^2=r^2\$, o cualquier otra fórmula que trazará un círculo de acuerdo con los parámetros dados.
Puede utilizar cualquier unidad que proporcione su idioma, siempre que estén bien definidas y proporcionen resultados coherentes.
El círculo debe tener su centro en el centro del lienzo y debe tener un acolchado de 5 unidades o más en todos los lados.
El círculo puede tener cualquier relleno que no coincida con el contorno.
Puede tener ejes en el fondo de su trama.
El contorno del círculo debe ser sólido (sin espacios) y debe ser visible. Aquí hay un ejemplo:
La información se puede tomar de cualquier forma aceptable. (función params, variables, stdin ...)
La salida puede tener la forma de una ventana separada o un formato de imagen.
Se aplican lagunas y reglas estándar.
Código de ejemplo ( Java + Processing)
// Modified from the C language example from
// https:// en.wikipedia.org/wiki/Midpoint_circle_algorithm
int r = 70; //radius
void settings() {
size(2*r+10, 2*r+10);
}
void draw() {
background(255);
drawCircle(width/2, height/2, r, 60);
save("Circle.png");
}
void drawCircle(int x0, int y0, int radius, int angle) {
int circCol = color(0, 0, 0);
float limit = radians(angle);
int x = radius;
int y = 0;
int err = 0;
while (x >= y && atan2(y, x) < limit) {
set(x0 + x, y0 + y, circCol);
set(x0 + y, y0 + x, circCol);
set(x0 - y, y0 + x, circCol);
set(x0 - x, y0 + y, circCol);
set(x0 - x, y0 - y, circCol);
set(x0 - y, y0 - x, circCol);
set(x0 + y, y0 - x, circCol);
set(x0 + x, y0 - y, circCol);
y += 1;
if (err <= 0) {
err += 2*y + 1;
}
if (err > 0) {
x -= 1;
err -= 2*x + 1;
}
}
}
Puntuación
Ésta es una pregunta de salida gráfica . Sin arte ascii.
Esto es código de golf . gana la respuesta más corta en cada idioma.
Respuestas
R , 74 70 68 65 54 bytes
Editar: -11 bytes gracias a Giuseppe
function(r)plot(r*1i^(1:1e3/99),,"l",l<-c(-r-5,r+5),l)
Pruébelo en rdrr.io
Propongo 3 posibles respuestas a este desafío en R , de longitud decreciente pero con advertencias crecientes.
Mi respuesta favorita (arriba, usando plot) es la media más corta de las 3. Traza un círculo calculando las coordenadas complejas de potencias de i, usando 396 puntos (con un poco de envoltura). Aquí hay una imagen de la salida de plot_circle(5):
Para un círculo 'verdadero' (en lugar de un casi círculo con pequeñas líneas rectas que conectan los puntos de datos), podemos usar la curvefunción con una fórmula, pero desafortunadamente necesitamos dibujar las mitades positiva y negativa por separado, por lo que termina más:
R , 86 84 bytes
function(r){curve((r^2-x^2)^.5,xli=l<-c(-r-5,r+5),yli=l)
curve(-(r^2-x^2)^.5,add=T)}
Pruébelo en rdrr.io
El más corto (que se me ocurre) Anteriormente el más corto, pero - gracias a Giuseppe ahora ya no lo es - es usar la circlesopción de la symbolsfunción, por solo 56 bytes. Sin embargo, esto tiene la advertencia de que los símbolos circulares siempre son circulares incluso si se cambia el tamaño de la gráfica, por lo que es posible que ya no se alineen con el eje y.
R , 62 58 56 bytes
function(r)symbols(x=1,c=r,i=F,xli=l<-c(-r-4,r+6),yli=l)
Pruébelo en rdrr.io
Desmos , 1 byte
r
Pruébalo en Desmos
Utiliza el mismo método de entrada que la otra respuesta de Desmos. Una variable no utilizada llamada por rdefecto dibuja un círculo con radio r.
C (gcc) , 169 166 161 160 bytes
¡Gracias a roofcat (x3) por las sugerencias! También cambié las líneas nuevas en el encabezado a espacios, ya que parecen funcionar bien como separadores (al menos en Irfanview) y arreglé un error que se reveló cuando la matriz se colocó en la pila.
Genera una imagen en formato PBM, ya que probablemente sea la forma más sencilla de hacer un mapa de bits. Por alguna razón, a todos los visores PBM en línea que probé no parece que les guste el archivo de salida, pero Irfanview y GIMP están bien con él.
z;f(r,w){char s[(w=r*2+11)*w+1];float x=s[w*w]=!memset(s,48,w*w);for(;x<7;)s[z=round(sin(x+=1e-5)*r+r+5)+round(cos(x)*r+r+5)*w]=49;printf("P1 %d %d %s",w,w,s);}
¡Pruébelo en línea!
JavaScript (ES6), 96 bytes
f=
v=>`<svg width=${s=v*2+12} height=${s}><circle r=${v} cx=${v+=6} cy=${v} stroke=#000 fill=none>`
<input type=number min=1 oninput=o.innerHTML=f(+this.value)><div id=o>
Genera una imagen SVG (HTML5), que se muestra en el fragmento. Si HTML5 es aceptable, entonces para 95 bytes:
f=
v=>`<div style="width:${v*=2}px;height:${v}px;margin:6px;border:1px solid;border-radius:100%">`
<input type=number min=1 oninput=o.innerHTML=f(+this.value)><div id=o>
Python 2 y 3, 57 bytes
-17 bytes gracias a @DigitalTrauma
-1 byte gracias a @Sisyphus
from turtle import*
def f(r):pu();sety(-r);pd();circle(r)
¡Pruébelo en línea!
turtle es una biblioteca estándar incluida en Python 2 y 3. Se me ocurrió una turtleidea casi como el primer resultado al buscar en Google " graphics python ".
SageMath , 24 bytes
lambda r:circle((0,0),r)
¡Pruébelo en línea!
Ejemplo
Java 8, 141123 bytes
import java.awt.*;r->new Frame(){{setSize(2*r+26,2*r+56);show();}public void paint(Graphics g){g.drawOval(13,43,2*r,2*r);}}
Salida para \$n=100\$ (la segunda imagen con color de fondo gris claro agregado es para verificar el relleno superior):
Explicación:
import java.awt.*; // Required import for Frame and Graphics
r-> // Method with integer parameter and Frame return-type
new Frame(){ // Create the Frame
{ // In an inner code-block:
setSize(2*r // Set the width to 2 times the radius-input
+26 // + 2 times 8 pixels for the frame borders
// + 2 times 5 pixels for the required padding
2*r // Set the height to 2 times the radius-input
+56); // + 2 times 8 pixels for the frame borders
// + 30 pixels for the frame title-bar
// + 2 times 5 pixels for the required padding
show();} // And show the Frame at the end
public void paint(Graphics g){
// Overwrite its paint method to draw on
g.drawOval(13,43, // With 5,5 for the required padding as top-left
// x,y-coordinate of the surrounding rectangle + the same 8+30
// pixels adjustment for the frame and frame title-bar,
2*r,2*r);}} // draw the circle with a size of 2 times the radius-input
Nota: No puedo usar en (r*=2),r,r,rlugar de 2*r,2*r,2*r,2*rguardar (3) bytes, porque rtiene que ser efectivamente final dentro de la clase Frame interna.
MATLAB, 38 37 bytes
-1 byte gracias a Tom Carpenter
ezpolar(@(x)r);axis((r+5)*cospi(1:4))
Ingrese como variable ren el espacio de trabajo.
Salida:
Rojo , 90 bytes
func[r][d: r + 5 view compose/deep[base(as-pair d * 2 d * 2)draw[circle(as-pair d d)(r)]]]
¡Pruébelo en línea!
f 200
T-SQL, 47 bytes
SELECT geometry::Point(0,0,0).STBuffer(r)FROM t
La información se obtiene a través de una preexistente mesa de t con el campo de flotación r , de acuerdo con nuestras reglas IO .
Utiliza funciones geoespaciales de SQL , que se muestran en el panel de resultados de SQL Management Studio:
JavaScript (V8) , 158 bytes
r=>document.write(`<p style="border-radius:50%;border:solid;position:fixed;width:${r*2}px;height:${r*2}px;top:50%;left:50%;transform:translate(-50%,-50%);">`)
¡Pruébelo en línea!
jsfiddle gracias a @Razetime
- Guardado 1 gracias a @Razetime
- Guardado 2 usando literales de plantilla
Escribe directamente en HTML un pelemento de posición fija, centrado con un radio de borde del 50%
Wolfram Language (Mathematica) , 16 bytes
Graphics@*Circle
Consulte la documentación de Wolfram en Circle
por ejemplo, aquí hay un círculo con centro (0,0) y radio r = 42
-6 bytes de @ LegionMammal978
Desmos, 13 bytes
x^2+y^2=r^2
r
$$ x^2 + y^2 = r^2 \\{} r $$
Desmos es
Shadertoy (GLSL), 142 bytes
void mainImage(out vec4 f,in vec2 v){vec2 S=iResolution.xy;vec2 u=v/S-vec2(0.5);u.y/=S.x/S.y;vec4 c;if(abs(length(u)-0.2)<8e-4)c=vec4(1);f=c;}
Enlace de Shadertoy
Salida:
PHP , 131 bytes
($f=imagecolorallocate)($i=imagecreate($d=10+$argn*2,$d),0,0,0);imageellipse($i,$d/2,$d/2,$d-10,$d-10,$f($i,9,9,9));imagepng($i,a);
¡Pruébelo en línea!
En realidad, no puede ejecutarlo en probadores PHP en línea porque deshabilitan las funciones de imagen. Guarda la imagen en un archivo llamado "a". Se podía guardar un byte usando imagegdpero no conocía el formato "gd" y no pude abrirlo para verificar si funciona.
El círculo es de un gris muy oscuro, pero lo considero visible. Si no lo hace, deje un comentario y lo editaré, con un byte más $f($i,99,0,0)queda mucho más claro.
con $f($i,9,9,9):
con $f($i,99,0,0):
LaTeX, 66 bytes
\input tikz\def\f#1{~\vfill\centering\tikz\draw circle(#1);\vfill}
Considero que el "lienzo" requerido por este desafío es el área de texto predeterminada de una página de látex. El código define una macro \fque toma el radio en cm como argumento.
Código de ejemplo
\documentclass{article}
\input tikz\def\f#1{~\vfill\centering\tikz\draw circle(#1);\vfill}
\begin{document}
\f{3}
\enddocument
Genera un PDF:
Perl 5 , 92 bytes
$r=$_;
$w=$r*2+11;
$_="P1 $w $w @{[map{($_%$w-$r-5)**2+($_/$w-$r-5)**2<$r**2?1:0}0..$w**2-1]}"
¡Pruébelo en línea!
Círculo con relleno negro. Ponga los 92 bytes arriba en program.pl y ejecútelo así:
echo 50 | perl -p program.pl > circle.pbm # radius 50
feh circle.pbm # view with feh or other image viewer