วาดสามเหลี่ยม Reuleaux!


27

Reuleaux สามเหลี่ยมเป็นรูปทรงที่เกิดขึ้นจากจุดตัดของสามวงกลมที่มีวงกลมแต่ละผ่านศูนย์ของผู้อื่น โดยไม่คำนึงถึงการหมุนความกว้างของสามเหลี่ยม Reuleaux จะเท่ากับรัศมีของวงกลมเสมอ:

จาก Wolfram MathWorld

ภาพ: Wolfram MathWorld

เขียนโปรแกรมที่รับความกว้างrเป็นอินพุตและแสดงสามเหลี่ยม Reuleaux ของความกว้างนั้น (เป็นพิกเซล)

คุณต้องแสดงรูปร่างแบบแยกเช่นแบบทึบเต็มไม่ลูบและบนพื้นหลังทึบ

- โปรแกรมที่สั้นที่สุดเป็นไบต์ชนะ


1
รัศมีrควรอยู่ในหน่วยพิกเซลหรือเป็นเพียงตัวประกอบสเกล
Karl Napf

@Karl Napf Pixels
darrylyeo

เราสามารถเอาท์พุทอะไรไปยัง STDOUT ได้หรือไม่ตราบใดที่เราวาดสามเหลี่ยม Reuleaux ให้ถูกต้อง?
Erik the Outgolfer

@EriktheOutgolfer นั่นเป็นเรื่องปกติ
darrylyeo

คำตอบ:


21

JavaScript + HTML, 164 158 + 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 Bytes

ใช้แนวทางที่แตกต่างจาก @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 พิกเซล

50 พิกเซล ภาพขนาด 50 พิกเซล

100 พิกเซล ภาพขนาด 100 พิกเซล

บันทึกเป็นไบต์ด้วย @MartinEnder (สัญกรณ์ใส่) และอีก 2 ไบต์โดยกำหนด d


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ไม่จำเป็น (ทั้งสองอย่างclipและfillปิดเส้นทางโดยปริยาย)

บันทึก 1 ไบต์โดยใช้repeatแทนการกำหนดฟังก์ชั่น

บันทึก 10 ไบต์ด้วยการเปลี่ยนไปใช้วิธีอื่น

บันทึก 2 ไบต์ด้วยการเล่นกลกับกองซ้อน

ที่บันทึกไว้ 1 ไบต์โดยใช้แทน0 1 2{}for3{}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]

ป้อนคำอธิบายรูปภาพที่นี่

ค่าอินพุตต้องถูกปรับอัตราส่วนระหว่าง 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

Ungolfed

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

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 ก่อนที่มันจะกระทบกับขอบของหน้ากระดาษ มันไม่ได้ถูกสร้างขึ้นมาสำหรับอินพุต commandline ดังนั้นจึงจำเป็นต้องเรียกใช้

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 ฉันต้องยอมรับว่าฉันขึ้นไปถึง 20,000 sp
Chris H

1
1pt = 65536sp ดังนั้น 20000sp ยังเล็กอยู่
Gilles 'หยุดความชั่วร้าย'

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ตัวแปร
  • ความกว้างของรูปสามเหลี่ยมเป็นพิกเซลตามที่ร้องขอ (คุณต้องทำการซูมให้ตั้งค่าเป็น 1x ในกล่องทราย GLSL)

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

Pen Down, วาดส่วนโค้ง 60 องศาโดยมีเต่าอยู่ตรงกลาง, Pen Up, เลื่อนปากกาไปที่จุดเริ่มต้นของส่วนโค้ง, หมุน 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 กับปัจจัยการผลิตและ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 คำแนะนำนั้นใช้ไม่ได้สำหรับฉันขอโทษ แต่ฉันเห็นด้วยกับจำนวนไบต์ฉันไม่สามารถทราบได้ว่าฉันมาถึงอย่างไร
Neil

อืมอาจใช้ได้กับ 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 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วาดรูปสามเหลี่ยม reuleaux ของรัศมีที่กำหนดrในหน่วยดั้งเดิมที่ใช้งานอยู่

ตัวอย่างผลลัพธ์เอาท์พุทสำหรับ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

Ungolfed:

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.