Desenhe um triângulo de Reuleaux!

27

O triângulo de Reuleaux é a forma formada pela interseção de três círculos, com cada círculo passando pelos centros dos outros. Independentemente da rotação, a largura de um triângulo de Reuleaux sempre será igual ao raio dos círculos:

From Wolfram MathWorld

Imagem: Wolfram MathWorld

Escreva um programa que tenha uma largura rcomo entrada e exiba um triângulo Reuleaux dessa largura (em pixels).

Você deve exibir a forma isoladamente, ou seja, preenchida com sólido, sem traços e sobre um fundo preenchido com sólido.

- O programa mais curto em bytes vence.

darrylyeo
fonte
1
O raio deve restar em pixels ou apenas algum fator de escala?
Karl Napf
@Karl Napf Pixels.
darrylyeo
Podemos produzir algo para STDOUT, desde que desenhemos o triângulo de Reuleaux corretamente?
Erik the Outgolfer
@EriktheOutgolfer Isso é bom.
darrylyeo

Respostas:

21

JavaScript + HTML, 164 158 + 13 = 171 bytes

w=+prompt(f=(x,y)=>x*x+y*y<w*w);C.width=C.height=w*2;for(y=-w;++y<w;)for(x=-w;++x<w;)f(x,y)&f(w-x,y)&f(w/2-x,y-w*.866)&&C.getContext`2d`.fillRect(x+w,y+w,1,1)
<canvas id=C>

Não sei por que gosto de responder a esses desafios de desenho matemático com <canvas>tanto ...

ETHproductions
fonte
13

Love2D, 320 bytes.

j=math.rad(60)i="increment"m=math s=m.sin C=m.cos g=love.graphics f="fill"S=g.stencil function love.draw()r=arg[2]c=function(x,y)return function()g.circle(f,x,y,r,r*4)end end X=r/2 Y=0 S(c(X,Y),i,1)S(c(X+C(j)*r,Y+s(j)*r),i,1,true)S(c(X-C(j)*r,Y+s(j)*r),i,1,true)g.setStencilTest("greater",2)g.rectangle(f,0,0,2*r,2*r)end

Provavelmente não é a solução ideal, ele usa os estênceis do Love2D, configurando os 3 círculos e preenchendo onde eles se cruzam.

Ligue através da linha de comando, como love tri.love 256

Saída de exemplo

ATaco
fonte
5
É muito lindo
Ataco
10

Python 2 , 111 bytes

from turtle import*
r=input()
ht()
begin_fill()
c=circle
c(r,60)
seth(120)
c(r,60)
seth(240)
c(r,60)
end_fill()

exemplo de execução

Jonathan Allan
fonte
9

Mathematica 101 100 98 Bytes

Adotando uma abordagem diferente da @MichaelSeifert e provavelmente interpretando isso um pouco mais literalmente em relação à cláusula pixel:

