วาดเป็นเกลียวในกล่อง


13

เกลียว

เกลียวเรขาคณิตนี้ดูซับซ้อน แต่การวาดค่อนข้างง่าย ใช้กล่องต่อไปนี้:

กล่อง

ลากเส้นตรงระหว่างมุมของกล่องและระยะห่างที่กำหนดเหนือมุมทวนเข็มนาฬิกา

1 บรรทัด

ทำรูปแบบนี้ต่อไปด้านในอยู่ห่างจากมุมของบรรทัดถัดไปเสมอ นี่คืออีกไม่กี่บรรทัด

เส้น moar

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

ความท้าทาย

The Inspiration (และต้องขอบคุณบุคคลที่ยอดเยี่ยมที่แนะนำแนวคิดนี้ <3)

กำหนดอินพุต (อาจเป็นเศษส่วน) ตัวเลขตั้งแต่ 1 ถึง 25 เขียนรูปภาพลงดิสก์ที่ใช้รูปแบบนี้หรือแสดงผลลัพธ์บนหน้าจอโดยที่ระยะห่างจากแต่ละมุมคือระยะทางของด้านเริ่มต้นหนึ่งของกล่องหารด้วยอินพุต . ทำต่อไปด้านในของลวดลายจนกว่าระยะทางจากมุมที่ระบุจะยาวกว่าความยาวของด้านถัดไป

กฎระเบียบ

  • คุณไม่สามารถใช้บิวด์อินสำหรับการสร้างเกลียวนี้ แต่คุณอาจใช้บิวด์อินประมวลผลภาพ
  • หากคุณเขียนลงดิสก์คุณจะต้องส่งรูปภาพใน. jpg, .gif, .tiff, .pbm, .ppm และ. png ใด ๆ
  • ความยาวด้านเริ่มต้นต้องมีอย่างน้อย 500 พิกเซล
  • มุมเริ่มต้นอาจเป็นมุมใดก็ได้ที่คุณเลือก
  • และเช่นเคยช่องโหว่มาตรฐานจะไม่ได้รับอนุญาต


เกลียวขั้นต่ำนี้ต้องมีระดับขั้นต่ำหรือไม่?
LegionMammal978

@ LegionMammal978 ฉันจะไม่ขอข้อมูลที่มากกว่า 25 ฉันจะเพิ่มที่
Addison Crump

การรวม. pbm หรือ. ppmอาจช่วยให้ภาษากราฟิกบางอย่างน้อยลง
trichoplax

คำตอบ:


12

รองเท้า (ทับทิม) 163 ไบต์

Shoes เป็นชุดเครื่องมือ GUI ที่ใช้ทับทิม

Shoes.app{n=ask('').to_f
r=s=5E2
a=[0,s*i="i".to_c,s*i+s,s,0]
(q=a[-3]-a[-4]
r=q.abs/s*n
a<<a[-4]+q/r)while r>1
1.upto(a.size-1){|j|line *(a[j-1].rect+a[j].rect)}}

Ungolfed

Shoes.app{ 
  n=ask('').to_f                 #Open a dialog box with no message, get n from user
  r=s=5E2                        #Initialize s to sidelength=500. r can be initialized to any vale, we use the same one for convenience.
  a=[0,s*i="i".to_c,s*i+s,s,0]   #intialize array a with 5 points needed to draw a square, in complex number format (first point=0 is duplicated.)

  (
    q=a[-3]-a[-4]                #find the vector from point plotted 4 before to the following point (plotted 3 before)
    r=q.abs/s*n                  #r is the scale factor
    a<<a[-4]+q/r                 #add a new point derived from a[-4] by moving toward a[-3] by a distance s/n 
  )while r>1                     #break loop when length of line is less than s/n

  1.upto(a.size-1){|j|           #for all points except 1st and last one
    line *(a[j-1].rect+a[j].rect)#take the two complex numbers correspondimg to the current and previous point,
  }                              #convert to 2-element arrays (rectangular coordinates
}                                #combine to make a 4-element array, use * to splat into 4 parameters, and draw using the line method.

เอาท์พุท n = 4 และ n = 25

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

โปรดทราบว่ารูปร่างจะสิ้นสุดในรูปสามเหลี่ยมเสมอซึ่งจะยุบลงไปอีกหนึ่งบรรทัด การแทนที่size-1ด้วยsizeไม่ได้สร้างความแตกต่างให้กับรูปลักษณ์ของเอาท์พุทและจะช่วยประหยัด 2 ไบต์ แต่ฉันทิ้งไว้เพื่อความถูกต้องทางทฤษฎี

เอาท์พุท n = 300

แรงบันดาลใจจากความคิดเห็นโดย OP ตัวเลขที่สูงขึ้นจะดูดีมาก!

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


lineจำเป็นต้องใช้ช่องว่างในบรรทัดล่างหรือไม่?
Addison Crump

