ルーローの三角形を描きます!


27

ルーローの三角形は、各円は他人の中心を通ると、3つの円の交差によって形成される形状です。回転に関係なく、ルーローの三角形の幅は常に円の半径に等しくなります。

Wolfram MathWorldから

画像:Wolfram MathWorld

r入力として幅を取り、その幅のReuleaux三角形(ピクセル単位)を表示するプログラムを作成します。

図形を分離して表示する必要があります。つまり、塗りつぶし、ストロークなし、塗りつぶしの背景の上に表示する必要があります。

golf-バイト単位の最短プログラムが勝ちます。


1
半径rはピクセル単位ですか、それともスケーリングファクターですか?
カールナップ

@Karl Napf Pixels。
-darrylyeo

ルーローの三角形を適切に描画する限り、STDOUTに何かを出力できますか?
エリックアウトゴルファー

@EriktheOutgolferそれは結構です。
-darrylyeo

回答:


21

JavaScript + HTML、164158 + 13 = 171バイト

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>

私はなぜこれらのマチの描画の課題に<canvas>そんなに答えることを楽しむのか分かりません...


13

Love2D、320バイト。

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

おそらく最適なソリューションではありません。Love2Dのステンシルを使用して、3つの円を設定し、それらが交差する場所を埋めます。

次のようなコマンドラインから呼び出します love tri.love 256

出力例


5
とても素敵です
-ATaco


9

Mathematica 101 100 98のバイト

@MichaelSeifertとは異なるアプローチを取り、おそらくこれをピクセル句に関してもう少し文字通りに解釈します。

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

使用例:

%@10

10ピクセル 10 pixel image

50ピクセル 50 pixel image

100ピクセル 100 pixel image

@MartinEnder(中置記法)のおかげで1バイト、dを定義してさらに2バイト節約しました。


6

PHP + SVG、165バイト

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

入力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バイト

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

スタック上の値として入力を受け取ります。リテラル制御文字^^^@表します。(^@^^Z<^@Z<)それぞれ0、30、90、60、0、90、および60のコードポイントを持つ文字列です。これらは、角度の角度として解釈されます。これは明らかにコードポイントの目的であるためです。

closepath不要なため(パスclipfill暗黙的に両方とも)10バイト節約しました。

を使用して1バイトを保存しました repeat関数を定義する代わりに。

まったく異なるアプローチに切り替えることで10バイトを節約しました。

スタックでトリックを行うことで2バイトを節約しました。

0 1 2{}for代わりにを使用して1バイトを保存しました3{}repeat


5

Mathematica、134 131バイト

NBこのソリューションは、rをピクセル単位で測定するように後で編集されたため、もはや有効ではありません。コメントの数バイトを削ってくれたMartin Enderに感謝します。

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

このコードを機能させるには、入力値を0〜1の間でスケーリングする必要があります。形状を「分離して」表示するには、このコードのほぼ4分の1が必要です。これはMathematicaのデフォルトではないためです。


3
PPCGへようこそ!いくつかのスペースを節約r Exp[2 I Pi n/3]することができExp[2I n/3Pi]rます。そして、それはドロップすなわち、無名の関数を記述するために一般的に短いですr=Input[];、交換するr#して追加します&
マーティンエンダー

入力はスケーリングファクターではなくピクセルである必要があると思います。
internet_user

1
@pycoder:はい、その制約はソリューションを投稿した後に編集されました。
マイケルサイフェルト

4

BBC BASIC、58バイト

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

http://www.bbcbasic.co.uk/bbcwin/download.htmlからインタープリターをダウンロードします

非ゴルフ

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.

うわー、それは実際にはビルトインです!
ニール

4

TeX / TikZ、128 121 112バイト

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

コードはTeX.seのこの回答に基づいています

TeXはベクターベースであるため、ピクセルを実行しません。半径は、ページの端に到達する前の最大約15の浮動小数点数です。また、実際にはコマンドライン入力用に構築されていないため、次のように実行する必要があります。

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

上記のコードが保存されている場所 rt.tex


これを短くするためのいくつかのヒント:改行は必要ありません。必要ありません.tex\footline{}と同じくらい良い\nopagenumbersです。の~代わりに変数名として使用します\i。「ピクセル」要件を満たすために、次を使用できます\r sp。1spは、TeXが管理できる最高の場所であるため、TeXのピクセルに相当します(tikzに適用されるかどうかはわかりません)。
ジル 'SO-悪であるのをやめる'

@Gilles私は何も得ることができませんspが、私ptは良いアイデアだと思います。他のすべてのアイデアは機能しました(私のテストではそうではなかったようです)。ありがとう
クリスH