Image@Boole@Table[And@@(({x,y}∈#~Disk~2)&/@{{0,c=√3},d={1,0},-d}),{x,-1,1,2/#},{y,c-2,c,2/#}]&

Exemplo de uso:

%@10

10 pixels Imagem de 10 pixels

50 pixels Imagem de 50 pixels

100 pixels Imagem de 100 pixels

Salvou um byte graças a @MartinEnder (notação de infixo) e outros 2 bytes, definindo d.

Kelly Lowder
fonte
6

PHP + SVG, 165 bytes

<?$h=3/8*$w=2*$d=2*$r=$_GET[0];$q=$r+sqrt($r**2-($r/2)**2);echo"<svg width=$w height=$w><path d='M$r,$r A$r,$r 0 0 1 $d,$r A$r,$r 0 0 1 $h,$q A$r,$r 0 0 1 $r,$r'/>";

Exemplo de saída para entrada 128

<svg width=512 height=512><path d='M128,128 A128,128 0 0 1 256,128 A128,128 0 0 1 192,238.85125168441 A128,128 0 0 1 128,128'/>

Jörg Hülsermann
fonte
6

PostScript, 96 86 85 75 73 72 bytes

dup(^@^^Z<^@Z<){sin mul exch dup}forall
0 1 2{newpath 369 arc clip}for fill

Recebe a entrada como um valor na pilha. ^^e ^@representam caracteres de controle literais. (^@^^Z<^@Z<)é a sequência de caracteres com pontos de código 0, 30, 90, 60, 0, 90 e 60, respectivamente. Esses são interpretados como ângulos em graus, porque obviamente é para isso que servem os pontos de código.

Economizou 10 bytes porque closepathnão é necessário (ambos clipe fillimplicitamente fecham o caminho).

Salva 1 byte usando em repeatvez de definir uma função.

Economizou 10 bytes mudando para uma abordagem completamente diferente.

Economizou 2 bytes fazendo truques com a pilha.

1 byte salvo usando em 0 1 2{}forvez de 3{}repeat.

Grimmy
fonte
5

Mathematica, 134 131 bytes

Nota: esta solução não é mais válida, pois a pergunta foi editada posteriormente para exigir que r fosse medido em pixels. Agradeço a Martin Ender por me ajudar a eliminar alguns bytes nos comentários.

r=Input[];RegionPlot[And@@((Abs[y+I x-#]^2<3r^2)&/@Table[Exp[2n I/3Pi]r,{n,3}]),{x,-1,1},{y,-1,1},Frame->False,BoundaryStyle->None]

insira a descrição da imagem aqui

O valor de entrada deve ser escalado entre 0 e 1 para que esse código funcione. Observe que quase um quarto desse código é necessário para exibir a forma "isoladamente", pois esse não é o padrão do Mathematica.

Michael Seifert
fonte
3
Bem-vindo ao PPCG! r Exp[2 I Pi n/3]pode ser Exp[2I n/3Pi]rpara economizar alguns espaços. E geralmente é mais curto escrever uma função sem nome, ou seja, largar r=Input[];, substituir rpor #e acrescentar a &.
Martin Ender
Eu acho que a entrada tem que ser pixels, não um fator de escala.
Internet_user
1
@pycoder: Sim, essa restrição foi editada depois que eu postei minha solução.
Michael Seifert
4

BBC BASIC, 58 bytes

I.r:L.r,r,r,r:F.i=0TO9S.PI/1.5PLOT177,r*COS(i),r*SIN(i)N.

Faça o download do intérprete em http://www.bbcbasic.co.uk/bbcwin/download.html

Ungolfed

INPUTr                       :REM input a radius
LINEr,r,r,r                  :REM draw a line of length 0 from r,r to r,r to establish a cursor history away from the corner of the screen
FORi=0 TO 9 STEP PI/1.5      :REM in steps of 120 degrees (going round and round the three sides of an equilateral triangle)
  PLOT177,r*COS(i),r*SIN(i)  :REM move relative by r*COS(i),r*SIN(i) and draw a sector with arc between new and last graphics cursor positions,
NEXT                         :REM with the centre of the arc at the penultimate graphics cursor position.
Level River St
fonte
Uau, isso é praticamente um built-in!
Neil
4

TeX / TikZ, 128 121 112 bytes

\input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~ in{1,2,3}{[rotate=~*120]arc(0:60:\r pt)};\bye

O código é baseado em esta resposta em TeX.se .

O TeX é baseado em vetores, portanto, não pixels. O raio é um flutuador com no máximo cerca de 15 antes de atingir a borda da página. Também não é realmente construído para entrada de linha de comando, portanto, precisa ser executado como

pdftex  "\def\r{2} \input rt.tex"

onde o código acima é salvo em rt.tex

Chris H
fonte
Algumas dicas para tornar isso mais curto: você não precisa de nenhuma das novas linhas; você não precisa .tex; \footline{}é tão bom quanto \nopagenumbers; use ~como um nome de variável em vez de \i. Para satisfazer o requisito de "pixel", você pode usar \r sp; 1sp é o equivalente a um pixel para o TeX, pois é o melhor local que o TeX pode gerenciar (não sei se isso se aplica ao tikz).
Gilles 'SO- stop be evil'
@ Gilles Não consigo fazer nada, spmas acho que pté uma boa ideia. Todas as suas outras idéias funcionaram (algumas não pareceram nos meus testes). Obrigado
Chris H
Você pode remover o espaço depois ~para salvar mais um byte. \input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~in{1,2,3}{[rotate=~*120]arc(0:60:\r sp)};\byefunciona para mim. Tente pdftex "\def\r{2000000} \input rt.tex"- em 2sp, encontrar a forma visualmente seria difícil, dada a sua pequena dimensão.
Gilles 'SO- stop be evil'
@ Gilles Devo admitir que só subi para 20000 sp.
Chris H
1
1pt = 65536sp, então 20000sp ainda é pequeno.
Gilles 'SO- stop be evil'
3

GLSL, 298 229 caracteres

precision lowp float;
uniform vec2 resolution;float r=100.;void main(){vec2 p=gl_FragCoord.xy-resolution.xy/2.;float h=sqrt(3.)/4.*r;gl_FragColor=vec4(length(p+vec2(r/2.,h))<r&&length(p+vec2(-r/2.,h))<r&&length(p-vec2(0.,h))<r);}

Experimente aqui

Bônus

  • O raio pode ser definido alterando a rvariável
  • A largura do triângulo está em pixels, conforme solicitado (você deve fazer o zoom ser definido como 1x na caixa de areia GLSL).
tigrou
fonte
O GLSL tem um método de entrada padrão que você poderia usar?
darrylyeo
No glslsandbox, é possível obter a posição do cursor do mouse. Isso pode ser usado para controlar o raio do triângulo (por exemplo: raio seria a distância do mouse do centro).
usar o seguinte
2

JavaScript (ES6) + HTML, 196 + 13 = 209 bytes

Usa uma abordagem baseada em caminho em vez de uma abordagem de preenchimento de pixels.

r=>{c.width=c.height=r*2
with(Math)with(c.getContext`2d`)scale(e=r*.578,e),beginPath(a=s=>s*PI/3),moveTo(2,1),[2,4,6].map(s=>arcTo(cos(i=a(s-1))+1,sin(i)+1,cos(j=a(s))+1,sin(j)+1,sqrt(3))),fill()}

<canvas id=c>

darrylyeo
fonte
2

Logotipo, 53 bytes

to t :r filled 0[repeat 3[arc 60 :r fd :r rt 120]]end

usa o filledcomando para preencher a forma na cor 0 (preto.) O código nos colchetes externos é executado sem que nenhuma linha seja desenhada, mas o Logo acompanha os movimentos da tartaruga e preenche a forma assim que o colchete é retirado.

Logotipo, 64 61 bytes

to t :r repeat 3[pd arc 60 :r pu fd :r rt 120]fd 9 fill end

Pen Down, desenhe um arco de 60 graus com a tartaruga no centro, Pen Up, mova a caneta para o início do arco, gire 120 graus.

Repita 3 vezes, depois mova-se para dentro da forma e preencha-a.

Tente em http://turtleacademy.com/playground/en

Ligar como cs ht t 100(limpar a tela, ocultar a tartaruga, tcom r = 100).

Level River St
fonte
2

MATL , 35 bytes

9Bo&ZQ*3X^/G_G&:t!J*+8L&!-|G<A&e0YG

Isso produz um arquivo chamado image.png. Para entrada r, o tamanho da imagem é 2*r+1e a largura do triângulo é rconforme necessário.

Experimente no MATL Online! O intérprete online abre automaticamente o arquivo criado e exibe a imagem com escala arbitrária; clique nele para obter a versão em tamanho real.

Como alternativa, aqui estão dois exemplos de saídas do compilador offline em execução no Matlab, com entradas 50e 100. A última parte do código 0YGfoi substituída por IYGpara que a figura seja exibida diretamente (com o tamanho certo) em vez de gravada em um arquivo.

insira a descrição da imagem aqui

Explicação

9B      % Push 9 in binary: [1 0 0 1] with logical values
o       % Convert to double
&ZQ     % Roots of polynomial with coefficients [1 0 0 1], as a 3×1 column vector
*       % Multiply by implicit input r
3X^/    % Divide by sqrt(3). This gives a 3×1 vector with the circle centers
G_G&:   % Push row vector [-r -r+1 ... r-1 r], with size 1×(2*r+1)
t!J*    % Duplicate, transpose, multiply by 1j
+       % Add with broadcast. This gives a (2*r+1)×(2*r+1) 2D-array of complex
        % numbers, which defines the pixel grid
8L      % Push [3 1 2]
&!      % Permute dimensions as indicated. This gives a 1×(2*r+1)×(2*r+1) 3D-array
-|      % Subtract with broadcast. Absolute value. This gives a 3×(2*r+1)×(2*r+1)
        % 3D-array with the distance from each circle center to each grid point
G<      % Less than r? Gives a 3×(2*r+1)×(2*r+1) 3D-array containing true or false
A       % All: this gives a 1×(2*r+1)×(2*r+1) array containing true for
        % columns of the original 3D-array that contained all true values
&e      % Squeeze the first singleton dimension to give a (2*r+1)×(2*r+1) 2D-array
0YG     % Save as image file with default file name
Luis Mendo
fonte
2

JavaScript (ES6) + SVG (HTML5), 28 + 102 = 130 bytes

f=
n=>s.setAttribute('width',n)
<input type=number value=82 oninput=f(this.value)><br>
<svg id=s width=82 viewbox=0,0,82,82><path d=M0,71a82,82,0,0,0,82,0A82,82,0,0,0,41,0A82,82,0,0,0,0,71>

A contagem de bytes exclui o código necessário para a entrada conveniente do usuário do tamanho desejado.

Neil
fonte
Inteligente! n=>s.style.width=nfuncionaria também.
darrylyeo
Não consigo descobrir como você chegou aos 112 bytes.
darrylyeo
@ Darrylyeo Essa sugestão não funcionou para mim, desculpe, mas concordo com a contagem de bytes, também não consigo descobrir como cheguei a ela.
Neil
Hmm, provavelmente só funciona no Chrome.
darrylyeo
1

MetaPost ( 242 226 bytes)

outputtemplate:="%j-%c.ps";
prologues:=1
beginfig(1);
 len:=1cm;
 path p[];
 p[1]:=len * dir -30 {dir 90} .. len * dir  90;
 p[2]:=p[1] rotated 120;
 p[3]:=p[1] rotated 240;
 fill p[1] -- p[2] -- p[3] -- cycle;
endfig;
end.

Pode ser possível reduzir um pouco isso, sou novo no metapost.

Carel
fonte
Fiquei um pouco preguiçoso e usei a contagem de bytes dos editores de texto. Eu não sabia que você poderia remover os dois pontos, obrigado. Eu literalmente tenho uma hora de MetaPost agora mesmo ^ _ ^
Carel
1
Ainda conto 223, não 226. Além disso, você pode remover os espaços len * dire o ponto no final?
Rɪᴋᴇʀ
1

k, 141 100 98 bytes

s:*/2#;l:2*r:.:0:`
`0:(,"P1")," "/'$(,l,l),&/{(s'n+x)</:(s r)-s'y+n:r-!l}./:r*%(0 0;4 0;1 3)%4
\\

A entrada é retirada stdin, a saída é stderr(ou stdindepende do intérprete) no pgmformato. Por exemplo:

Exemplo do programa funcionando.

Explicação:

s:*/2#               /set s to a squaring function
r:.:0:`              /get user input, set to r
l:2*                 /width/height is 2 times r
r*%(0 0;4 0;1 3)%4   /the coordinates of circle centers
{ }./:               /for each coordinate pair (x, y) get a circle
                     /function to get a circle:
n:r-!l               /  set n to {r, r-1, ..., -(r-1)}
(s'n+x)</:(s r)-s'y+ /  use b^2<r^2-a^2 on all points to get a circle
                     /  where x and y shift the circle right and down
&/                   /get intersections of circles (fold binary and)
(,l,l),              /prepend height and width for PGM format
" "/'$               /convert to string, add spaces
(,"P1"),             /prepend PGM header
`0:                  /output to stderr
\\                   /exit
zgrep
fonte
0

05AB1E , 66 bytes

’)
¨€(ÿ,60)
lt(60’Ð’€š éà £Ø*
ht()
ï…_œã(ÿÿÿ)
„–_œã()
„ˆ 1:ht()’.e

Não é possível usar o TIO, pois ele abre uma janela e desenha o triângulo de Reuleaux lá.

Solicita entrada e, em seguida, abre uma janela de tartaruga Python desenhando o triângulo.

A resposta de Jonathan Allan me deu a inspiração para fazer isso, embora eu tenha alterado um pouco o código dele.

Essencialmente, essa é uma combinação dos recursos de compactação do 05AB1E e da facilidade de gráficos de tartarugas do Python.

Erik, o Outgolfer
fonte
0

OpenSCAD , 91 bytes

module t(r){intersection_for(t=[0,120,240]){rotate(t)translate([r/sqrt(3),0,0])circle(r);}}

Não tenho certeza de quão kosher é isso, pois os pixels não são realmente uma unidade bem definida em nenhum formato de grade de malha que eu conheça. Em vez disso, o módulo tdesenha um triângulo de reuleaux de determinado raio rem quaisquer unidades nativas que estejam em uso.

Exemplo de saída de visualização para t(100): t (100)

Julian Wolf
fonte
0

SmileBASIC, 87 86 85 83 82 81 79 78 77 76 75 bytes

INPUT R
C.5Y=R*.87C 1C.GPAINT.,0DEF C X
A=X*240GCIRCLE R*X,Y+2,R,A-60,A
END

Ungolfed:

INPUT RADIUS
CIRCLE 0.5
Y=RADIUS*(SQR(3)/2)
CIRCLE 1
CIRCLE 0
GPAINT 0,0
DEF CIRCLE X
 ANGLE=X*240
 GCIRCLE RADIUS*X,Y+2,RADIUS,ANGLE-60,ANGLE
END
12Me21
fonte