¡Dibuja un triángulo de Reuleaux!

27

El triángulo Reuleaux es la forma formada por la intersección de tres círculos, con cada círculo pasando por los centros de los demás. Independientemente de la rotación, el ancho de un triángulo Reuleaux siempre será igual al radio de los círculos:

De Wolfram MathWorld

Imagen: Wolfram MathWorld

Escriba un programa que tome un ancho rcomo entrada y muestre un triángulo Reuleaux de ese ancho (en píxeles).

Debe mostrar la forma de forma aislada, es decir, con relleno sólido, sin trazo y sobre un fondo con relleno sólido.

- El programa más corto en bytes gana.

Darrylyeo
fuente
1
¿Debería el radio rser en píxeles o solo algún factor de escala?
Karl Napf
@Karl Napf Pixels.
darrylyeo
¿Podemos enviar algo a STDOUT, siempre y cuando dibujemos el triángulo Reuleaux correctamente?
Erik the Outgolfer
@EriktheOutgolfer Eso está bien.
darrylyeo

Respuestas:

21

JavaScript + HTML, 164158 + 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>

No sé por qué disfruto respondiendo a estos desafíos de dibujo matemático con <canvas>tanto ...

ETHproducciones
fuente
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

Probablemente no sea la solución óptima, utiliza las plantillas de Love2D, configurando los 3 círculos y completando donde se cruzan.

Llame a través de la línea de comando, como love tri.love 256

Salida de ejemplo

Un taco
fuente
55
Es bastante encantador
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()

ejemplo ejecutado

Jonathan Allan
fuente
9

Mathematica 101 100 98 Bytes

Tomando un enfoque diferente que @MichaelSeifert, y probablemente interpretando esto un poco más literalmente con respecto a la cláusula de píxeles:

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

Ejemplo de uso:

%@10

10 píxeles Imagen de 10 píxeles

50 píxeles Imagen de 50 píxeles

100 píxeles Imagen de 100 píxeles

Se guardó un byte gracias a @MartinEnder (notación infija) y otros 2 bytes definiendo d.

Kelly Lowder
fuente
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'/>";

Ejemplo de salida para la 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
fuente
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

Toma la entrada como un valor en la pila. ^^y ^@representan caracteres de control literal. (^@^^Z<^@Z<)es la cadena de caracteres con los puntos de código 0, 30, 90, 60, 0, 90 y 60, respectivamente. Esos se interpretan entonces como ángulos en grados, porque obviamente para eso están los puntos de código.

Se guardaron 10 bytes porque closepathno es necesario (ambos clipe fillimplícitamente cierran la ruta).

Se guardó 1 byte usando en repeatlugar de definir una función.

Ahorró 10 bytes al cambiar a un enfoque completamente diferente.

Ahorró 2 bytes haciendo trucos con la pila.

Se guardó 1 byte usando en 0 1 2{}forlugar de 3{}repeat.

Mugriento
fuente
5

Mathematica, 134 131 bytes

Nota: esta solución ya no es válida, ya que la pregunta se editó posteriormente para exigir que r se midiera en píxeles. Gracias a Martin Ender por ayudarme a reducir algunos bytes en los comentarios.

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]

ingrese la descripción de la imagen aquí

El valor de entrada debe escalarse entre 0 y 1 para que este código funcione. Tenga en cuenta que se requiere casi una cuarta parte de este código para mostrar la forma "aisladamente", ya que este no es el valor predeterminado de Mathematica.

Michael Seifert
fuente
3
Bienvenido a PPCG! r Exp[2 I Pi n/3]puede ser Exp[2I n/3Pi]rpara ahorrar algunos espacios. Y generalmente es más corto escribir una función sin nombre, es decir, soltar r=Input[];, reemplazar rcon #y agregar a &.
Martin Ender
Creo que la entrada tiene que ser píxeles, no un factor de escala.
internet_user
1
@pycoder: Sí, esa restricción se editó después de que publiqué mi solución.
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.

Descargue el intérprete en http://www.bbcbasic.co.uk/bbcwin/download.html

Sin golf

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
fuente
¡Guau, eso es prácticamente una función!
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

El código se basa en esta respuesta al TeX.se .

TeX está basado en vectores, por lo que no tiene píxeles. El radio es flotante con un máximo de aproximadamente 15 antes de llegar al borde de la página. Tampoco está realmente construido para la entrada de línea de comandos, por lo que debe ejecutarse como

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

donde el código anterior se guarda en rt.tex

