Dessinez un triangle de Reuleaux!


27

Le triangle de Reuleaux est la forme formée par l'intersection de trois cercles, chaque cercle passant par les centres des autres. Quelle que soit la rotation, la largeur d'un triangle de Reuleaux sera toujours égale au rayon des cercles:

De Wolfram MathWorld

Image: Wolfram MathWorld

Écrivez un programme qui prend une largeur ren entrée et affiche un triangle de Reuleaux de cette largeur (en pixels).

Vous devez afficher la forme de manière isolée, c'est-à-dire pleine, sans contour et sur fond plein.

- Le programme le plus court en octets gagne.


1
Le rayon doit-il rêtre en pixels ou simplement un facteur d'échelle?
Karl Napf

@Karl Napf Pixels.
darrylyeo

Pouvons-nous sortir quelque chose vers STDOUT, tant que nous dessinons correctement le triangle de Reuleaux?
Erik the Outgolfer

@EriktheOutgolfer C'est très bien.
darrylyeo

Réponses:


21

JavaScript + HTML, 164158 + 13 = 171 octets

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>

Je ne sais pas pourquoi j'aime répondre à ces défis de dessin mathématique avec <canvas>autant ...


13

Love2D, 320 octets.

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

Probablement pas la solution optimale, il utilise les pochoirs de Love2D, en mettant en place les 3 cercles et en remplissant là où ils se croisent.

Appelez via la ligne de commande, comme love tri.love 256

Exemple de sortie


5
C'est assez beau
ATaco

10

Python 2 , 111 octets

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

exemple d'exécution


9

Mathematica 101 100 98 octets

Adopter une approche différente de @MichaelSeifert, et probablement l'interpréter un peu plus littéralement en ce qui concerne la clause 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/#}]&

Exemple d'utilisation:

%@10

10 pixels Image 10 pixels

50 pixels Image de 50 pixels

100 pixels Image de 100 pixels

Sauvegardé un octet grâce à @MartinEnder (notation infixe) et 2 autres octets en définissant d.


6

PHP + SVG, 165 octets

<?$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'/>";

Exemple de sortie pour l'entrée 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'/>


6

PostScript, 96 86 85 75 73 72 octets

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

Prend l'entrée en tant que valeur sur la pile. ^^et ^@représentent des caractères de contrôle littéraux. (^@^^Z<^@Z<)est la chaîne de caractères avec les points de code 0, 30, 90, 60, 0, 90 et 60, respectivement. Ceux-ci sont ensuite interprétés comme des angles en degrés, car c'est évidemment à cela que servent les points de code.

10 octets enregistrés car il closepathn'est pas nécessaire (à la fois clipet fillfermez implicitement le chemin).

1 octet enregistré en utilisant repeatau lieu de définir une fonction.

10 octets enregistrés en passant à une approche complètement différente.

Enregistré 2 octets en faisant des tours avec la pile.

1 octet enregistré en utilisant 0 1 2{}forau lieu de 3{}repeat.


5

Mathematica, 134 131 octets

NB Cette solution n'est plus valable, car la question a été modifiée par la suite pour exiger que r soit mesuré en pixels. Merci à Martin Ender de m'avoir aidé à raser quelques octets dans les commentaires.

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]

entrez la description de l'image ici

La valeur d'entrée doit être mise à l'échelle entre 0 et 1 pour que ce code fonctionne. Notez que près d'un quart de ce code est nécessaire pour afficher la forme "isolément", car ce n'est pas la valeur par défaut de Mathematica.


3
Bienvenue chez PPCG! r Exp[2 I Pi n/3]peut être Exp[2I n/3Pi]rde sauver quelques espaces. Et il est généralement plus court d'écrire une fonction sans nom, c'est-à-dire de supprimer r=Input[];, de remplacer rpar #et d'ajouter a &.
Martin Ender

Je pense que l'entrée doit être des pixels, pas un facteur d'échelle.
internet_user

1
@pycoder: Oui, cette contrainte a été modifiée après la publication de ma solution.
Michael Seifert

4

BBC BASIC, 58 octets

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

Téléchargez l'interprète sur http://www.bbcbasic.co.uk/bbcwin/download.html

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

Wow, c'est pratiquement une fonction intégrée!
Neil

4

TeX / TikZ, 128 121 112 octets

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

Le code est basé sur cette réponse à TeX.se .

TeX est basé sur des vecteurs, donc ne fait pas de pixels. Le rayon est un flottant avec un maximum d'environ 15 avant qu'il ne touche le bord de la page. Il n'est pas non plus vraiment conçu pour la saisie en ligne de commande, donc doit être exécuté en tant que

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

où le code ci-dessus est enregistré dans rt.tex


Quelques conseils pour raccourcir la durée: vous n'avez besoin d'aucune nouvelle ligne; vous n'avez pas besoin .tex; \footline{}est tout aussi bon que \nopagenumbers; utiliser ~comme nom de variable au lieu de \i. Pour satisfaire l'exigence de «pixel», vous pouvez utiliser \r sp; 1sp est le genre d'équivalent à un pixel pour TeX car c'est le meilleur emplacement que TeX puisse gérer (je ne sais pas si cela s'applique à tikz cependant).
Gilles 'SO- arrête d'être méchant'

@Gilles Je ne peux rien obtenir spmais je pense que ptc'est une bonne idée. Toutes vos autres idées ont fonctionné (certaines n'avaient pas semblé le faire dans mes tests). Merci
Chris H

