Vẽ một tam giác Reuleaux!


27

Các Reuleaux tam giác là hình dạng hình thành bởi các giao điểm của ba vòng tròn, mỗi vòng tròn đi qua trung tâm của những người khác. Bất kể xoay, chiều rộng của tam giác Reuleaux sẽ luôn bằng bán kính của các vòng tròn:

Từ Wolfram MathWorld

Hình: Wolfram MathWorld

Viết chương trình lấy chiều rộng rlàm đầu vào và hiển thị tam giác Reuleaux có chiều rộng đó (tính bằng pixel).

Bạn phải hiển thị hình dạng một cách cô lập, tức là đầy rắn, không vuốt và trên nền đầy rắn.

- Chương trình ngắn nhất tính bằng byte thắng.


1
Bán kính rnên được tính bằng pixel hoặc chỉ một số hệ số tỷ lệ?
Karl Napf

@Karl Napf Pixels.
darrylyeo

Chúng ta có thể xuất bất cứ thứ gì cho STDOUT không, miễn là chúng ta vẽ tam giác Reuleaux đúng cách?
Erik the Outgolfer

@EriktheOutgolfer Thế là tốt.
darrylyeo

Câu trả lời:


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>

Tôi không biết tại sao tôi thích trả lời những thử thách vẽ toán học này với <canvas>rất nhiều ...


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

Có lẽ không phải là giải pháp tối ưu, nó sử dụng giấy nến của Love2D, thiết lập 3 vòng tròn và điền vào nơi chúng giao nhau.

Gọi qua dòng lệnh, như love tri.love 256

Ví dụ đầu ra


5
Nó thật đáng yêu
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()

chạy ví dụ


9

Mathicala 101 100 98 Byte

Thực hiện một cách tiếp cận khác với @MichaelSeifert và có thể diễn giải điều này theo nghĩa đen hơn một chút về mệnh đề 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/#}]&

Ví dụ sử dụng:

%@10

10 pixel Hình ảnh 10 pixel

50 pixel Hình ảnh 50 pixel

100 pixel Hình ảnh 100 pixel

Đã lưu một byte nhờ @MartinEnder (ký hiệu infix) và 2 byte khác bằng cách xác định d.


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

Ví dụ đầu ra cho đầu vào 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 byte

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

Lấy đầu vào là một giá trị trên ngăn xếp. ^^^@đại diện cho các ký tự điều khiển theo nghĩa đen. (^@^^Z<^@Z<)là chuỗi các ký tự có điểm mã 0, 30, 90, 60, 0, 90 và 60, tương ứng. Những cái đó sau đó được hiểu là các góc theo độ, bởi vì rõ ràng đó là điểm mã dành cho.

Đã lưu 10 byte vì closepathkhông cần thiết (cả hai clipfillhoàn toàn đóng đường dẫn).

Đã lưu 1 byte bằng cách sử dụng repeatthay vì xác định hàm.

Đã lưu 10 byte bằng cách chuyển sang một cách tiếp cận hoàn toàn khác.

Đã lưu 2 byte bằng cách thực hiện các thủ thuật với ngăn xếp.

Đã lưu 1 byte bằng cách sử dụng 0 1 2{}forthay vì 3{}repeat.


5

Toán học, 134 131 byte

NB Giải pháp này không còn hợp lệ, vì câu hỏi sau đó đã được chỉnh sửa để yêu cầu r được đo bằng pixel. Cảm ơn Martin Ender đã giúp tôi cạo sạch một vài byte trong các bình luận.

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]

nhập mô tả hình ảnh ở đây

Giá trị đầu vào phải được thu nhỏ từ 0 đến 1 để mã này hoạt động. Lưu ý rằng gần một phần tư mã này là bắt buộc để hiển thị hình dạng "trong sự cô lập", vì đây không phải là mặc định của Mathicala.


3
Chào mừng đến với PPCG! r Exp[2 I Pi n/3]có thể Exp[2I n/3Pi]rđể tiết kiệm một số không gian. Và nó thường ngắn hơn để viết một chức năng vô danh, tức là thả r=Input[];, thay thế rvới #và thêm một &.
Martin Ender

Tôi nghĩ rằng đầu vào phải là pixel, không phải là một hệ số tỷ lệ.
internet_user

1
@pycoder: Có, ràng buộc đó đã được chỉnh sửa sau khi tôi đăng giải pháp của mình.
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.

Tải xuống thông dịch viên tại http://www.bbcbasic.co.uk/bbcwin/doad.html

Bị đánh cắp

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, thực tế là một tích hợp!
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

Mã này được dựa trên câu trả lời này tại TeX.se .

TeX dựa trên vector, do đó, không làm pixel. Bán kính là một hình nổi với tối đa khoảng 15 trước khi nó chạm vào cạnh của trang. Nó cũng không thực sự được xây dựng cho đầu vào dòng lệnh, vì vậy cần phải được chạy như

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

mã ở trên được lưu ở đâu rt.tex


Một vài mẹo để làm cho điều này ngắn hơn: bạn không cần bất kỳ dòng mới nào; bạn không cần .tex; \footline{}cũng tốt như \nopagenumbers; sử dụng ~như một tên biến thay vì \i. Để đáp ứng yêu cầu của pixel pixel, bạn có thể sử dụng \r sp; 1sp là loại tương đương với pixel cho TeX vì đó là vị trí tốt nhất mà TeX có thể quản lý (tôi không biết liệu nó có áp dụng cho tikz hay không).
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Tôi không thể có được bất cứ điều gì với spnhưng tôi nghĩ đó ptlà một ý tưởng tốt. Tất cả các ý tưởng khác của bạn đã hoạt động (một số dường như không có trong các thử nghiệm của tôi). Cảm ơn bạn
Chris H

