Gambar Segitiga Reuleaux!

27

The Reuleaux segitiga adalah bentuk yang dibentuk oleh persimpangan tiga lingkaran, dengan masing-masing lingkaran yang melalui pusat-pusat yang lain. Terlepas dari rotasi, lebar segitiga Reuleaux akan selalu sama dengan jari-jari lingkaran:

Dari Wolfram MathWorld

Gambar: Wolfram MathWorld

Tulis program yang mengambil lebar rsebagai input dan menampilkan segitiga Reuleaux dengan lebar itu (dalam piksel).

Anda harus menampilkan bentuk secara terpisah, yaitu diisi penuh, tidak dibelai, dan di atas latar belakang yang terisi penuh.

- Program terpendek dalam byte yang menang.

Darrylyeo
sumber
1
Haruskah radiusnya rdalam piksel atau hanya beberapa faktor penskalaan?
Karl Napf
@Karl Napf Pixels.
darrylyeo
Bisakah kita mengeluarkan sesuatu ke STDOUT, selama kita menggambar segitiga Reuleaux dengan benar?
Erik the Outgolfer
@EriktheOutgolfer Tidak apa-apa.
darrylyeo

Jawaban:

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>

Saya tidak tahu mengapa saya menikmati menjawab tantangan menggambar yang sulit ini dengan <canvas>begitu banyak ...

Produksi ETH
sumber
13

Love2D, 320 byte.

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

Mungkin bukan solusi optimal, ia menggunakan stensil Love2D, mengatur 3 lingkaran, dan mengisi di mana mereka berpotongan.

Panggil melalui baris perintah, seperti love tri.love 256

Contoh Output

ATaco
sumber
5
Cukup indah
ATaco
10

Python 2 , 111 byte

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

contoh lari

Jonathan Allan
sumber
9

Mathematica 101 100 98 Bytes

Mengambil pendekatan yang berbeda dari @MichaelSeifert, dan mungkin menafsirkan ini sedikit lebih harfiah sehubungan dengan klausa piksel:

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

Contoh Penggunaan:

%@10

10 piksel Gambar 10 piksel

50 piksel Gambar 50 piksel

100 piksel Gambar 100 piksel

Menyimpan satu byte berkat @MartinEnder (notasi infiks) dan 2 byte lainnya dengan mendefinisikan d.

Kelly Lowder
sumber
6

PHP + SVG, 165 byte

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

Contoh Output untuk Input 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
sumber
6

PostScript, 96 86 85 75 73 72 byte

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

Mengambil input sebagai nilai pada stack. ^^dan ^@mewakili karakter kontrol literal. (^@^^Z<^@Z<)adalah string karakter dengan titik kode 0, 30, 90, 60, 0, 90, dan 60, masing-masing. Itu kemudian ditafsirkan sebagai sudut dalam derajat, karena jelas itulah gunanya poin kode.

Disimpan 10 byte karena closepathtidak diperlukan (keduanya clipdan fillsecara implisit menutup jalur).

Disimpan 1 byte dengan menggunakan repeatalih-alih mendefinisikan fungsi.

Disimpan 10 byte dengan beralih ke pendekatan yang sama sekali berbeda.

Disimpan 2 byte dengan melakukan trik-trik dengan stack.

Disimpan 1 byte dengan menggunakan 0 1 2{}forbukan 3{}repeat.

Grimmy
sumber
5

Mathematica, 134 131 byte

NB Solusi ini tidak lagi valid, karena pertanyaannya kemudian diedit untuk meminta r diukur dalam piksel. Terima kasih kepada Martin Ender karena membantu saya mengurangi beberapa byte dalam komentar.

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]

masukkan deskripsi gambar di sini

Nilai input harus diskalakan antara 0 dan 1 agar kode ini berfungsi. Perhatikan bahwa hampir seperempat dari kode ini diperlukan untuk menampilkan bentuk "dalam isolasi", karena ini bukan standar Mathematica.

Michael Seifert
sumber
3
Selamat datang di PPCG! r Exp[2 I Pi n/3]bisa Exp[2I n/3Pi]runtuk menghemat beberapa ruang. Dan umumnya lebih singkat untuk menulis fungsi yang tidak disebutkan namanya, yaitu jatuhkan r=Input[];, ganti rdengan #dan tambahkan a &.
Martin Ender
Saya pikir inputnya harus pixel, bukan faktor penskalaan.
internet_user
1
@pycoder: Ya, kendala itu diedit setelah saya memposting solusi saya.
Michael Seifert
4

BBC BASIC, 58 byte

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

Unduh juru bahasa di http://www.bbcbasic.co.uk/bbcwin/download.html

Tidak disatukan

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
sumber
Wow, itu praktis built-in!
Neil
4

TeX / TikZ, 128 121 112 byte

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

Kode ini didasarkan pada jawaban ini di TeX.se .

TeX berbasis vektor, jadi tidak melakukan piksel. Jari-jari adalah pelampung dengan maksimum sekitar 15 sebelum menyentuh tepi halaman. Itu juga tidak benar-benar dibangun untuk input commandline, jadi perlu dijalankan sebagai

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

tempat kode di atas disimpan rt.tex

