ฉันต้องการรูปสี่เหลี่ยมขนมเปียกปูนจริงๆ แต่ทั้งหมดที่ฉันได้รับคือสี่เหลี่ยมผืนผ้าอันโง่เขลานี้


33

ได้รับเพียงระนาบและเข็มทิศให้เขียนสี่เหลี่ยมขนมเปียกปูนภายในสี่เหลี่ยมที่กำหนดแบ่งปันสองจุดที่ตรงกันข้าม

รูปสี่เหลี่ยมขนมเปียกปูนในรูปสี่เหลี่ยมผืนผ้า

อินพุต

อินพุตคือขนาดของสี่เหลี่ยมผืนผ้า 125, 50ในตัวอย่างที่แสดงว่าจะ คุณสามารถป้อนข้อมูลด้วยวิธีใดก็ได้ที่สะดวกที่สุด (เป็นจำนวนเต็มสองรายการรายการสตริง ฯลฯ )

มิติที่ใหญ่กว่าจะเป็น 100 ขั้นต่ำในขณะที่ขนาดเล็กกว่าจะน้อยกว่า 25 ทั้งสองขีดที่ 200

เอาท์พุต

เอาท์พุทจะเป็นภาพ (แสดงบนหน้าจอหรือบันทึกเป็นไฟล์) แสดง

  • สี่เหลี่ยมอินพุต
  • เส้น / แวดวง "ที่ทำงาน" ทั้งหมด
  • รูปสี่เหลี่ยมขนมเปียกปูนที่จารึกไว้

ในสีที่แตกต่าง ในภาพด้านบนสี่เหลี่ยมผืนผ้าเป็นสีดำสีน้ำเงินทำงานและส้มรูปสี่เหลี่ยมขนมเปียกปูน ควรวาดเส้นตามลำดับที่แสดงในรายการ (เช่นรูปสี่เหลี่ยมขนมเปียกปูนเขียนทับเส้นทำงานและสี่เหลี่ยม)

ภาพที่ส่งออกจะต้องมีขนาดใหญ่พอที่จะมีทุกอย่าง ตัวอย่างเช่นวงกลมที่แสดงไม่สามารถออกนอกขอบเขตได้

วิธี

วิธีที่ใช้ในภาพตัวอย่างด้านบนคือ:

  • วาดวงกลมโดยใช้มุมซ้ายล่างเป็นจุดศูนย์กลางและด้านบนขวาเป็นจุดบนเส้นรอบวงทำให้รัศมีเท่ากับเส้นทแยงมุมของสี่เหลี่ยมผืนผ้า
  • ทำเช่นเดียวกัน แต่สลับจุดกึ่งกลางและเส้นรอบวง
  • ลากเส้นระหว่างจุดตัดของวงกลมทั้งสองให้เส้นแบ่งครึ่งตั้งฉากกับเส้นทแยงมุมของสี่เหลี่ยมผืนผ้า
  • ใช้ทางแยกของบรรทัดใหม่และสี่เหลี่ยมผืนผ้าเพื่อวาดรูปสี่เหลี่ยมขนมเปียกปูน

มันใช้งานได้เพราะเส้นทแยงมุมภายในของรูปสี่เหลี่ยมขนมเปียกปูนมักตั้งฉากกับกันและกัน แต่ฉันไม่ได้รวมหลักฐานทั้งหมดของเรื่องนี้ไว้ที่นี่

นี่ไม่ใช่วิธีเดียวที่จะได้รับรูปสี่เหลี่ยมขนมเปียกปูนของคุณและคุณสามารถใช้วิธีอื่นได้เนื่องจากคุณจะอธิบายสิ่งที่คุณกำลังทำ ฉันเชื่อว่าอาจเป็นวิธีที่ง่ายที่สุด

กฎระเบียบ

