Trace um círculo centralizado
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
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
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.
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!
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>
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.
SageMath , 24 bytes
lambda r:circle((0,0),r)
Experimente online!
Exemplo
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.
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:
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
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:
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%
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
Desmos, 13 bytes
x^2+y^2=r^2
r
$$ x^2 + y^2 = r^2 \\{} r $$
Desmos it
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:
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):
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:
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