Vous pouvez supprimer l'espace après ~pour enregistrer un octet de plus. \input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~in{1,2,3}{[rotate=~*120]arc(0:60:\r sp)};\byetravaille pour moi. Essayez pdftex "\def\r{2000000} \input rt.tex"- à 2sp de trouver la forme visuellement serait difficile compte tenu de sa petite taille.
Gilles 'SO- arrête d'être méchant'

@Gilles, je dois admettre que je ne suis allé jusqu'à 20000 sp.
Chris H

1
1pt = 65536sp donc 20000sp est encore minuscule.
Gilles 'SO- arrête d'être méchant'

3

GLSL, 298 229 caractères

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

Essayez-le ici

Prime

  • Le rayon peut être réglé en changeant la rvariable
  • La largeur du triangle est en pixels comme demandé (vous devez faire le zoom est réglé à 1x dans le bac à sable GLSL).

GLSL a-t-il une méthode d'entrée standard que vous pourriez utiliser?
darrylyeo

Dans glslsandbox, il est possible d'obtenir la position du curseur de la souris. Cela pourrait être utilisé pour contrôler le rayon du triangle (par exemple: le rayon serait la distance de la souris au centre).
tigrou

2

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

Utilise une approche basée sur le chemin au lieu d'une approche de remplissage 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>


2

Logo, 53 octets

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

utilise la filledcommande pour remplir la forme en couleur 0 (noir.) Le code dans les crochets extérieurs est exécuté sans qu'aucune ligne ne soit dessinée, mais Logo garde une trace des mouvements de la tortue et remplit la forme une fois que le crochet est quitté.

Logo, 64 61 octets

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

Pen Down, dessinez un arc de 60 degrés avec la tortue au centre, Pen Up, déplacez le stylo au début de l'arc, tournez à 120 degrés.

Répétez 3 fois, puis déplacez-vous à l'intérieur de la forme et remplissez-la.

Essayez à http://turtleacademy.com/playground/en

Appelez comme cs ht t 100(écran clair, cachez la tortue, tavec r = 100.)


2

MATL , 35 octets

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

Cela produit un fichier appelé image.png. Pour la saisie r, la taille de l'image est 2*r+1et la largeur du triangle est rtelle que requise.

Essayez-le sur MATL Online! L'interpréteur en ligne ouvre automatiquement le fichier créé et affiche l'image avec une mise à l'échelle arbitraire; cliquez dessus pour obtenir la version réelle.

Alternativement, voici deux exemples de sorties du compilateur hors ligne fonctionnant sur Matlab, avec les entrées 50et 100. La dernière partie du code 0YGa été remplacée par IYGafin que la figure soit directement affichée (avec la bonne taille) au lieu d'être écrite dans un fichier.

entrez la description de l'image ici

Explication

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

2

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

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>

Le nombre d'octets exclut le code nécessaire pour une entrée utilisateur pratique de la taille souhaitée.


Intelligent! n=>s.style.width=nfonctionnerait aussi.
darrylyeo

Je n'arrive pas à comprendre comment vous êtes arrivé à 112 octets.
darrylyeo

@darrylyeo Cette suggestion n'a pas fonctionné pour moi, désolé, mais je suis d'accord sur le nombre d'octets, je ne peux pas non plus comprendre comment j'y suis arrivé.
Neil

Hmm, ne fonctionne probablement que dans Chrome.
darrylyeo

1

MetaPost ( 242 226 octets)

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.

Il peut être possible de réduire quelque peu cela, je suis nouveau sur metapost.


J'étais un peu paresseux et j'ai utilisé le nombre d'octets des éditeurs de texte. Je ne savais pas que vous pouviez retirer les deux points, merci. J'ai littéralement une heure de MetaPost sous la ceinture maintenant ^ _ ^
Carel

1
Je compte toujours 223, pas 226. Aussi, pouvez-vous supprimer les espaces len * diret le point à la fin?
Rɪᴋᴇʀ

1

k, 141 100 98 octets

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

L'entrée est prise stdin, la sortie est stderr(ou stdinselon l'interpréteur) au pgmformat. Par exemple:

Exemple de fonctionnement du programme.

Explication:

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

0

05AB1E , 66 octets

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

Impossible d'utiliser TIO, car il ouvre une fenêtre et y dessine le triangle de Reuleaux.

Demande l'entrée, puis ouvre une fenêtre de tortue Python dessinant le triangle.

La réponse de Jonathan Allan m'a donné l'inspiration pour le faire, même si j'ai légèrement modifié son code.

Essentiellement, il s'agit d'une combinaison des capacités de compression de 05AB1E et de la facilité d'utilisation des graphiques de tortue par Python.


0

OpenSCAD , 91 octets

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

Je ne sais pas à quel point cela est casher, car les pixels ne sont pas vraiment une unité bien définie dans les formats de grille de maillage que je connaisse. Au lieu de cela, le module tdessine un triangle de Reuleaux de rayon donné rdans toutes les unités natives utilisées.

Exemple de sortie d'aperçu pour t(100): t (100)


0

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

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

Non 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.