画一个Reuleaux三角形!


27

鲁洛三角形是由三个圆的交点所形成的形状,其中每个圈通过别人的中心。无论旋转,Reuleaux三角形的宽度始终等于圆的半径:

来自Wolfram MathWorld

图片:Wolfram MathWorld

编写一个程序,将宽度r作为输入并显示该宽度的Reuleaux三角形(以像素为单位)。

您必须单独显示形状,即实心填充,未描边并在实心填充背景上显示。

golf-以字节为单位的最短程序获胜。


1
半径r应该以像素为单位还是仅按比例缩放?
Karl Napf

@Karl Napf像素。
darrylyeo

只要我们正确绘制Reuleaux三角形,我们可以将任何东西输出到STDOUT吗?
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer很好。
darrylyeo

Answers:


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

10

Python 2,111字节

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

示例运行


9

数学101 100 98个字节

采用与@MichaelSeifert不同的方法,并且可能对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/#}]&

用法示例:

%@10

10像素 10像素图像

50像素 50像素图像

100像素 100像素图像

通过@MartinEnder(后缀表示法)节省了一个字节,并通过定义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的字符串。然后将其解释为角度(以度为单位),因为显然这就是代码点的用途。

节省了10个字节,因为closepath不需要(包括clipfill隐含接近路径)。

通过使用repeat而不是定义函数来保存1个字节。

通过切换到完全不同的方法,节省了10个字节。

通过使用堆栈来节省2个字节。

使用0 1 2{}for代替节省了1个字节3{}repeat


5

Mathematica,134 131字节

注意:此解决方案不再有效,因为后来对问题进行了编辑,以要求以像素为单位测量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]

在此处输入图片说明

输入值必须在0到1之间缩放,此代码才能起作用。请注意,该代码中几乎有四分之一需要“单独”显示形状,因为这不是Mathematica的默认设置。


3
欢迎来到PPCG!r Exp[2 I Pi n/3]可以Exp[2I n/3Pi]r节省一些空间。而且它一般较短写一个匿名函数,即删除r=Input[];,替换r#和追加&
Martin Ender

我认为输入必须是像素,而不是比例因子。
internet_user

1
@pycoder:是的,该约束在我发布解决方案后进行了编辑。
Michael Seifert

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)。
吉尔斯(Gillles)“所以-别再邪恶了”

@Gilles我什么都拿不到,sp但我认为pt是个好主意。您的所有其他想法都起作用(在我的测试中似乎没有)。谢谢
克里斯·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下,鉴于形状很小,很难通过视觉找到形状。
吉尔斯(Gillles)“所以-别再作恶了”

@吉尔斯我必须承认我只上升到20000 sp。
克里斯H

1
1pt = 65536sp,所以20000sp仍然很小。
吉尔(Gilles)'“ SO-别再邪恶了”

3

GLSL,298229个字符

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(黑色)。执行外部方括号中的代码时,无需绘制任何线条,但是Logo会跟踪乌龟的运动,并在退出方括号后填充形状。

徽标,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(清除屏幕,隐藏海龟,tr = 100。)


2

MATL,35字节

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

这将产生一个名为的文件image.png。对于input r,图像的大小为2*r+1,三角形的宽度是r所需的。

MATL在线上尝试一下在线解释器会自动打开创建的文件并以任意比例显示图像。单击它以获得实际尺寸的版本。

另外,这是在Matlab上运行的脱机编译器的两个示例输出,输入为50100。代码的最后一部分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.

可能有可能将其减少一些,我是metapost的新手。


我有点懒,并且使用了文本编辑器的字节数。我不知道您可以删除冒号,谢谢。我现在字面上有一个小时的MetaPost ^ _ ^
卡雷尔(Carel)

1
我仍然算223,而不是226。此外,您可以删除空格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,因为它会打开一个窗口并在其中绘制Reuleaux三角形。

要求输入,然后打开绘制三角形的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本机单位,模块都会绘制给定半径的reuleaux三角形。

的样本预览输出t(100)吨(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.