@CoolestVeto น่าเสียดายใช่ การ*แปลงอาร์เรย์องค์ประกอบสี่ที่เกิดขึ้นจากการแปลงของจำนวนเชิงซ้อนเป็นพารามิเตอร์สี่lineตัว ไวยากรณ์มาตรฐานคือline(*(a[j-1].rect+a[j].rect))การลบวงเล็บและเพิ่มช่องว่างแล้วประหยัดหนึ่งไบต์ การลบพื้นที่ออกทำให้ Ruby พยายามคูณlineด้วยเนื้อหาของวงเล็บซึ่งไม่มีเหตุผลและทำให้เกิดข้อผิดพลาด มีการตีกอล์ฟให้ทำที่นี่ไม่ใช่แค่นั้น ฉันจะดูในภายหลัง
เลเวลริเวอร์เซนต์

ฉันเกือบจะแน่ใจว่าคุณสามารถกำจัด parens รอบ ๆ อาร์กิวเมนต์uptoได้ นอกจากนี้คุณได้ลองลบ('')หลังจากask? ฉันยังไม่ได้ทดสอบ แต่อาจไม่จำเป็น
คดีของกองทุนโมนิกา

3
เอาท์พุท 100 เป็นที่สวยงาม
Addison Crump

1
@CoolestVeto ฉันพบว่า n = 100 รบกวนเล็กน้อย มันกระโดดออกมาและไป 3D ทั้งหมดกับฉัน ฉันโพสต์ n = 300 ซึ่งมืดกว่าโดยรวมและสงบขึ้น
เลเวลริเวอร์เซนต์

3

Java, 1056 1005 985 948 522 508 507 504 502 501 493 492 488 474 465 458 ไบต์

import java.awt.*;interface G{static void main(String[]a){new Frame(){int s=499,o=s,e,i,x,y;{o/=new Float(a[0]);add(new Component(){public void paint(Graphics g){g.drawRect(0,0,s,s);int[]p={s,s,s,0,0,0,0,s};for(double d=s,t;d>o;t=o/d,i=e*2,x=(int)((1-t)*p[i]+t*p[(2+i)%8]+.5),y=(int)((1-t)*p[1+i]+t*p[(3+i)%8]+.5),g.drawLine(p[(6+i)%8],p[(7+i)%8],x,y),p[i]=x,p[1+i]=y,e=++e%4,i=e*2,x=p[(2+i)%8]-p[i],y=p[(3+i)%8]-p[1+i],d=Math.sqrt(x*x+y*y));}});show();}};}}

ขอบคุณ CoolestVeto และ ECS สำหรับวิธีการอื่นในการลดขนาด :-)


ตกลงฉันเล่นกอล์ฟลงเล็กน้อย แต่มีความเป็นไปได้มากกว่าแน่นอนฉันเขียนโค้ดเชิงวัตถุเกินกว่าที่จะเป็นตัวละครแบบเรียบง่าย :-D
แวมไพร์

@AlexA หากฉันปรับปรุงโค้ดของฉันในภายหลังและทำให้สั้นลงฉันจะสามารถอัปเดตโพสต์ด้วยเวอร์ชันที่สั้นกว่าได้หรือไม่
แวมไพร์

@ BjörnKautler Yup มันดีนะ! :) ฉันกำลังทำงานกับสถานที่ไม่กี่แห่งเพื่อร่นในขณะนี้
Addison Crump

1
@ BjörnKautlerคุณทำได้อย่างแน่นอน!
Alex A.

1
ว้าวฉันไม่เคยเห็นคำตอบมากกว่า 500 ไบต์ : O
Addison Crump

1

Groovy, 412 411 403 398 ไบต์

import java.awt.*
new Frame(){
def s=499,o=s/(args[0]as float),e=0,i,a,b,d,t
{add new Component(){void paint(Graphics g){g.drawRect 0,0,s,s
p=[s,s,s,0,0,0,0,s]
for(d=s;d>o;d=Math.sqrt(a*a+b*b)){t=o/d
i=e*2
a=(int)((1-t)*p[i]+t*p[(2+i)%8]+0.5)
b=(int)((1-t)*p[1+i]+t*p[(3+i)%8]+0.5)
g.drawLine p[(6+i)%8],p[(7+i)%8],a,b
p[i]=a
p[1+i]=b
e=++e%4
i=e*2
a=p[(2+i)%8]-p[i]
b=p[(3+i)%8]-p[1+i]}}}
show()}}

ฉันมีปัญหาที่จะทำให้มันทำงานด้วยแรงมาก 2.4.4: Caught: groovy.lang.MissingMethodException: No signature of method: static s.div() is applicable for argument types: (java.lang.Float) values: [25.0] Possible solutions: is(java.lang.Object), wait(), run(), run(), find(), any() groovy.lang.MissingMethodException: No signature of method: static s.div() is applicable for argument types: (java.lang.Float) values: [25.0] Possible solutions: is(java.lang.Object), wait(), run(), run(), find(), any() at s$1.<init>(s.groovy:3) at s.run(s.groovy:2)
Dieter

ด้วย 2.3.9 มันใช้งานได้ดีสำหรับฉัน
แวมไพร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.