Bạn có thể xóa khoảng trống sau ~để lưu thêm một byte. \input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~in{1,2,3}{[rotate=~*120]arc(0:60:\r sp)};\byelàm việc cho tôi Hãy thử pdftex "\def\r{2000000} \input rt.tex"- tại 2sp việc tìm kiếm hình dạng một cách trực quan sẽ khó khăn khi nó nhỏ như thế nào.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Tôi phải thừa nhận tôi chỉ đi tới 20000 sp.
Chris H

1
1pt = 65536sp nên 20000sp vẫn còn nhỏ.
Gilles 'SO- ngừng trở nên xấu xa'

3

GLSL, 298 229 ký tự

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

Hãy thử nó ở đây

Tiền thưởng

  • Bán kính có thể được đặt bằng cách thay đổi rbiến
  • Độ rộng tam giác được tính bằng pixel theo yêu cầu (bạn phải thu phóng được đặt thành 1x trong hộp cát GLSL).

GLSL có phương thức nhập chuẩn mà bạn có thể sử dụng không?
darrylyeo

Trong glslsandbox, có thể lấy vị trí con trỏ chuột. Điều này có thể được sử dụng để kiểm soát bán kính tam giác (ví dụ: bán kính sẽ là khoảng cách chuột từ trung tâm).
tigrou

2

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

Sử dụng cách tiếp cận dựa trên đường dẫn thay vì cách tiếp cận lấp đầy pixel.

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 byte

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

sử dụng filledlệnh để điền vào hình dạng màu 0 (màu đen.) Mã trong dấu ngoặc vuông bên ngoài được thực thi mà không có bất kỳ dòng nào được vẽ, nhưng Logo theo dõi các chuyển động của rùa và điền vào hình dạng khi thoát khỏi dấu ngoặc.

Logo, 64 61 byte

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

Pen Down, vẽ cung 60 độ với rùa ở giữa, Pen Up, di chuyển bút để bắt đầu cung, xoay 120 độ.

Lặp lại 3 lần, sau đó di chuyển bên trong hình và điền vào nó.

Thử tại http://turtleacademy.com/playground/en

Gọi như cs ht t 100(xóa màn hình, ẩn rùa, tvới r = 100.)


2

MATL , 35 byte

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

Điều này tạo ra một tập tin gọi là image.png. Đối với đầu vào r, kích thước của hình ảnh là 2*r+1và chiều rộng của hình tam giác là rtheo yêu cầu.

Hãy thử nó tại MATL Online! Trình thông dịch trực tuyến tự động mở tệp đã tạo và hiển thị hình ảnh với tỷ lệ tùy ý; nhấp vào nó để có được phiên bản kích thước thực tế.

Ngoài ra, đây là hai ví dụ đầu ra từ trình biên dịch ngoại tuyến đang chạy trên Matlab, với đầu vào 50100. Phần cuối của mã 0YGđã được thay thế IYGđể hình được hiển thị trực tiếp (với kích thước phù hợp) thay vì được ghi vào một tệp.

nhập mô tả hình ảnh ở đây

Giải trình

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

Số byte không bao gồm mã cần thiết cho đầu vào người dùng thuận tiện với kích thước mong muốn.


Tài giỏi! n=>s.style.width=ncũng sẽ làm việc
darrylyeo

Tôi dường như không thể tìm ra làm thế nào bạn đến 112 byte.
darrylyeo

@darrylyeo Đề xuất đó không hiệu quả với tôi, xin lỗi, nhưng tôi đồng ý về số byte, tôi cũng không thể hiểu được làm thế nào tôi đến với nó.
Neil

Hmm, có lẽ chỉ hoạt động trong Chrome.
darrylyeo

1

MetaPost ( 242 226 byte)

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.

Có thể giảm bớt phần nào điều này, tôi chưa quen với metapost.


Tôi đã hơi lười biếng và sử dụng số byte biên tập văn bản. Tôi không biết bạn có thể loại bỏ dấu hai chấm, Cảm ơn. Bây giờ tôi thực sự có một giờ MetaPost dưới vành đai ^ _ ^
Carel

1
Tôi vẫn đếm 223, không phải 226. Ngoài ra, bạn có thể xóa khoảng trắng trong len * dirvà dấu chấm ở cuối không?
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
\\

Đầu vào được lấy từ stdin, đầu ra là stderr(hoặc stdintùy thuộc vào trình thông dịch) ở pgmđịnh dạng. Ví dụ:

Ví dụ về chương trình làm việc.

Giải trình:

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 byte

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

Không thể sử dụng TIO, vì nó mở một cửa sổ và vẽ tam giác Reuleaux ở đó.

Yêu cầu nhập liệu, và sau đó mở ra một cửa sổ rùa Python vẽ hình tam giác.

Câu trả lời của Jonathan Allan đã cho tôi cảm hứng để làm điều này, mặc dù tôi đã thay đổi mã của anh ấy một chút.

Về cơ bản, đây là sự kết hợp giữa khả năng nén của 05AB1E và đồ họa rùa dễ dàng của Python.


0

OpenSCAD , 91 byte

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

Tôi không chắc chắn mức độ này sẽ như thế nào, vì pixel không thực sự là một đơn vị được xác định rõ trong bất kỳ định dạng lưới lưới nào mà tôi biết. Thay vào đó, mô-đun tvẽ một tam giác reuleaux có bán kính cho trước rtrong bất kỳ đơn vị bản địa nào đang được sử dụng.

Mẫu đầu ra xem trước cho t(100): (100)


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

Ung dung:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.