Reuleaux Triangle을 그립니다!


27

뢸로 삼각형은 다른 사람 '중심을 통과하는 각 원이 세 개의 원의 교차에 의해 형성되는 모양이다. 회전에 관계없이 Reuleaux 삼각형의 너비는 항상 원의 반지름과 같습니다.

Wolfram MathWorld에서

이미지 : Wolfram MathWorld

너비 r를 입력으로 사용하고 해당 너비의 Reuleaux 삼각형을 픽셀 단위로 표시 하는 프로그램을 작성하십시오 .

단색으로 채워지거나 획을 칠하지 않고 단색으로 채워진 배경 위에 모양을 분리하여 표시해야합니다.

golf-가장 짧은 바이트 단위의 프로그램이 이깁니다.


1
반지름 r이 픽셀 단위 여야합니까 아니면 일부 배율에만 있어야합니까 ?
Karl Napf

@ 칼 Napf 픽셀.
darrylyeo

Reuleaux 삼각형을 올바르게 그리는 한 STDOUT에 무엇이든 출력 할 수 있습니까?
아웃 골퍼 Erik

@EriktheOutgolfer 괜찮습니다.
darrylyeo

답변:


21

자바 스크립트 + 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

매쓰 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 (infix notation)와 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

포스트 스크립트, 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 인 문자열입니다. 그런 다음 그것들은 각도로 해석됩니다. 왜냐하면 그것이 코드 포인트의 목적이기 때문입니다.

때문에 10 바이트를 저장 한 closepath필요하지 않습니다 (모두 clipfill암시 적으로 가까운 경로).

repeat함수를 정의하는 대신 사용하여 1 바이트를 절약했습니다 .

완전히 다른 접근 방식으로 전환하여 10 바이트를 절약했습니다.

스택으로 트릭을 수행하여 2 바이트를 절약했습니다.

0 1 2{}for대신을 사용하여 1 바이트를 저장했습니다 3{}repeat.


5

Mathematica, 134131 바이트

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 사이로 조정해야합니다. Mathematica의 기본값이 아니기 때문에 "절연"형태를 표시하려면이 코드의 거의 1/4이 필요합니다.


3
PPCG에 오신 것을 환영합니다! 공간을 절약 r Exp[2 I Pi n/3]할 수 있습니다 Exp[2I n/3Pi]r. 그리고 그것은 즉,이 드롭, 익명 함수를 작성하는 것은 일반적으로 짧다 r=Input[];교체 r#와를 추가 &.
Martin Ender 2016 년

입력은 스케일링 팩터가 아닌 픽셀이어야한다고 생각합니다.
internet_user

1
@ pycoder : 예, 솔루션을 게시 한 후 제약 조건이 편집되었습니다.
Michael Seifert

4

BBC 기본, 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.

와우, 그것은 실제로 내장되어 있습니다!
Neil

4

텍 / 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에 적용되는지는 알 수 없습니다).
Gilles 'SO- 악의

@Gilles 나는 아무것도 얻을 수 없습니다 sp하지만 난 생각 pt하는 것이 좋습니다. 다른 모든 아이디어가 효과가있었습니다 (일부 테스트에서는 보이지 않는 것 같습니다). 감사합니다
Chris H

~한 바이트를 더 저장 한 후 공백을 제거 할 수 있습니다 . \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에서는 모양이 작은 경우 시각적으로 찾기가 어려울 수 있습니다.
Gilles 'SO- 악마 그만해'

@Gilles 나는 단지 20000 sp까지 올라 갔다는 것을 인정해야한다.
Chris H

1
1pt = 65536sp이므로 20000sp는 여전히 작습니다.
Gilles '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 샌드 박스에서 확대 / 축소를 1x로 설정해야 함).

GLSL에 사용할 수있는 표준 입력 방법이 있습니까?
darrylyeo

glslsandbox에서는 마우스 커서 위치를 얻을 수 있습니다. 삼각형 반경을 제어하는 ​​데 사용할 수 있습니다 (예 : 반경은 중심에서 마우스 거리)
tigrou

2

자바 스크립트 (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도 호를 그립니다.

3 번 반복 한 다음 도형 내부로 이동하여 채 웁니다.

http://turtleacademy.com/playground/en 에서 시도하십시오

다음과 같이 전화하십시오 cs ht t 100(화면이 깨끗하고 거북이를 숨기고 tr = 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에서 실행되는 오프라인 컴파일러의 입력 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

자바 스크립트 (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 2018 년

112 바이트에 어떻게 왔는지 알 수없는 것 같습니다.
darrylyeo 2018 년

@darrylyeo 그 제안은 저에게 효과가 없었습니다. 죄송하지만 바이트 수에 동의합니다. 어떻게 왔는지 알 수 없습니다.
Neil

흠, 아마도 크롬에서만 작동합니다.
darrylyeo 2018 년

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.

메타 포스트를 처음 접했을 때이 부분을 다소 줄일 수 있습니다.


나는 약간 게으르고 텍스트 편집기 바이트 수를 사용했습니다. 콜론을 제거 할 수 있다는 것을 몰랐습니다. 감사합니다. 문자 그대로 벨트 아래에 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

창을 열고 거기에 Reuleaux 삼각형을 그리므로 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 은 주어진 반경의 reuleaux 삼각형을 그립니다r 사용중인 기본 단위 .

에 대한 샘플 미리보기 출력 t(100): t (100)


0

스마일 베이직, 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.