Trazar un círculo centrado

Sep 22 2020

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

7 DominicvanEssen Sep 22 2020 at 15:31

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

5 EthanChapman Sep 23 2020 at 01:20

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.

5 ErikF Sep 23 2020 at 08:36

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!

4 Neil Sep 22 2020 at 16:37

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>

4 Arty Sep 22 2020 at 22:29

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 ".

3 Noodle9 Sep 22 2020 at 15:00

SageMath , 24 bytes

lambda r:circle((0,0),r)

¡Pruébelo en línea!

Ejemplo

3 KevinCruijssen Sep 22 2020 at 15:41

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.

3 elementiro Sep 24 2020 at 07:01

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:

2 GalenIvanov Sep 22 2020 at 15:31

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

2 BradC Sep 22 2020 at 23:52

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:

2 AZTECCO Sep 23 2020 at 13:26

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%

2 J42161217 Sep 22 2020 at 14:32

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

1 Lyxal Sep 22 2020 at 13:13

Desmos, 13 bytes

x^2+y^2=r^2
r

$$ x^2 + y^2 = r^2 \\{} r $$

Desmos es

1 schnaader Sep 23 2020 at 17:33

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:

1 Kaddath Oct 01 2020 at 17:14

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):

1 corvus_192 Oct 28 2020 at 18:00

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:

KjetilS. Sep 25 2020 at 04:42

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