Chris H
fuente
Algunos consejos para acortar esto: no necesita ninguna de las nuevas líneas; no es necesario .tex; \footline{}es tan bueno como \nopagenumbers; usar ~como un nombre de variable en lugar de \i. Para satisfacer el requisito de "píxel", puede usar \r sp; 1sp es el equivalente a un píxel para TeX ya que es la mejor ubicación que TeX puede administrar (aunque no sé si se aplica a tikz).
Gilles 'SO- deja de ser malvado'
@Gilles No puedo obtener nada, sppero creo que ptes una buena idea. Todas sus otras ideas funcionaron (algunas no parecían funcionar en mis pruebas). Gracias
Chris H
Puede eliminar el espacio después ~para guardar un byte más. \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 mi. Intente pdftex "\def\r{2000000} \input rt.tex": a 2sp, encontrar la forma visualmente sería difícil dado lo pequeño que es.
Gilles 'SO- deja de ser malvado'
@Gilles Debo admitir que solo subí a 20000 sp.
Chris H
1
1pt = 65536sp, por lo que 20000sp sigue siendo pequeño.
Gilles 'SO- deja de ser malvado'
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);}

Pruébalo aquí

Prima

  • El radio se puede establecer cambiando la rvariable
  • El ancho del triángulo está en píxeles según lo solicitado (debe hacer que el zoom esté establecido en 1x en el sandbox GLSL)
tigrou
fuente
¿GLSL tiene un método de entrada estándar que pueda usar?
darrylyeo
En glslsandbox, es posible obtener la posición del cursor del mouse. Esto podría usarse para controlar el radio del triángulo (por ejemplo: el radio sería la distancia del mouse desde el centro).
tigrou
2

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

Utiliza un enfoque basado en rutas en lugar de un enfoque de relleno de píxeles.

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
fuente
2

Logo, 53 bytes

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

usa el filledcomando para rellenar la forma en color 0 (negro). El código en los corchetes exteriores se ejecuta sin dibujar ninguna línea, pero Logo realiza un seguimiento de los movimientos de la tortuga y rellena la forma una vez que se sale del corchete.

Logotipo, 64 61 bytes

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

Pluma hacia abajo, dibuje un arco de 60 grados con la tortuga en el centro, pluma hacia arriba, mueva la pluma al inicio del arco, gire 120 grados.

Repita 3 veces, luego muévase dentro de la forma y llénela.

Pruebe en http://turtleacademy.com/playground/en

Llamar como cs ht t 100(pantalla clara, ocultar tortuga, tcon r = 100).

Level River St
fuente
2

MATL , 35 bytes

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

Esto produce un archivo llamado image.png. Para la entrada r, el tamaño de la imagen es 2*r+1y el ancho del triángulo es el rrequerido.

¡Pruébalo en MATL Online! El intérprete en línea abre automáticamente el archivo creado y muestra la imagen con escala arbitraria; haga clic en él para obtener la versión en tamaño real.

Alternativamente, aquí hay dos resultados de ejemplo del compilador fuera de línea que se ejecuta en Matlab, con entradas 50y 100. La última parte del código 0YGha sido reemplazada por IYGpara que la figura se muestre directamente (con el tamaño correcto) en lugar de escribirse en un archivo.

ingrese la descripción de la imagen aquí

Explicación

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
fuente
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>

El recuento de bytes excluye el código necesario para la entrada conveniente del usuario del tamaño deseado.

Neil
fuente
¡Inteligente! n=>s.style.width=nfuncionaría también
darrylyeo
Parece que no puedo entender cómo llegaste a 112 bytes.
darrylyeo
@darrylyeo Esa sugerencia no funcionó para mí, lo siento, pero estoy de acuerdo con el recuento de bytes, tampoco puedo entender cómo llegué a ella.
Neil
Hmm, probablemente solo funciona en 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.

Es posible reducir esto un poco, soy nuevo en metapost.

Carel
fuente
Era un poco vago y usé el contador de bytes de los editores de texto. No sabía que podías eliminar los dos puntos, gracias. Literalmente tengo una hora de MetaPost en el cinturón ahora ^ _ ^
Carel
1
Todavía cuento 223, no 226. Además, ¿puedes eliminar los espacios len * diry el punto al 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
\\

La entrada se toma de stdin, la salida está stderr(o stdindepende del intérprete) en pgmformato. Por ejemplo:

Ejemplo del programa de trabajo.

Explicación:

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
fuente
0

05AB1E , 66 bytes

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

No se puede usar TIO, ya que abre una ventana y dibuja el triángulo Reuleaux allí.

Pide entrada, y luego abre una ventana de tortuga Python dibujando el triángulo.

La respuesta de Jonathan Allan me dio la inspiración para hacer esto, aunque modifiqué un poco su código.

Esencialmente, esta es una combinación de las capacidades de compresión de 05AB1E y la facilidad de gráficos de tortuga de Python.

Erik el Outgolfer
fuente
0

OpenSCAD , 91 bytes

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

No estoy seguro de cuán kosher es esto, ya que los píxeles no son realmente una unidad bien definida en ningún formato de cuadrícula de malla que yo sepa. En cambio, el módulo tdibuja un triángulo reuleaux de radio dado ren cualquier unidad nativa que esté en uso.

Ejemplo de salida de vista previa para t(100): t (100)

Julian Wolf
fuente
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

Sin golf:

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
fuente