Bir Reuleaux Üçgeni çizin!


27

Reuleaux üçgen başkalarının merkezleri içinden geçen, her daire ile üç dairenin kesişmesiyle oluşan şekli. Dönmeden bağımsız olarak, bir Reuleaux üçgeni genişliği her zaman dairelerin yarıçapına eşit olacaktır:

Wolfram MathWorld adlı geliştiriciden

Görüntü: Wolfram MathWorld

rGiriş olarak genişlik alan ve bu genişliğin Reuleaux üçgeni (piksel olarak) görüntüleyen bir program yazın .

Şekli yalıtımlı, yani katı dolu, kontursuz ve katı dolu bir arka plan üzerinde görüntülemelisiniz.

- Bayt cinsinden en kısa program kazanır.


1
Yarıçap rpiksel olarak mı yoksa sadece bir ölçeklendirme faktörü mü olmalı ?
Karl Napf

@Karl Napf Pikselleri.
darrylyeo

Reuleaux üçgeni düzgün bir şekilde çizdiğimiz sürece STDOUT'a herhangi bir şey çıkartabilir miyiz?
Erik Outgolfer

@EriktheOutgolfer Bu iyi.
darrylyeo

Yanıtlar:


21

JavaScript + HTML, 164 158 + 13 = 171 bayt

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>

Neden bu matematik çizim zorluklarını <canvas>bu kadar çok cevaplamaktan zevk aldığımı bilmiyorum .


13

Love2D, 320 bayt.

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

Muhtemelen en uygun çözüm değil, Love2D'nin şablonlarını kullanıyor, 3 daireyi kuruyor ve kesiştikleri yeri dolduruyor.

Gibi komut satırı üzerinden arayın love tri.love 256

Örnek çıktı


5
Oldukça güzel
ATaco

10

Python 2,111 bayt

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

örnek çalışma


9

Mathematica 101 100 98 Bayt

@MichaelSeifert'ten farklı bir yaklaşım benimsemek ve muhtemelen bunu piksel cümlesiyle ilgili olarak tam anlamıyla biraz daha yorumlamak:

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

Kullanım Örneği:

%@10

10 piksel 10 piksel görüntü

50 piksel 50 piksel görüntü

100 piksel 100 piksel görüntü

@ Martininder (infix notasyonu) ve başka 2 byte'ı tanımlayarak bir bayt kaydetti.


6

PHP + SVG, 165 bayt

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

Giriş 128 için Örnek Çıktı

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

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

Girdiyi yığında bir değer olarak alır. ^^ve ^@değişmez kontrol karakterlerini temsil eder. (^@^^Z<^@Z<)Sırasıyla 0, 30, 90, 60, 0, 90 ve 60 kod noktalarına sahip karakter dizisidir. Bunlar daha sonra derece cinsinden açı olarak yorumlanır, çünkü açıkçası bu kod noktaları içindir.

Çünkü 10 bayt Kaydedilen closepathgerekli değildir (hem clipve filldolaylı yakın yolu).

repeatBir işlev tanımlamak yerine 1 bayt kullanılarak kaydedildi .

Tamamen farklı bir yaklaşıma geçerek 10 bayt kurtardı.

Yığınla püf noktaları yaparak 2 bayt kurtardı.

Kullanılarak 1 bayt Kaydedilen 0 1 2{}foryerine 3{}repeat.


5

Mathematica, 134 131 bayt

Not Bu soru artık geçerli değildir, çünkü soru daha sonra r'nin piksel cinsinden ölçülmesini gerektirecek şekilde düzenlenmiştir . Martin Ender'e yorumlarda birkaç bayt atmamda yardımcı olduğun için teşekkür ederim.

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]

görüntü tanımını buraya girin

Bu kodun çalışması için giriş değeri 0 ile 1 arasında olmalıdır. Mathematica'nın varsayılanı olmadığından, "izolasyonda" şeklini görüntülemek için bu kodun neredeyse dörtte birinin gerekli olduğunu unutmayın.


3
PPCG'ye Hoşgeldiniz! Bazı yerden tasarruf etmek r Exp[2 I Pi n/3]olabilir Exp[2I n/3Pi]r. Ve genellikle isimlendirilmemiş bir fonksiyon yazmak, yani a ile r=Input[];değiştirmek, yerine koymak ve eklemek için daha kısadır . r#&
Martin Ender

Girdilerin ölçeklendirme faktörü değil piksel olması gerektiğini düşünüyorum.
internet_user

1
@ pycoder: Evet, çözümümü yayınladıktan sonra bu kısıtlama düzenlendi.
Michael Seifert

4

BBC BASIC, 58 bayt

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

Tercümanı http://www.bbcbasic.co.uk/bbcwin/download.html adresinden indirin.

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.

Vay, bu tamamen yerleşik bir cihaz!
Neil

4

TeX / TikZ, 128 121 112 bayt

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

Kod, TeX.se'deki bu cevaba dayanmaktadır .

TeX vektör tabanlıdır, yani piksel yapmaz. Yarıçap, sayfanın kenarına değmeden önce en fazla yaklaşık 15 olan bir yüzdür. Ayrıca komut satırı girişi için gerçekten oluşturulmamıştır, bu nedenle çalıştırılması gerekir

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

yukarıdaki kodun kaydedildiği yer rt.tex


Bunu kısaltmak için birkaç ipucu: Yeni hatlardan hiçbirine ihtiyacınız yok; ihtiyacın yok .tex; \footline{}en az onun kadar iyidir \nopagenumbers; kullanmak ~yerine bir değişken adı olarak \i. “Piksel” gereksinimini karşılamak için kullanabilirsiniz \r sp; 1sp, TeX'in yönetebileceği en iyi konum olduğu için bir piksele eşdeğerdir (eğer Tikz için geçerli olup olmadığını bilmiyorum).
Gilles 'SO- kötülük' dur '14