คุณสามารถวาดวงกลมและเส้นเท่านั้น (หรือมากกว่านั้นคือส่วนของเส้น) วงกลมถูกกำหนดด้วยจุดกึ่งกลางและจุดรอบนอก เส้นถูกกำหนดโดยจุดสองจุดใด ๆ เส้นไม่จำเป็นต้องมีความยาวที่ระบุ แต่อย่างน้อยต้องครอบคลุมจุดที่กำหนด (สังเกตภาพตัวอย่าง: เส้นจะผ่านไปเล็กน้อยที่จุดตัดของวงกลม แต่ไม่ถึงขอบ) สำหรับแวดวงรัศมีจากกึ่งกลางถึงจุดที่กำหนดนั้นถือว่าเป็นสายการทำงานและจะต้องแสดง

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

ไม่มีการโกง! คุณสามารถกำหนดตำแหน่งของจุด / บรรทัด / วงกลมโดยใช้สิ่งที่คุณได้สร้างไว้แล้วเท่านั้น หากคุณไม่สามารถอธิบายวิธีใช้เส้น / วงกลมที่ทำงานเพื่อแสดงว่าเป็นรูปสี่เหลี่ยมขนมเปียกปูนแสดงว่าคุณทำผิด

คุณสามารถใช้จุดตรงข้ามคู่ใดก็ได้ที่คุณต้องการและสี่เหลี่ยมไม่จำเป็นต้องวาดให้อยู่ในแนวแกนตราบใดที่เอาต์พุตถูกต้อง

อินพุตจะเป็นรูปสี่เหลี่ยมผืนผ้าที่ไม่ได้เป็นรูปสี่เหลี่ยมเสมอดังนั้นไม่ต้องกังวลกับเคสพิเศษ

สุดท้ายนี้คือรหัสกอล์ฟมาตรฐานดังนั้นขนาดที่ต่ำที่สุดในหน่วยไบต์ชนะ


เราสามารถใช้สูตรทางคณิตศาสตร์ในการตัดสินใจได้เช่นจุดสิ้นสุดของเส้นที่ลากระหว่างจุดตัดของวงกลมเมื่อวาดเสร็จแล้ว
ETHproductions

@ ETHproductions ฉันจะบอกว่าใช่เพราะมันค่อนข้างง่ายที่จะแสดงว่ามุมระหว่างพวกมันกับรัศมีนั้นอยู่ที่ 60 องศาในแต่ละด้านและมันเป็นรูปสามเหลี่ยมด้านเท่า หากใครมีข้อโต้แย้งฉันก็ยินดีที่จะรับฟัง
Geobits

3
เราสามารถสมมติว่าอินพุตแรกจะมากกว่าวินาทีที่สอง (หรือกลับกัน) หรือคำตอบต้องสามารถจัดการกับสี่เหลี่ยมทั้งแนวตั้งและแนวนอนได้หรือไม่?
Martin Ender

จุดประสงค์ของส่วนของเส้นสั้นภายในสี่เหลี่ยมคืออะไร?
12Me21

คำตอบ:


11

HTML + JavaScript (ES6), 34 + 353 = 387 ไบต์

[125,50]การป้อนข้อมูลควรจะได้รับในรูปแบบ

[w,h]=eval(prompt(c=C.getContext("2d"))).sort();d=q=>(c.strokeStyle=q,b);l=(x,y=Z)=>x?c.lineTo(x,y)||l:c.stroke();b=(x,y=H,r)=>(c.beginPath(),r?c.arc(x,y,Math.sqrt(r),0,2*Math.PI):c.moveTo(x,y),l);b(Z=300,Z)(W=Z+w)(W,H=Z+h)(Z,H)(Z)();d`red`(Z,H,s=w*w+h*h)();b(W,Z,s)();b(Z)(W)();b(Z+w/2-h,Z+h/2-w)(H+w/2,W+h/2)();d`lime`(Z)(W-s/2/w)(W)(Z+s/2/w,H)(Z,H)()
<canvas id=C width=800 height=800>

คณิตศาสตร์และการวาดภาพจำนวนมาก ... สี่เหลี่ยมถูกวาดไปด้านข้างถ้าความสูงมากกว่าความกว้างซึ่งฉันเชื่อว่าได้รับอนุญาต


Oooh น้อยกว่า 10 ไบต์444: P
Kritixi Lithos