~あとでスペースを削除して、もう1バイト節約できます。\input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~in{1,2,3}{[rotate=~*120]arc(0:60:\r sp)};\bye私のために働く。試してみてくださいpdftex "\def\r{2000000} \input rt.tex"-2spでは、形状がどれほど小さいのかを視覚的に見つけることは困難です。
ジル 'SO-悪であるのをやめる'

@Gilles私は20000 spまでしか行かないことを認めなければなりません。
クリスH

1
1pt = 65536spなので、20000spはまだ小さいです。
ジル 'SO-悪であるのをやめる'

3

GLSL、298 229文字

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

ここで試してみてください

ボーナス

  • r変数を変更することで半径を設定できます
  • 三角形の幅は、要求に応じてピクセル単位です(GLSLサンドボックスでズームを1倍に設定する必要があります)。

GLSLには、使用できる標準入力メソッドがありますか?
-darrylyeo

glslsandboxでは、マウスカーソルの位置を取得できます。これを使用して、三角形の半径を制御できます(例:半径は、マウスの中心からの距離になります)。
tigrou

2

JavaScript(ES6)+ HTML、196 + 13 = 209バイト

ピクセル充填アプローチの代わりにパスベースのアプローチを使用します。

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

ロゴ、53バイト

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

を使用します filledコマンドをてシェイプをカラー0(黒)で塗りつぶします。外側の角かっこ内のコードは線を描画せずに実行されますが、ロゴはカメの動きを追跡し、ブラケットが終了すると形状を塗りつぶします。

ロゴ、64 61バイト

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

ペンダウン、亀を中心に60度の弧を描き、ペンアップ、ペンを弧の開始点に移動、120度回転。

3回繰り返してから、図形内を移動して塗りつぶします。

http://turtleacademy.com/playground/enでお試しください

次のように呼び出しcs ht t 100ます(画面をクリアし、タートルを非表示にtし、r = 100を使用します)。


2

MATL、35バイト

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

これにより、というファイルが生成されimage.pngます。入力のr場合、画像のサイズは2*r+1で、三角形の幅はr必要に応じてです。

MATL Online試しくださいオンラインインタープリターは作成されたファイルを自動的に開き、任意のスケーリングで画像を表示します。それをクリックして、実際のサイズのバージョンを取得します。

または、Matlabで実行されるオフラインコンパイラからの2つの出力例が50あり、入力とがあり 100ます。コードの最後の部分0YGが置き換えられIYG、図がファイルに書き込まれる代わりに(適切なサイズで)直接表示されるようになりました。

ここに画像の説明を入力してください

説明

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バイト

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>

バイトカウントには、目的のサイズの便利なユーザー入力に必要なコードは含まれません。


賢い!n=>s.style.width=nまた動作します。
-darrylyeo

112バイトになった経緯を理解できないようです。
-darrylyeo

@darrylyeoこの提案はうまくいきませんでした、申し訳ありませんが、バイトカウントについては同意します。
ニール

うーん、おそらくChromeでのみ動作します。
-darrylyeo

1

MetaPost(242 226バイト)

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.

これをいくらか減らすことができるかもしれません、私はメタポストが初めてです。


私は少し怠けていて、テキストエディターのバイトカウントを使用しました。コロンを削除できるとは知りませんでした、ありがとう。私は文字通り1時間のMetaPostをベルトの下に持っています^ _ ^
Carel

1
私はまだ226ではなく223を数えます。また、len * dir最後のスペースとドットを削除できますか?
Rɪᴋᴇʀ

1

k、141 100 98バイト

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

入力はから取得されstdin、出力はstderr(またはstdinインタープリターに応じて)pgm形式です。例えば:

プログラムの動作例。

説明:

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バイト

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

TIOを使用できません。ウィンドウを開き、そこにルーローの三角形を描画します。

入力を求めてから、三角形を描くPythonタートルウィンドウを開きます。

Jonathan Allanの答えは、これを行うためのインスピレーションを与えてくれましたが、彼のコードを少し変更しました。

基本的に、これは05AB1Eの圧縮機能とPythonのタートルグラフィックの使いやすさの組み合わせです。


0

OpenSCAD、91バイト

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

ピクセルは、私が知っているメッシュグリッド形式では、明確に定義された単位ではないため、これがどれほど良いかはわかりません。代わりに、モジュールtは指定された半径のルーロー三角形を描画しますrは、使用されているネイティブユニットが何であれします。

次のプレビュー出力のサンプルt(100)t(100)


0

SmileBASIC、87 86 85 83 82 81 79 78 77 76 75バイト

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

ゴルフをしていない:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.