@ Gilles ile hiçbir şey elde edemiyorum spama bence ptiyi bir fikir. Bütün diğer fikirlerin işe yaradı (bazıları benim sınavlarımda görünmüyordu). Teşekkür ederim
Chris H

Bir ~bayt daha kaydetmek için sonraki boşluğu kaldırabilirsiniz . \input tikz\footline{}\tikz\draw[draw=none,fill=red](0,1)\foreach~in{1,2,3}{[rotate=~*120]arc(0:60:\r sp)};\byebenim için çalışıyor. Deneyin pdftex "\def\r{2000000} \input rt.tex"- 2sp'de şekli görsel olarak bulmak ne kadar küçük olursa olsun zor olacaktır.
Gilles 'SO- kötülük olmayı bırak'

@ Gilles itiraf etmeliyim ki sadece 20000 sp.
Chris H,

1
1pt = 65536sp yani 20000sp hala küçük.
Gilles 'SO- kötülük olmayı bırak'

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

Burada dene

Bonus

  • rDeğişken değiştirilerek yarıçap ayarlanabilir
  • Üçgen genişliği istendiği gibi piksel cinsindendir (GLSL sanal alanında yakınlaştırmanın 1x olarak ayarlanması gerekir).

GLSL'in kullanabileceğiniz standart bir giriş yöntemi var mı?
darrylyeo

Glslsandbox'ta, fare imleci pozisyonunu almak mümkündür. Bu, üçgen yarıçapını kontrol etmek için kullanılabilir (örneğin: yarıçap, merkezden farenin uzaklığı olur).
tigrou

2

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

Piksel doldurma yaklaşımı yerine yola dayalı bir yaklaşım kullanır.

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 bayt

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

filledşekli renkli (0) doldurmak için komutu kullanır (siyah.) Dış köşeli parantez içindeki kod, herhangi bir çizgi çizilmeden yürütülür, ancak Logo, kaplumbağa hareketlerini izler ve parantez çıktıktan sonra şekli doldurur.

Logo, 64 61 bayt

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

Pen Down, ortada kaplumbağa ile 60 derece yay çizin, Pen Up, yayı başlatmak için kalemi hareket ettirin, 120 derece döndürün.

3 kez tekrarlayın, ardından şeklin içinde hareket edin ve doldurun.

En deneyin http://turtleacademy.com/playground/en

Gibi çağrı yapın cs ht t 100(ekranı temizle, kaplumbağayı sakla, tr = 100 ile).


2

MATL , 35 bayt

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

Bu denilen bir dosya üretir image.png. Giriş için r, görüntünün boyutu 2*r+1ve üçgenin genişliği rgerektiği gibi.

MATL Online'da deneyin ! Çevrimiçi tercüman oluşturulan dosyayı otomatik olarak açar ve görüntüyü rasgele ölçeklendirme ile görüntüler; Gerçek boyutlu sürümü elde etmek için üzerine tıklayın.

Alternatif olarak, burada girişli Matlab çalıştıran çevrimdışı derleyici iki örnek çıkışları olan 50ve 100. Kodun son kısmı , şekil bir dosyaya yazılmak yerine doğrudan (doğru boyutta) görüntülenecek şekilde 0YGdeğiştirildi IYG.

görüntü tanımını buraya girin

açıklama

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 bayt

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>

Bayt sayısı, istenen boyutta uygun kullanıcı girişi için gereken kodu içermez.


Zeki! n=>s.style.width=nda işe yarardı.
darrylyeo

112 bayta nasıl geldiğini çözemiyorum.
darrylyeo

@ darrylyeo Bu öneri benim için işe yaramadı, üzgünüm, ama bayt sayısı konusunda hemfikir, ben de nasıl geldiğimi anlayamıyorum.
Neil,

Hmm, muhtemelen yalnızca Chrome'da çalışır.
darrylyeo

1

MetaPost ( 242 226 Bayt)

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.

Bunu biraz azaltmak mümkün olabilir, metapost için yeniyim.


Biraz tembeldim ve metin editörleri bayt sayısını kullandım. Kolonları çıkarabileceğini bilmiyordum, teşekkürler. Kelimenin tam anlamıyla şimdi kemer altında bir saat MetaPost var ^ _ ^
Carel

1
Hala 223 sayıyorum, 226 değil. Ayrıca, boşlukları len * dirve sondaki noktayı kaldırabilir misiniz ?
Rɪᴋᴇʀ

1

k, 141 100 98 bayt

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

Giriş stdin, çıkış biçiminde alınır stderr(veya stdintercümana bağlı olarak) pgm. Örneğin:

Çalışan program örneği.

Açıklama:

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 bayt

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

TIO kullanılamaz, çünkü bir pencere açar ve oradaki Reuleaux üçgenini çizer.

Girişte sorar ve ardından üçgeni çizen bir Python kaplumbağa penceresi açılır.

Jonathan Allan'ın cevabı, kodunu biraz değiştirmeme rağmen, bana ilham verdi.

Temel olarak, bu 05AB1E'nin sıkıştırma yeteneklerinin ve Python'un kaplumbağa grafiklerinin kolaylığının bir birleşimidir.


0

OpenSCAD , 91 bayt

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

Pikseller bildiğim herhangi bir mesh ızgara biçiminde gerçekten iyi tanımlanmış bir birim olmadığından bunun ne kadar kesin olduğundan emin değilim. Bunun yerine, modül t, kullanılan herhangi bir birimde verilen yarıçapın bir reuleaux üçgenini çizer r.

Şunun için örnek önizleme çıktısı t(100): t (100)


0

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

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.