Zeichne ein Reuleaux-Dreieck!

27

Das Reuleaux-Dreieck ist die Form, die durch den Schnitt von drei Kreisen gebildet wird, wobei jeder Kreis durch die Zentren der anderen verläuft. Unabhängig von der Drehung entspricht die Breite eines Reuleaux-Dreiecks immer dem Radius der Kreise:

Von Wolfram MathWorld

Bild: Wolfram MathWorld

Schreiben Sie ein Programm, das eine Breite rals Eingabe verwendet und ein Reuleaux-Dreieck dieser Breite (in Pixel) anzeigt.

Sie müssen die Form isoliert anzeigen, dh gefüllt, ungestrichen und vor einem gefüllten Hintergrund.

- Kürzestes Programm in Bytes gewinnt.

darrylyeo
quelle
1
Sollte der Radius rin Pixel oder nur ein Skalierungsfaktor sein?
Karl Napf
@ Karl Napf Pixel.
darrylyeo
Können wir irgendetwas an STDOUT ausgeben, solange wir das Reuleaux-Dreieck korrekt zeichnen?
Erik der Outgolfer
@EriktheOutgolfer Das ist in Ordnung.
darrylyeo

Antworten:

21

JavaScript + HTML, 164 158 + 13 = 171 Byte

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>

Ich weiß nicht, warum es mir Spaß macht, diese mathematischen Zeichenherausforderungen <canvas>so oft zu beantworten ...

ETHproductions
quelle
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

Wahrscheinlich nicht die optimale Lösung, es werden Love2D-Schablonen verwendet, die die 3 Kreise aufbauen und dort ausfüllen, wo sie sich schneiden.

Rufen Sie über die Kommandozeile an, wie love tri.love 256

Beispielausgabe

Ein Taco
quelle
5
Es ist sehr schön
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()

example run

Jonathan Allan
quelle
9

Mathematica 101 100 98 Bytes

Gehen Sie anders vor als bei @MichaelSeifert und interpretieren Sie dies in Bezug auf die Pixel-Klausel wahrscheinlich ein wenig wörtlicher:

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

Anwendungsbeispiel:

%@10

10 Pixel 10 pixel image

50 Pixel 50 pixel image

100 Pixel 100 pixel image

Speichert ein Byte dank @MartinEnder (Infixnotation) und weitere 2 Bytes durch Definieren von d.

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

Beispielausgabe für Eingabe 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
quelle
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

Übernimmt die Eingabe als Wert auf dem Stapel. ^^und ^@stellen wörtliche Steuerzeichen dar.(^@^^Z<^@Z<)ist die Zeichenfolge mit den Codepunkten 0, 30, 90, 60, 0, 90 bzw. 60. Diese werden dann als Winkel in Grad interpretiert, denn dafür sind offenbar Codepunkte.

10 Bytes gespart, da closepathnicht erforderlich (sowohl clipals auchfill implizit den Pfad schließen).

1 Byte mit gespeichert repeat indem eine Funktion definiert wird.

10 Bytes gespart durch Umstellung auf einen völlig anderen Ansatz.

2 Bytes gespart durch Tricks mit dem Stack.

1 Byte mit 0 1 2{}foranstelle von gespeichert 3{}repeat.

Grimmig
quelle
5

Mathematica, 134 131 Bytes

Hinweis: Diese Lösung ist nicht mehr gültig, da die Frage später so bearbeitet wurde, dass r in Pixeln gemessen werden muss. Vielen Dank an Martin Ender, der mir geholfen hat, ein paar Bytes in den Kommentaren zu entfernen.

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]

enter image description here

Der Eingabewert muss zwischen 0 und 1 skaliert werden, damit dieser Code funktioniert. Beachten Sie, dass fast ein Viertel dieses Codes erforderlich ist, um die Form "isoliert" anzuzeigen, da dies nicht die Standardeinstellung von Mathematica ist.

