ส่วนขยายรูปหลายเหลี่ยมสัมผัสกัน


11

วาดสิ่งที่มีลักษณะเช่นนี้:

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

ในแง่ที่แม่นยำยิ่งขึ้นให้วาดวงกลมรัศมี r โดยมีความยาว n และเว้นวรรคอย่างสม่ำเสมอเส้น l เชื่อมต่อปลายของเส้นเหล่านี้เพื่อสร้างรูปหลายเหลี่ยมปกติแบบสองด้านใหม่

กฎระเบียบ

r = รัศมีวงกลม
n = จำนวนเส้นสัมผัส - ต้องเว้นระยะเท่ากันทั่ววงกลม (n> = 3)
l = ความยาวด้านข้างของเส้นสัมผัส

สร้างโปรแกรมที่ยอมรับอาร์กิวเมนต์ {r, n, l} และดึงเอาท์พุทที่ต้องการ

หน่วยเป็นพิกเซล

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

ภาพอธิบายได้ด้วยตนเอง

นี่คือโค้ดกอล์ฟดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


ฉันถือว่า n จะเป็น> = 3 มีค่ามากที่สุดหรือไม่? คุณต้องการแทนเจนต์และวงกลมด้วยหรือไม่
MickyT

ใช่ n> = 3, (สี่แยกตกลงถ้า l ไม่ยาวพอ) คุณควรวาดวงกลมและแทนเจนต์ ฉันคิดว่าค่าสูงสุดนั้นโดยทั่วไปแล้วเมื่อผลลัพธ์เป็นวงกลมสีเทา กล่าวอีกนัยหนึ่งค่าสูงสุดคือค่าสูงสุดที่เป็นจริงสำหรับภาพวาดเช่นนี้
ยืด Maniac

หน่วยพิกเซลใช้งานได้หรือไม่หากเราผลิตกราฟิกแบบเวกเตอร์ เพราะในกรณีเช่นนี้พิกเซลค่อนข้างชัดเจน หรือเราต้องผลิตกราฟิกแรสเตอร์
Martin Ender

@ MartinBüttnerคุณอาจเพิกเฉยต่อหน่วยพิกเซลด้วยกราฟิกเวกเตอร์ (แฟนซี) ของคุณหากมีการจัดเรียงบางส่วน (เช่นแกน)
ยืด Maniac

คำตอบ:


5

Mathematica, 135 132 131 123 ไบต์