Chris H.
sumber
Beberapa tips untuk membuat ini lebih singkat: Anda tidak memerlukan salah satu baris baru; kamu tidak perlu .tex; \footline{}sama baiknya dengan \nopagenumbers; gunakan ~sebagai nama variabel, bukan \i. Untuk memenuhi persyaratan "pixel", Anda dapat menggunakan \r sp; 1sp adalah semacam-setara dengan piksel untuk TeX karena itu adalah lokasi terbaik yang dapat dikelola TeX (saya tidak tahu apakah itu berlaku untuk tikz).
Gilles 'SO- berhenti bersikap jahat'
@Gilles Saya tidak bisa mendapatkan apa-apa dengan sptetapi saya pikir ptitu ide yang bagus. Semua ide Anda yang lain berhasil (beberapa di antaranya sepertinya tidak ada dalam pengujian saya). Terima kasih
Chris H
Anda dapat menghapus spasi setelahnya ~untuk menyimpan satu byte lagi. \input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~in{1,2,3}{[rotate=~*120]arc(0:60:\r sp)};\byebekerja untukku. Coba pdftex "\def\r{2000000} \input rt.tex"- pada 2sp menemukan bentuk secara visual akan sulit mengingat betapa kecilnya itu.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles saya harus mengakui bahwa saya hanya naik ke 20000 sp.
Chris H
1
1pt = 65536sp jadi 20000sp masih kecil.
Gilles 'SANGAT berhenti menjadi jahat'
3

GLSL, 298 229 karakter

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

Coba di sini

Bonus

  • Radius dapat diatur dengan mengubah rvariabel
  • Lebar segitiga dalam piksel seperti yang diminta (Anda harus membuat pembesaran diatur ke 1x dalam kotak pasir GLSL).
tigrou
sumber
Apakah GLSL memiliki metode input standar yang dapat Anda gunakan?
darrylyeo
Di glslsandbox, dimungkinkan untuk mendapatkan posisi kursor mouse. Ini dapat digunakan untuk mengontrol jari-jari segitiga (mis: jari-jari akan menjadi jarak mouse dari pusat).
tigrou
2

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

Menggunakan pendekatan berbasis jalur alih-alih pendekatan pengisian piksel.

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

Logo, 53 byte

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

menggunakan filled perintah untuk mengisi bentuk dalam warna 0 (hitam.) Kode dalam tanda kurung kotak luar dieksekusi tanpa ada garis yang ditarik, tetapi Logo tetap melacak pergerakan kura-kura dan mengisi bentuk setelah braket keluar.

Logo, 64 61 byte

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

Pena Bawah, gambar 60 derajat busur dengan kura-kura di tengah, Pena Atas, gerakkan pena untuk memulai busur, putar 120 deg.

Ulangi 3 kali, lalu pindah ke dalam bentuk dan isi.

Coba di http://turtleacademy.com/playground/en

Sebut seperti cs ht t 100(layar bersih, sembunyikan kura-kura, tdengan r = 100.)

Level River St
sumber
2

MATL , 35 byte

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

Ini menghasilkan file bernama image.png. Untuk input r, ukuran gambar adalah 2*r+1, dan lebar segitiga rsesuai kebutuhan.

Cobalah di MATL Online! Juru bahasa online secara otomatis membuka file yang dibuat dan menampilkan gambar dengan skala sewenang-wenang; klik untuk mendapatkan versi ukuran sebenarnya.

Sebagai alternatif, berikut adalah dua contoh keluaran dari kompiler offline yang berjalan di Matlab, dengan input 50dan 100. Bagian terakhir dari kode 0YGtelah diganti olehIYG sehingga gambar langsung ditampilkan (dengan ukuran yang tepat) alih-alih ditulis ke file.

masukkan deskripsi gambar di sini

Penjelasan

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

Hitungan byte tidak termasuk kode yang diperlukan untuk input pengguna yang nyaman dengan ukuran yang diinginkan.

Neil
sumber
Pintar! n=>s.style.width=nakan bekerja juga.
darrylyeo
Sepertinya saya tidak tahu bagaimana Anda mencapai 112 byte.
darrylyeo
@dryrylyeo Saran itu tidak berhasil untuk saya, maaf, tapi saya setuju tentang jumlah byte, saya tidak tahu bagaimana saya sampai ke sana juga.
Neil
Hmm, mungkin hanya berfungsi di 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.

Dimungkinkan untuk mengurangi hal ini, saya baru mengenal metapost.

Carel
sumber
Saya agak malas dan menggunakan byte byte teks editor. Saya tidak tahu Anda bisa menghapus titik dua, Terima kasih. Saya benar-benar memiliki satu jam MetaPost di bawah ikat pinggang sekarang ^ _ ^
Carel
1
Saya masih menghitung 223, bukan 226. Juga, dapatkah Anda menghapus spasi di len * dirdan titik pada akhirnya?
R
1

k, 141 100 98 byte

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

Input diambil dari stdin, output dalam stderr(atau stdintergantung pada penerjemah) dalam pgmformat. Sebagai contoh:

Contoh program yang berfungsi.

Penjelasan:

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

05AB1E , 66 byte

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

Tidak dapat menggunakan TIO, karena membuka jendela dan menggambar segitiga Reuleaux di sana.

Minta input, dan kemudian membuka jendela kura-kura Python menggambar segitiga.

Jawaban Jonathan Allan memberi saya inspirasi untuk melakukan ini, meskipun saya sedikit mengubah kodenya.

Pada dasarnya, ini adalah kombinasi dari kemampuan kompresi 05AB1E dan kemudahan grafis penyu Python.

Erik the Outgolfer
sumber
0

OpenSCAD , 91 byte

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

Saya tidak yakin bagaimana halal ini, karena piksel tidak benar-benar unit terdefinisi dengan baik dalam format grid mesh yang saya tahu. Sebagai gantinya, modul tmenggambar segitiga reuleaux dari radius yang diberikan rdalam unit asli apa pun yang digunakan.

Contoh hasil pratinjau untuk t(100): t (100)

Julian Wolf
sumber
0

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

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

Tidak Disatukan:

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
sumber