Trace um círculo centralizado

Sep 22 2020

Introdução

Raio dado \$r\$, desenhe um círculo no centro da tela.

Caixa de areia.

O desafio

Aqui está um desafio simples.

Trace um círculo usando a fórmula \$x^2+y^2=r^2\$, ou qualquer outra fórmula que irá traçar um círculo de acordo com os parâmetros fornecidos.

Você pode usar quaisquer unidades fornecidas por seu idioma, desde que sejam bem definidas e forneçam resultados consistentes.

O círculo deve ter seu centro no centro da tela e deve ter um preenchimento de 5 unidades ou mais em todos os lados.

O círculo pode ter qualquer preenchimento que não corresponda ao contorno.

Você pode ter eixos no fundo do seu gráfico.

O contorno do círculo deve ser sólido (sem lacunas) e deve ser visível. Aqui está um exemplo:

A entrada pode ser feita em qualquer forma aceitável. (parâmetros de função, variáveis, stdin ...)

A saída pode ser na forma de uma janela separada ou um formato de imagem.

Lacunas e regras padrão se aplicam.

Código de exemplo ( 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;
    }
  }
}

Pontuação

Esta é uma questão de saída gráfica . Sem arte ascii.

Este é o código de golfe . a resposta mais curta em cada idioma ganha.

Respostas

7 DominicvanEssen Sep 22 2020 at 15:31

R , 74 70 68 65 54 bytes

Editar: -11 bytes graças a Giuseppe

function(r)plot(r*1i^(1:1e3/99),,"l",l<-c(-r-5,r+5),l)

Experimente em rdrr.io

Proponho 3 respostas possíveis para este desafio em R , de comprimento decrescente, mas com advertências crescentes.

Minha resposta favorita (acima, usando plot) é a mais curta do meio de 3. Ele traça um círculo calculando as coordenadas complexas de potências de i, usando 396 pontos (com um pouco de contorno). Aqui está uma imagem da saída de plot_circle(5):


Para um círculo 'verdadeiro' (em vez de um quase círculo com pequenas linhas retas conectando os pontos de dados), podemos usar a curvefunção com uma fórmula, mas infelizmente precisamos desenhar as metades positiva e negativa separadamente, então termina mais longo:

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

Experimente em rdrr.io


O mais curto (que eu posso pensar) Anteriormente o mais curto, mas - graças ao Giuseppe agora não é mais - é usar a circlesopção da symbolsfunção, por apenas 56 bytes. No entanto, isso tem a ressalva de que os símbolos de círculo são sempre circulares, mesmo se o gráfico for redimensionado e, portanto, não podem mais se alinhar com o eixo y.

R , 62 58 56 bytes

function(r)symbols(x=1,c=r,i=F,xli=l<-c(-r-4,r+6),yli=l)

Experimente em rdrr.io

5 EthanChapman Sep 23 2020 at 01:20

Desmos , 1 byte

r

Experimente no Desmos

Usa o mesmo método de entrada que a outra resposta Desmos. Uma variável não utilizada nomeada rtem como padrão desenhar um círculo com raio r.

5 ErikF Sep 23 2020 at 08:36

C (gcc) , 169 166 161 160 bytes

Agradecimentos ao roofcat (x3) pelas sugestões! Eu também alterei as novas linhas no cabeçalho para espaços, pois eles parecem funcionar bem como separadores (pelo menos no Irfanview) e consertei um bug que foi revelado quando o array foi colocado na pilha.

Gera uma imagem no formato PBM, pois é provavelmente a maneira mais simples de fazer um bitmap! Por alguma razão, todos os visualizadores PBM online que tentei não parecem gostar do arquivo de saída, mas Irfanview e GIMP estão bem com isso.

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);}

Experimente online!

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>

Produz uma imagem SVG (HTML5), que o snippet exibe para você. Se HTML5 for aceitável, 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 e 3, 57 bytes

-17 bytes graças a @DigitalTrauma
-1 byte graças a @Sisyphus

from turtle import*
def f(r):pu();sety(-r);pd();circle(r)

Experimente online!

turtle é uma biblioteca padrão incluída no Python 2 e 3. Tive a turtleideia quase como o primeiro resultado ao pesquisar " gráficos python " no Google.

3 Noodle9 Sep 22 2020 at 15:00

SageMath , 24 bytes

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

Experimente online!

Exemplo

3 KevinCruijssen Sep 22 2020 at 15:41

Java 8, 141 123 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);}}

Saída para \$n=100\$ (a segunda imagem com a cor de fundo cinza claro adicionada é para verificar o preenchimento superior):

Explicação:

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: Não posso usar em (r*=2),r,r,rvez de 2*r,2*r,2*r,2*rpara salvar (3) bytes, porque rtem que ser efetivamente final dentro da classe Frame interna.

3 elementiro Sep 24 2020 at 07:01

MATLAB, 38 37 bytes

-1 byte graças a Tom Carpenter

ezpolar(@(x)r);axis((r+5)*cospi(1:4))

Insira como variável rna área de trabalho.
Resultado:

2 GalenIvanov Sep 22 2020 at 15:31

Vermelho , 90 bytes

func[r][d: r + 5 view compose/deep[base(as-pair d * 2 d * 2)draw[circle(as-pair d d)(r)]]]

Experimente online!

f 200

2 BradC Sep 22 2020 at 23:52

T-SQL, 47 bytes

SELECT geometry::Point(0,0,0).STBuffer(r)FROM t

A entrada é obtida por meio de uma tabela pré-existente t com campo flutuante r , de acordo com nossas regras de IO .

Usa funções geoespaciais SQL , exibidas no painel de resultados do 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%);">`)

Experimente online!

jsfiddle graças a @Razetime

  • Salvo 1 graças a @Razetime
  • Salvo 2 usando literais de modelo

Grava diretamente no HTML um pelemento posicionado de forma fixa, centralizado com raio de borda de 50%

2 J42161217 Sep 22 2020 at 14:32

Linguagem Wolfram (Mathematica) , 16 bytes

Graphics@*Circle

Veja a documentação do Wolfram no Circle

por exemplo, aqui está um círculo com centro (0,0) e raio 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 it

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;}

Link do Shadertoy

Resultado:

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

Experimente online!

Na verdade, você não pode executá-lo em testadores de PHP online porque eles desativam as funções de imagem. Salva a imagem em um arquivo denominado "a". Um byte poderia ser salvo usando, imagegdmas eu não conhecia o formato "gd" e não consegui abri-lo para verificar se funciona.

O círculo é em cinza muito escuro, mas eu o considero visível. Se não, deixe um comentário e eu edito, com um byte a mais $f($i,99,0,0)fica muito mais claro.

com $f($i,9,9,9):

com $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 a "tela" exigida por este desafio como a área de texto padrão de uma página de látex. O código define uma macro \fque usa o raio em cm como argumento.

Código Exemplo

\documentclass{article}

\input tikz\def\f#1{~\vfill\centering\tikz\draw circle(#1);\vfill}

\begin{document}
\f{3}
\enddocument

Produz um 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]}"

Experimente online!

Círculo com preenchimento preto. Coloque os 92 bytes acima em program.pl e execute assim:

echo 50 | perl -p program.pl > circle.pbm  # radius 50
feh circle.pbm                             # view with feh or other image viewer