@KritixiLithos ตอนนี้ฉันน้อยกว่า 10 ไบต์400;-)
ETHproductions

รูปสี่เหลี่ยมผืนผ้าจะถูกจารึกไว้ในรูปสี่เหลี่ยมขนมเปียกปูนเมื่อความสูงมากกว่าความกว้าง
Larkeith

1
@Larkeith โอ๊ะไม่รู้ว่าเราต้องครอบคลุมกรณีเหล่านั้น แก้ไขที่ราคา 42 ไบต์
ETHproductions

คุณสามารถใช้ "getContext` 2d `" (โดยไม่มีช่องว่าง) เพื่อบันทึกสองสามไบต์ (เพราะเหตุใดพวกเขาจึงต้องใช้ `และทำลาย
เครื่องหมาย

10

Mathematica, 157 148 158 bytes

ขอบคุณ Martin Ender สำหรับความคิดเห็นที่มีคุณภาพสูงตามปกติ! บันทึก 9 ไบต์ในกรณีนี้

แก้ไขเมื่อมีการชี้แจงว่าการขัดแย้งสามารถเกิดขึ้นได้ตามลำดับ เพิ่ม 10 ไบต์เพื่อชดเชย

Graphics@{(m=Line)@{o=0{,},{#,0},c={##},{0,#2},o},Blue,m[l={o,c}],Circle[#,(c.c)^.5]&/@l,m[{k={#2,-#},-k}+{c,c}/2],Red,m@{o,p={0,c.c/2/#2},c,c-p,o}}&@@Sort@#&

อีกครั้งนี่คือที่ Mathematica ส่องสว่าง: เอาต์พุตกราฟิกระดับสูงที่เกี่ยวข้องกับการคำนวณทางคณิตศาสตร์ รหัสเดียวกันกับช่องว่างและบรรทัดใหม่สำหรับการอ่านของมนุษย์:

Graphics@{
  (m=Line)@{o = 0{,}, {#, 0}, c = {##}, {0, #2}, o},
  Blue, m[l = {o, c}], Circle[#, (c.c)^.5] & /@ l, 
  m[{k = {#2, -#}, -k} + {c, c}/2],
  Red, m@{o, p = {c.c/2/#2, 0}, c, c - p, o}
} & @@ Sort@# &

ฟังก์ชันที่ไม่มีชื่อของอาร์กิวเมนต์เดี่ยวซึ่งเป็นคู่ที่สั่งของตัวเลขบวก การ@@ Sort@# &แปลงสุดท้ายที่จับคู่เป็นอาร์กิวเมนต์ตัวเลขสองตัวโดยที่หมายเลขแรกมีขนาดเล็กกว่า Lineสร้างเส้นทางรูปหลายเหลี่ยมจากจุดหนึ่งไปยังอีกจุดหนึ่งซึ่งจะกลายเป็นรูปหลายเหลี่ยมแบบปิดหากจุดแรกและจุดสุดท้ายเหมือนกัน Circleสร้างวงกลมที่มีศูนย์กลางและรัศมีที่กำหนด จุดพิเศษoและc(มุมล่างซ้ายและมุมขวาบน), p(มุมสี่เหลี่ยมขนมเปียกปูนที่สามที่กำหนดโดยสูตรทางคณิตศาสตร์) และk(ช่วยในการวาดเส้นแบ่งครึ่งตั้งฉาก) จะได้รับชื่อตามวิธีการบันทึกไบต์เมื่อเรียกอีกครั้ง เช่นเดียวกับคะแนนพิเศษคู่l = {o,c}. Mathematica ยินดีที่จะเพิ่มคะแนนโดยตรงคูณพิกัดทั้งสองด้วยปัจจัยเดียวกันนำผลิตภัณฑ์ดอทของพวกเขา ฯลฯ ซึ่งทั้งหมดนี้ทำให้รหัสง่ายขึ้น

เอาต์พุตตัวอย่างพร้อมอาร์กิวเมนต์125และ50:

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


1
Re whitespace ที่ไม่จำเป็น คุณสามารถใช้เคล็ดลับนี้{0,0}จะบันทึกไบต์บน เนื่องจากมีความต้องการที่จะใช้สีฟ้าและสีส้มไม่มีคุณสามารถบันทึกไบต์โดยใช้แทนRed Orangeคุณใช้Lineสี่ครั้งซึ่งเกินพอที่จะบันทึกไบต์จากi=Line;(ตามกฎทั่วไปหากนิพจน์มีnอักขระและคุณใช้mเวลาเท่าที่คุณต้องการ(m-1)*(n-1) > 4น้อยกว่าหากคุณสามารถกำหนดตัวแปรระหว่างการใช้ครั้งแรกโดยไม่ต้องใช้วงเล็บ)
Martin Ender

ว่า0{,}เคล็ดลับที่เป็นที่ยอดเยี่ยม: D
เกร็กมาร์ติน

ฉันกลัวว่านี่จะไม่ทำงานหากด้านที่สองยาวกว่าครั้งแรก อย่างไรก็ตามการวางแนวไม่จำเป็นต้องสอดคล้องกันดังนั้นสิ่งนี้สามารถแก้ไขได้โดยการต่อท้าย@@Sort@#&และสลับ#และ#2ตลอดทั้งรหัสหรือปรับให้ทำงานกับสี่เหลี่ยมแนวตั้งแทน
Martin Ender

ใช่นั่นเป็นเจตนา ... ดูเหมือนว่าเรากำลังรอคำอธิบายว่าเราสามารถสันนิษฐานได้ว่ามิตินั้นอยู่ในลำดับที่เราต้องการหรือไม่
Greg Martin


9

MetaPost, 473 (มีสี) 353 (ไม่มีสี)

มีสี (473 ไบต์):

A:=170;B:=100;pair X,Y;path C,D,E,F,G,R,T;X=(0,0);Y=(A,B);R=X--(A,0)--Y--(0,B)--cycle;T=(0,B)--(A,B);draw R;E=X--Y;C=X..Y*2..cycle;D=Y..-Y..cycle;F=(D intersectionpoint C)--(C intersectionpoint D);draw C withcolor green;draw D withcolor green;draw E withcolor red;draw F withcolor red;draw (F intersectionpoint R)--Y withcolor blue;draw X--(F intersectionpoint T) withcolor blue;draw (F intersectionpoint T)--Y withcolor blue;draw (F intersectionpoint R)--X withcolor blue;

ไม่มีสี (353 ไบต์):

A:=170;B:=100;pair X,Y;path C,D,E,F,G,R,T;X=(0,0);Y=(A,B);R=X--(A,0)--Y--(0,B)--cycle;T=(0,B)--(A,B);draw R;E=X--Y;C=X..Y*2..cycle;D=Y..-Y..cycle;F=(D intersectionpoint C)--(C intersectionpoint D);draw C;draw D;draw E;draw F;draw (F intersectionpoint R)--Y;draw X--(F intersectionpoint T);draw (F intersectionpoint T)--Y;draw (F intersectionpoint R)--X;

ไม่เคยใช้มันมาก่อนและฉันแน่ใจว่าฉันฆ่ามัน ...
แต่เมื่อคุณเรียกใช้บนเว็บไซต์นี้:

http://www.tlhiv.org/mppreview/

มันใช้จุดตัดของวงกลมเพื่อวาดแกนที่สองจากนั้นใช้จุดตัดของแกนและสี่เหลี่ยมเพื่อวาดรูปสี่เหลี่ยมขนมเปียกปูนสุดท้าย แม้ว่าฉันจะสามารถโกงและวาดเส้นตั้งฉากกับแกนแรกฮ่าฮ่า

หากต้องการเปลี่ยนขนาดเพียงแก้ไข A และ B

ไม่ว่าคุณจะลงเอยด้วย (สำหรับ L = 170, H = 100):

ภาพ


3

Desmos, 375 (หรือ 163) ไบต์

w=125
h=50
\left(wt,\left[0,h\right]\right)
\left(\left[0,w\right],ht\right)
\left(x-\left[0,w\right]\right)^2+\left(y-\left[0,h\right]\right)^2=w^2+h^2
\frac{h}{w}x\left\{0\le x\le w\right\}
-\frac{w}{h}\left(x-\frac{w}{2}\right)+\frac{h}{2}
a=\frac{h^2}{2w}+\frac{w}{2}
\left(t\left(w-a\right)+\left[0,1\right]a,ht\right)
\left(at-\left[0,a-w\right],\left[0,h\right]\right)

wและhเป็นอินพุต ลองใช้กับ Desmos!

รุ่น 163 ไบต์อื่น:

w=125
h=50
(wt,[0,h])
([0,w],ht)
(x-[0,w])^2+(y-[0,h])^2=w^2+h^2
hx/w\left\{0\le x\le w\right\}
-w(x-w/2)/h+h/2
a=h^2/2/w+w/2
(t(w-a)+[0,1]a,ht)
(at-[0,a-w],[0,h])

รุ่นนี้ต้องการให้คัดลอกและวางแต่ละบรรทัดในแต่ละบรรทัดแยกกันใน Desmos Meta ยังคงต้องตัดสินใจว่านี่เป็นวิธีการนับที่ถูกต้องหรือไม่ แต่วิธีการเดิมนั้นใช้ได้ดี


ดูเหมือนว่าจะสมมติว่าสี่เหลี่ยมผืนผ้าอินพุตนั้นอยู่ในแนวนอนซึ่งไม่ได้ระบุไว้ในงาน
Henning Makholm

1
สำหรับฉัน "สี่เหลี่ยมผืนผ้าไม่จำเป็นต้องถูกจัดเรียงตามแนวแกน" หมายความว่าไม่มีการวางแนวที่กำหนดไว้ล่วงหน้าในสี่เหลี่ยมผืนผ้ารวมถึงแนวนอนและแนวตั้งที่ต้องรักษาไว้
Greg Martin

เนื่องจากมีการกำหนดขนาดเท่านั้น (ไม่ใช่พิกัด) เอาต์พุตอาจถูกจัดตำแหน่งตามที่คุณต้องการสมมติว่าขนาดถูกต้อง
Geobits

ครั้งแรกที่ฉันเห็น Desmos ถูกนำมาใช้เป็นภาษาที่เล่นกอล์ฟ :)
Kritixi Lithos

3

ImageMagick เวอร์ชั่น 7.0.3 + bash + sed, 496 ไบต์

M=magick
L=$((400-$(($1))/2)),$((400+$(($2))/2))
R=$((400+$(($1))/2)),$((400-$(($2))/2))
Z=" $L $R" Y=" -1 x";D=' -draw' K=' -stroke'
A=' -strokewidth 3 +antialias -fill'
$M xc:[800x]$A none$K \#000$D "rectangle$Z"$D "line$Z"$K \#00F8$D "circle$Z"$K \#0F08$D "circle $R $L" -depth 8 png:a
$M a txt:-|sed "/38C/!d;s/:.*//">x;P=`head$Y`;Q=`tail$Y`
$M a$A \#F008$K \#F008$D "line $P $Q" b
$M b txt:-|sed "/C70/!d;s/:.*//">x;S=`head$Y`;T=`tail$Y`
$M b$A \#F804$K \#F80$D "polyline $L $S $R $T $L" x:

ผลลัพธ์ด้วย "rhombus.sh 180 120"

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

แม่นยำยิ่งขึ้น (ใช้ผ้าใบ 6400x6400 แทนที่จะเป็น 800x800), 570 ไบต์

ทางแยกนั้นไม่ถูกต้อง คำสั่ง "strokewidth" ทำให้เส้นกว้างพอที่จะทำให้แน่ใจว่าอย่างน้อยหนึ่งพิกเซลทั้งหมดได้รับการผสมกับสีของทั้งสองเส้นตัดกัน แต่ในกรณีที่เลวร้ายที่สุด (25x200 และ 200x25) การข้ามเป็นมุมเล็กดังนั้นเมฆ ของพิกเซลผสมมีความยาวหลายพิกเซลและเนื่องจากเราเลือกพิกเซลผสมแรกและพิกเซลสุดท้ายจึงมีข้อผิดพลาดเล็กน้อย การใช้ผืนผ้าใบขนาดใหญ่ขึ้น 8 เท่าที่มีระยะห่างเท่ากันจากนั้นขยายขนาดผลลัพธ์จะช่วยลดข้อผิดพลาดให้น้อยกว่าหนึ่งพิกเซล แต่มีการปรับเวลาประมาณ 64x

M=magick
L=$((3200-$(($1))*4)),$((3200+$(($2))*4))
R=$((3200+$(($1))*4)),$((3200-$(($2))*4))
K=-stroke;A='-strokewidth 3 +antialias'
$M xc:[6400x] $A -fill none $K \#000 -draw "rectangle $L $R" \
-draw "line $L $R" $K \#00F8 -draw "circle $L $R" \
$K \#0F08 -draw "circle $R $L" -depth 8 png:a 
$M a txt:-|grep 38C077|sed -e "s/:.*//p">x
P=`head -1 x`;Q=`tail -1 x`
$M a $A -fill \#F008 $K \#F008 -draw "line $P $Q" png:b
$M b txt:-|grep C70000|sed -e "s/:.*//p">x
S=`head -1 x`;T=`tail -1 x`
$M b $A -fill \#F804 $K \#F80 -draw "polyline $L $S $R $T $L" -resize 800 x:

ผลลัพธ์ของปกติ 800x800 และแม่นยำ 6400x6400:

ปกติเทียบกับผลลัพธ์ที่แม่นยำ

Ungolfed:

# rhombus.sh
# Inscribe a rhombus in the rectangle with dimensions 2*$1, 2*$2

# Run with "rhombus.sh W H"

M=magick

W=${1:-100};H=${2:-40}

# L locates the lower left corner of the rectangle
L=$((400-$((W))/2)),$((400+$((H))/2))

# R locates the upper right corner of the rectangle
R=$((400+$((W))/2)),$((400-$((H))/2))

# We'll need this several times
A='-strokewidth 3 +antialias'

# Establish 800x800 canvas (white) (circles + rectangle will
# always fit in 764x764)
#
# Draw the W x H rectangle (black) in center of canvas
#
# Draw two circles (blue, 50% alpha [#00F8] and green, 50% alpha [#0F08])
#  one centered at point L with peripheral point R
#  the other centered at point R with peripheral point L

$M xc:[800x] $A -fill none \
       -stroke \#000  -draw "rectangle $L $R" \
                      -draw "line      $L $R" \
       -stroke \#00F8 -draw "circle    $L $R" \
       -stroke \#0F08 -draw "circle    $R $L" \
       -depth 8 a.png 

# Find P and Q, the 2 intersections of the circles,
# that have mixed color #38C077 
$M a.png txt:-|grep 38C077|sed -e "s/:.*//p">x
P=`head -1 x`;Q=`tail -1 x`

# Draw line connecting the intersections P and Q
$M a.png $A -fill \#F008 -stroke \#F008 -draw "line $P $Q" b.png

# Find S and T, the 2 intersections of the line with the original rectangle,
# that have mixed color #C70000
$M b.png txt:-|grep C70000|sed -e "s/:.*//p">x
S=`head -1 x`;T=`tail -1 x`

# Draw the rhombus
$M b.png $A -fill \#F804 -stroke \#F80 -draw "polyline $L $S $R $T $L" d.png

ฉันชอบวิธีที่คุณตรวจจับทางแยกดีมาก สีผสมสุดท้ายถูกต้องหรือไม่ ฉันถามเพราะดูเหมือนว่ารูปสี่เหลี่ยมขนมเปียกปูนและเส้นสี่เหลี่ยมผืนผ้าปิดเล็กน้อย ฉันคิดว่าบางทีสีอาจถูกตรวจจับในจุดที่เล็กน้อยเนื่องจากการต่อต้านนามแฝง (อาจเป็นความกว้างของเส้นขีดด้วย)
Geobits

2

R, 290 ไบต์

function(A,B,p=polygon){R=A^2+B^2
D=2*A
a=sqrt(R)*cbind(cos(t<-seq(0,2*pi,.01)),sin(t))
b=t(t(a)+c(A,B))
x=range(a,b)
plot(NA,xli=x,yli=x,as=1,ax=F,an=F)
rect(0,0,A,B)
segments(0,0,A,B,c=4)
p(a,b=4)
p(b,b=4)
curve(B/2-A*x/B+A^2/2/B,co=4,a=T)
p(cbind(c((R-2*B^2)/D,A,R/D,0),c(B,B,0,0)),b=3)}

ฟังก์ชั่นไม่ระบุตัวตนเอาท์พุทจะปรากฏบนหน้าจอ ไม่พึงพอใจเล็กน้อยกับความคิดเห็น:

function(A,B){
    R=A^2+B^2
    D=2*A
    t=seq(0,2*pi,.01)
    a=sqrt(R)*cbind(cos(t),sin(t)) #Circle with (0,0) as center
    b=t(t(a)+c(A,B)) #Second circle transposed to (A,B) center
    x=range(a,b)
    #Empty plot, large enough to fit the 2 circles:
    plot(NA,xlim=x,ylim=x,asp=1,axes=F,ann=F)
    rect(0,0,A,B) #Initial rectangle
    segments(0,0,A,B,col=4) #Rectangle diagonal
    polygon(a,border=4) #Circle 1 (border is b thanks to partial matching)
    polygon(b,border=4) #Circle 2
    curve(B/2-A*x/B+A^2/2/B,col=4,add=T) #Line joining circles intersection
    polygon(cbind(c((R-2*B^2)/D,A,R/D,0),c(B,B,0,0)),border=3) #Rhombus
}

ตัวอย่างผลลัพธ์สำหรับ (120,100):

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


2

LibreLogo , 270 ไบต์

การป้อนข้อมูลของผู้ใช้จะนำมาเป็นอาร์เรย์: หรือ[width, height][height, width]

รหัส:

fc [24]
D=180
R=sorted(eval(input "))
W=R[1]
H=R[0]
L=sqrt W**2+H**2
A=D/π*asin(H/L)
Z=A*2
S=L/2/cos A*π/D rectangle[W,H]pc 255 lt A fd 400 bk 800 fd 400 rt A pu bk H/2 lt 90 fd W/2 pd circle L*2 rt D-A fd L circle L*2 pc [5]lt D-A fd S lt Z fd S rt D+Z fd S lt Z fd S

ผล:

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

คำอธิบาย:

fc [24]                        ; Fill Color = Invisible
D = 180                        ; D = 180° (Saved Bytes)
R = sorted( eval( input " ) )  ; R = Sorted Array of Rectangle Width and Height (User Input)
W = R[1]                       ; W = Rectangle Width
H = R[0]                       ; H = Rectangle Height
L = sqrt W**2 + H**2           ; L = Rectangle Diagonal Length
A = D / π * asin( H / L )      ; A = Rectangle Diagonal Angle°
Z = A * 2                      ; Z = Rectangle Diagonal Angle° * 2 (Saved Bytes)
S = L / 2 / cos A * π / D      ; S = Rhombus Side Length
rectangle [W, H]               ; Draw Rectangle
pc 255                         ; Pen Color = Blue
lt A                           ; Left = Rectangle Diagonal Angle°
fd 400                         ; Forward = 400 pt
bk 800                         ; Back = 800 pt
fd 400                         ; Forward = 400 pt
rt A                           ; Right = Rectangle Diagonal Angle°
pu                             ; Pen Up
bk H / 2                       ; Back = Rectangle Height / 2
lt 90                          ; Left = 90°
fd W / 2                       ; Forward = Rectangle Width / 2
pd                             ; Pen Down
circle L * 2                   ; Draw Left Circle (Radius = Rectangle Diagonal Length)
rt D - A                       ; Right = 180° - Rectangle Diagonal Angle°
fd L                           ; Forward = Rectangle Diagonal Length
circle L * 2                   ; Draw Right Circle (Radius = Rectangle Diagonal Length)
pc [5]                         ; Pen Color = Red
lt D - A                       ; Left = 180° - Rectangle Diagonal Angle°
fd S                           ; Forward = Rhombus Side Length
lt Z                           ; Left = Rectangle Diagonal Angle° * 2
fd S                           ; Forward = Rhombus Side Length
rt D + Z                       ; Right = 180° + Rectangle Diagonal Angle° * 2
fd S                           ; Forward = Rhombus Side Length
lt Z                           ; Left = Rectangle Diagonal Angle° * 2
fd S                           ; Forward = Rhombus Side Length

1

Python 3.5 + Tkinter, 433 หรือ 515 ไบต์

ไม่มีสี (433 ไบต์):

from tkinter import*
def V(a,b):S=500;Y,Z=S+a,S-b;M=(a**2+b**2)**0.5;D=Tk();C=Canvas(D);B=C.create_oval;X=C.create_line;B(S+M,S-M,S-M,S+M);B(Y-M,Z+M,Y+M,Z-M);X(Y,Z,S,S);C.create_rectangle(Y,S,S,Z);Q=-((Z-S)/(Y-S))**-1;U,V=(Y+S)/2,(Z+S)/2;X(U+M,V+M*Q,U-M,V-M*Q);P=[(Y,Q*(Y-U)+V),(((Z-V)/Q)+U,Z)][a>b];L=[(S,Q*(S-U)+V),(((S-V)/Q)+U,S)][a>b];X(S,S,P[0],P[1]);X(Y,Z,P[0],P[1]);X(Y,Z,L[0],L[1]);X(S,S,L[0],L[1]);C.pack(fill=BOTH,expand=1)

มีสี (515 ไบต์):

from tkinter import*
def V(a,b):S=500;t='blue';Y,Z=S+a,S-b;M=(a**2+b**2)**0.5;D=Tk();C=Canvas(D);B=C.create_oval;X=C.create_line;B(S+M,S-M,S-M,S+M,outline=t);B(Y-M,Z+M,Y+M,Z-M,outline=t);X(Y,Z,S,S,fill=t);C.create_rectangle(Y,S,S,Z);Q=-((Z-S)/(Y-S))**-1;U,V=(Y+S)/2,(Z+S)/2;X(U+M,V+M*Q,U-M,V-M*Q,fill=t);P=[(Y,Q*(Y-U)+V),(((Z-V)/Q)+U,Z)][a>b];L=[(S,Q*(S-U)+V),(((S-V)/Q)+U,S)][a>b];o='orange';X(S,S,P[0],P[1],fill=o);X(Y,Z,P[0],P[1],fill=o);X(Y,Z,L[0],L[1],fill=o);X(S,S,L[0],L[1],fill=o);C.pack(fill=BOTH,expand=1)

ฟังก์ชันที่ระบุชื่อซึ่งรับอินพุตเป็นตัวเลข 2 ตัวคั่นด้วยเครื่องหมายจุลภาค เอาต์พุตถูกกำหนดในหน้าต่างแยกต่างหากซึ่งคุณอาจต้องปรับขนาดเพื่อดูเอาต์พุตเต็ม นี่คือตัวอย่างเอาต์พุตสีสำหรับV(180,130):

ตัวอย่างผลลัพธ์


0

SmileBASIC ขนาด 280 ไบต์

INPUT W,H
W=MAX(W,H)/4H=MIN(W,H)/4D=SQR(W*W+H*H)N=D+W
M+D+H
GBOX D,D,N,M,#RED
GCIRCLE D,M,D
GCIRCLE N,D,D
GLINE D,M,N,D
X=D+W/2Y=D+H/2A=ATAN(W,H)E=D*H/W/2S=E*COS(A)T=E*SIN(A)GLINE X-S*9,Y-T*9,X+S*9,Y+T*9GCOLOR-#L
GLINE D,M,X-S,Y-T
GLINE D,M,X+S,M
GLINE N,D,X+S,Y+T
GLINE N,D,X-S,D

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

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