{r,n,l}=Input[];Graphics[{{0,0}~Circle~r,Line[Join@@Array[{b=(a=r{c=Cos[t=2Pi#/n],s=Sin@t})-l{s,-c},a,b}&,n+1]]},Axes->1>0]

รหัสนี้คาดว่าจะมีการป้อนข้อมูล (ผ่านพรอมต์) ตรงตามที่ระบุไว้ในคำถาม: {100, 6, 150}เช่น มันสร้างกราฟิกแบบเวกเตอร์ดังนั้นฉันจึงรวมแกนตามที่ระบุในข้อคิดเห็นโดย OP

ทั้งสองแทนเจนต์และรูปหลายเหลี่ยมนั้นเป็นแถบเส้นเดี่ยวโดยการข้าม "รูปหลายเหลี่ยมมุมจุดสัมผัสมุมรูปหลายเหลี่ยมมุมรูปหลายเหลี่ยมถัดไปจุดสัมผัสมุมรูปหลายเหลี่ยม ... "

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

หากไม่ใช่เพื่อแกนฉันสามารถทำได้ใน 107 ไบต์:

{r,n,l}=Input[];Graphics@{Circle[],Line[Join@@Array[{b=(a={c=Cos[t=2Pi#/n],s=Sin@t})-l/r{s,-c},a,b}&,n+1]]}

การออมเพิ่มเติม (นอกเหนือจากAxes->1>0) มาจากความจริงที่ว่าตอนนี้ฉันสามารถขายทุกอย่างได้โดยrทำให้การโทรง่ายขึ้นเพื่อCircleให้ได้วงกลมหน่วย


{0,0}~Circle~r
DavidC

@DavidCarraher เฮ้ฉันทำไปแล้วใน 135 ไบต์ แต่ลืมที่จะคัดลอกมันกลับไปไว้ในสมุดบันทึกของฉันดังนั้นมันจึงกลับคืนมาเมื่อฉันเปลี่ยน Unicode ขอบคุณ!
Martin Ender

8

Python ขนาด 133 ไบต์

คำตอบเดียวที่ปฏิบัติตามกฎ "หน่วยเป็นพิกเซล" ...

from turtle import*
c=circle
r,n,l=input()
lt(90)
exec'c(r,360/n);fd(l);bk(l);'*n
fd(l)
lt(towards(-r,0)-180)
c(distance(-r,0),360,n)

เพิ่มexitonclick()ไปยังจุดสิ้นสุดหากคุณไม่ต้องการให้หน้าต่างปิดทันที

เอาท์พุท:

python tangentpoly.py <<< "20, 6, 30":

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

python tangentpoly.py <<< "100, 8, 200":

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


1
for i in n*[0]:c(r,360/n);fd(l);bk(l)->exec'c(r,360/n);fd(l);bk(l)'*n;
isaacg


7

T-SQL 440 483

จะไม่ชนะรางวัลใด ๆ กับอันนี้ แต่ฉันชอบวาดรูป :)

แก้ไขคำย่อ! เพิ่งสังเกตว่าฉันทำผิดพลาดกับรูปหลายเหลี่ยมที่วาดข้ามวงกลม คงที่ค่าใช้จ่าย

SELECT Geometry::UnionAggregate(Geometry::Point(0,0,0).STBuffer(@r).STExteriorRing().STUnion(Geometry::STGeomFromText(CONCAT('LINESTRING(',@r*SIN(a),' ',@r*COS(a),',',@r*SIN(a)+@l*SIN(b),' ',@r*COS(a)+@l*COS(b),')'),0))).STUnion(Geometry::ConvexHullAggregate(Geometry::Point(@r*SIN(a)+@l*SIN(b),@r*COS(a)+@l*COS(b),0)).STExteriorRing())p FROM(SELECT RADIANS(360./@*N)a,RADIANS((360./@*N)-90)b FROM(SELECT TOP(@)row_number()OVER(ORDER BY(SELECT\))-1N FROM sys.types a,sys.types b)t)r

ดำเนินการกับตัวแปรดังต่อไปนี้

declare @r float = 1.0
declare @ int = 10
declare @l float = 3.0

เรียกใช้ใน Sql Server Management Studio 2012 ขึ้นไปซึ่งจะส่งคืนสิ่งต่อไปนี้ในแท็บผลลัพธ์เชิงพื้นที่ ป้อนคำอธิบายรูปภาพที่นี่

กับ

declare @r float = 1.0
declare @ int = 360
declare @l float = 3.0

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

กับ

declare @r float = 10.0
declare @ int = 3
declare @l float = 10.0

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

ขยายออก

SELECT Geometry::UnionAggregate(    --group together lines
    Geometry::Point(0,0,0)          --Set origin
    .STBuffer(@r)                   --Buffer to @r
    .STExteriorRing()               --Make it a line
    .STUnion(                       --Join to the floowing tangent
        Geometry::STGeomFromText(   --Create a tangent line
            CONCAT('LINESTRING(',@r*SIN(a),' ',@r*COS(a),',',@r*SIN(a)+@l*SIN(b),' ',@r*COS(a)+@l*COS(b),')'),0)
        )
    ).STUnion( --Generate polygon around exterior points
    Geometry::ConvexHullAggregate(Geometry::Point(@r*SIN(a)+@l*SIN(b),@r*COS(a)+@l*COS(b),0)).STExteriorRing()
    )
    p
FROM(
    SELECT RADIANS(360./@*N)a,      --calclate bearings
        RADIANS((360./@*N)-90)b
    FROM(                           --make enough rows to draw tangents
        SELECT TOP(@)row_number()OVER(ORDER BY(SELECT\))-1N 
        FROM sys.types a,sys.types b
        )t
    )r 

5

MATLAB - 233 ไบต์

function C(n,r,l),t=2*pi/n;c=cos(t);s=sin(t);M=[c,s;-s,c];F=@(y)cell2mat(arrayfun(@(x){M^x*y},1:n));P=F([0;r]);Q=F([l;r]);v='k';t=1e3;t=2*pi/t*(0:t);R=[1:n 1];q=Q(1,R);s=Q(2,R);plot(r*cos(t),r*sin(t),v,[P(1,R);q],[P(2,R);s],v,q,s,v);

ฟังก์ชั่นเอาท์พุทตัวอย่างสำหรับn = 8, r = 4, l = 6(รวมแกนเพื่อระบุความยาวของหน่วย): เอาท์พุท circpoly

ฟังก์ชั่นเอาท์พุทตัวอย่างสำหรับn = 1024, r = 4, l = 2: เอาท์พุท circpoly


ฉันกำลังหยิบของ แต่หน่วยเป็นพิกเซล
Digital Trauma

3
@DigitalTrauma: Ah ไม่ได้สังเกตว่า ตัวเลข MATLAB ไม่มีหน่วยที่แน่นอน พวกเขาปรับขนาดไปที่หน้าต่าง และเป็นจุดที่สงสัยอยู่แล้ว โซลูชันที่ใช้โลโก้ของคุณใน Python ได้ผลงานที่ยอดเยี่ยม ก่อนหน้าวันนี้ฉันไม่คิดว่าจะมีใครบางคนโอนโลโก้ไปยัง Python แต่มี ฉันเรียนรู้ไปพร้อม ๆ : P
COTO

+1 กันแล้ว :)
Digital Trauma

ภาพเกือบจะเป็นโลโก้ของรูรับแสง
ภูมิใจ haskeller

4

HTML + JavaScript (E6) 298

ในการทดสอบให้บันทึกเป็นไฟล์ html และเปิดด้วย FireFox แทรกพารามิเตอร์ r, n, l ลงในช่องป้อนข้อมูลคั่นด้วยเครื่องหมายจุลภาคแล้วแท็บออก

หรือลองjsfiddle

<input onblur="
[r,n,l]=this.value.split(','),
z=r-~l,t=D.getContext('2d'),w='lineTo',
D.width=D.height=z*2,
t.arc(z,z,r,0,7);
for(C=1,S=i=0;i++<n;)
  t[w](x=z+r*C,y=z+r*S),
  t[w](x-l*S,y+l*C),
  C=Math.cos(a=6.283*i/n),
  S=Math.sin(a),
  t[w](z+r*C-l*S,z+r*S+l*C);
t.stroke()">
<canvas id=D>

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

50,20,140

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