Michael Seifert
quelle
3
Willkommen bei PPCG! r Exp[2 I Pi n/3]kann sein Exp[2I n/3Pi]r, einige Leerzeichen zu sparen. Und es ist in der Regel kürzer eine unbenannte Funktion zu schreiben, also fallen die r=Input[];, ersetzen Sie rmit #und ein anhängen &.
Martin Ender
Ich denke, die Eingabe muss Pixel sein, kein Skalierungsfaktor.
internet_user
1
@pycoder: Ja, diese Einschränkung wurde bearbeitet, nachdem ich meine Lösung gepostet habe.
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.

Laden Sie den Interpreter unter http://www.bbcbasic.co.uk/bbcwin/download.html herunter

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
quelle
Wow, das ist praktisch eingebaut!
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

Der Code basiert auf dieser Antwort bei TeX.se .

TeX ist vektorbasiert, Pixel also nicht. Der Radius ist ein Gleitkomma mit maximal 15 Zeichen, bevor er den Seitenrand berührt. Es ist auch nicht wirklich für die Kommandozeilen-Eingabe gedacht, muss also als ausgeführt werden

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

wo der obige Code gespeichert ist rt.tex

Chris H
quelle
Ein paar Tipps, um dies zu verkürzen: Sie brauchen keine der Zeilenumbrüche; du brauchst nicht .tex; \footline{}ist genauso gut wie \nopagenumbers; Verwenden Sie ~als Variablennamen anstelle von \i. Um die "Pixel" -Anforderung zu erfüllen, können Sie verwenden \r sp; 1sp ist die Art von Äquivalent zu einem Pixel für TeX, da es der beste Ort ist, den TeX verwalten kann (ich weiß jedoch nicht, ob es für Tikz gilt).
Gilles 'SO - hör auf böse zu sein'
@ Gilles Ich kann nichts damit anfangen, spaber ich denke, das ptist eine gute Idee. Alle Ihre anderen Ideen funktionierten (einige schienen in meinen Tests nicht zu sein). Vielen Dank
Chris H
Sie können den Platz danach entfernen ~, um ein weiteres Byte zu speichern. \input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~in{1,2,3}{[rotate=~*120]arc(0:60:\r sp)};\byefunktioniert bei mir. Probieren Sie es aus pdftex "\def\r{2000000} \input rt.tex"- bei 2sp ist es schwierig, die Form visuell zu finden, wenn man bedenkt, wie klein sie ist.
Gilles 'SO - hör auf, böse zu sein'
@ Gilles Ich muss zugeben, ich ging nur bis zu 20000 sp.
Chris H
1
1pt = 65536sp, also sind 20000sp immer noch winzig.
Gilles 'SO- hör auf böse zu sein'
3

GLSL, 298 229 Zeichen

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

Probieren Sie es hier aus

Bonus

  • Der Radius kann durch Ändern eingestellt werden r Variablen eingestellt werden
  • Die Dreiecksbreite wird wie gewünscht in Pixel angegeben (Sie müssen den Zoom in der GLSL-Sandbox auf 1x einstellen).
tigrou
quelle
Verfügt GLSL über eine Standardeingabemethode, die Sie verwenden können?
darrylyeo
In glslsandbox ist es möglich, die Position des Mauszeigers abzurufen. Dies könnte verwendet werden, um den Radius des Dreiecks zu steuern (zB: Der Radius entspricht dem Abstand der Maus vom Mittelpunkt).
Tigrou
2

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

Verwendet einen pfadbasierten Ansatz anstelle eines pixelfüllenden Ansatzes.

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

Logo, 53 Bytes

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

verwendet die filledFüllt die Form Befehl in Farbe 0 (Schwarz). Der Code in den äußeren eckigen Klammern wird ausgeführt, ohne dass eine Linie gezeichnet wird, aber Logo verfolgt die Bewegungen der Schildkröten und füllt die Form aus, sobald die Klammer verlassen wird.

Logo, 64 61 Bytes

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

Stift nach unten, 60-Grad-Bogen mit Schildkröte in der Mitte zeichnen, Stift nach oben, Stift zum Bogenanfang bewegen, 120 Grad drehen.

Wiederholen Sie dies dreimal, bewegen Sie sich dann in die Form und füllen Sie sie aus.

Versuchen Sie es unter http://turtleacademy.com/playground/en

Rufe wie cs ht t 100(Bildschirm löschen, Schildkröte verstecken, tmit r = 100.)

Level River St
quelle
2

MATL , 35 Bytes

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

Dies erzeugt eine Datei namens image.png. Für die Eingabe rist die Größe des Bildes 2*r+1und die Breite des Dreiecks rwie erforderlich.

Probieren Sie es bei MATL Online! Der Online-Interpreter öffnet automatisch die erstellte Datei und zeigt das Bild in beliebiger Skalierung an. Klicken Sie darauf, um die aktuelle Version zu erhalten.

Alternativ dazu finden Sie hier zwei Beispielausgaben des auf Matlab ausgeführten Offline-Compilers mit Eingaben 50und 100. Der letzte Teil des Codes 0YGwurde ersetzt, IYGsodass die Figur direkt angezeigt wird (mit der richtigen Größe), anstatt in eine Datei geschrieben zu werden.

Bildbeschreibung hier eingeben

Erläuterung

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

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

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>

Die Byteanzahl schließt den Code aus, der für die bequeme Benutzereingabe der gewünschten Größe benötigt wird.

Neil
quelle
Klug! n=>s.style.width=nwürde auch funktionieren.
Darrylyeo
Ich kann nicht herausfinden, wie Sie auf 112 Bytes gekommen sind.
Darrylyeo
@darrylyeo Dieser Vorschlag hat bei mir leider nicht funktioniert, aber ich stimme der Anzahl der Bytes zu. Ich kann auch nicht herausfinden, wie ich dazu gekommen bin.
Neil
Hmm, funktioniert wahrscheinlich nur in 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 könnte möglich sein, dies etwas zu reduzieren. Ich bin neu bei Metapost.

Carel
quelle
Ich war etwas faul und habe die Byteanzahl des Texteditors verwendet. Ich wusste nicht, dass Sie die Doppelpunkte entfernen können, danke. Ich habe jetzt buchstäblich eine Stunde MetaPost im Gepäck ^ _ ^
Carel
1
Ich zähle immer noch 223, nicht 226. Können Sie auch die Leerzeichen len * dirund den Punkt am Ende entfernen ?
14.
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
\\

Die Eingabe erfolgt von stdin, die Ausgabe erfolgt stderr(oder stdinje nach Interpreter) im pgmFormat. Beispielsweise:

Beispiel für die Arbeitsweise des Programms.

Erläuterung:

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

05AB1E , 66 Bytes

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

TIO kann nicht verwendet werden, da es ein Fenster öffnet und dort das Reuleaux-Dreieck zeichnet.

Fordert zur Eingabe auf und öffnet dann ein Python-Turtle-Fenster, in dem das Dreieck gezeichnet wird.

Jonathan Allans Antwort hat mich dazu inspiriert, obwohl ich seinen Code ein wenig geändert habe.

Dies ist im Wesentlichen eine Kombination aus den Komprimierungsfunktionen von 05AB1E und der einfachen Turtle-Grafik von Python.

Erik der Outgolfer
quelle
0

OpenSCAD , 91 Byte

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

Ich bin mir nicht sicher, wie koscher das ist, da Pixel in den mir bekannten Mesh-Grid-Formaten keine wirklich gut definierte Einheit sind. Stattdessen zeichnet das Modul tein Regeldreieck mit einem bestimmten Radiusr in den jeweils verwendeten nativen Einheiten.

Beispielvorschau für t(100): t (100)

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