स्पर्शरेखा बहुभुज एक्सटेंशन


11

कुछ इस तरह दिखता है:

यहाँ छवि विवरण दर्ज करें

अधिक सटीक शब्दों में, त्रिज्या r का एक वृत्त खींचिए, जिसकी लंबाई समान रूप से रिक्त स्थान की स्पर्शरेखा रेखाओं के साथ होगी। एक नया एन-साइडेड नियमित बहुभुज बनाने के लिए इन पंक्तियों के सिरों को कनेक्ट करें।

नियम

r = वृत्त त्रिज्या
n = स्पर्शरेखा रेखाओं की संख्या - वृत्त के चारों ओर समान रूप से होनी चाहिए (n> = 3)
l = स्पर्शरेखा रेखाओं की लंबाई

एक ऐसा प्रोग्राम बनाएं जो तर्कों को स्वीकार करता है {r, n, l} और आवश्यक आउटपुट निकालता है।

इकाइयाँ पिक्सेल में हैं।

ड्राइंग के स्थान पर कोई प्रतिबंध नहीं है, जब तक यह सब दिखाई देता है।

चित्र बहुत आत्म-व्याख्यात्मक है।

यह कोड-गोल्फ है, इसलिए बाइट्स जीत में सबसे छोटा कोड है!


मुझे लगता है कि n => 3 होगा, क्या कोई अधिकतम है? क्या आप स्पर्शरेखा और वृत्त भी चाहते हैं?
मिकट

हां, n> = 3, (ठीक है अगर एल लंबे समय तक नहीं है तो चौराहा)। आपको सर्कल और स्पर्शरेखाओं को आकर्षित करना चाहिए। मुझे लगता है कि अधिकतम मूल रूप से है जब आउटपुट एक छायांकित सर्कल है। दूसरे शब्दों में, इस तरह के ड्राइंग के लिए अधिकतम यथार्थवादी अधिकतम है।
स्ट्रेच

अगर हम एक वेक्टर ग्राफिक का उत्पादन करते हैं तो क्या पिक्सेल इकाइयाँ भी लागू होती हैं? क्योंकि इस तरह के मामले में पिक्सल वास्तव में काफी बीमार-परिभाषित होते हैं। या फिर हम क्या है rasterised ग्राफिक्स का उत्पादन करने के?
मार्टिन एंडर

@ मार्टिनबटनर, यदि आप किसी प्रकार के स्केल (जैसे एक अक्ष) हैं, तो आप अपने (फैंसी) वेक्टर ग्राफिक्स के साथ पिक्सेल इकाई को अनदेखा कर सकते हैं।
स्ट्रेच

जवाबों:


5

गणितज्ञ, 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}। यह एक वेक्टर ग्राफिक का उत्पादन करता है, इसलिए मैं एक अक्ष सहित हूं, जैसा कि ओपी द्वारा टिप्पणियों में निर्दिष्ट किया गया है।

दोनों बहुभुज और बहुभुज वास्तव में "बहुभुज-कोने, स्पर्शरेखा बिंदु, बहुभुज-कोने, अगले बहुभुज-कोने, स्पर्शरेखा बिंदु, बहुभुज-कोने ..." का पता लगाकर वास्तव में एक ही पंक्ति की पट्टी हैं।

यहाँ छवि विवरण दर्ज करें

यदि यह अक्ष के लिए नहीं था, तो मैं इसे 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एक इकाई सर्कल को उपजाने के लिए कॉल को सरल करता है ।



@DavidCarraher हेह, मैंने वास्तव में पहले से ही 135 बाइट्स में किया था, लेकिन इसे अपनी नोटबुक में वापस कॉपी करना भूल गया, इसलिए जब मैंने यूनिकोड में बदलाव किया तो यह वापस मिल गया। धन्यवाद!
मार्टिन एंडर

8

पायथन, 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(अक्ष इकाई लंबाई इंगित करने के लिए शामिल): सर्पोली उत्पादन

के लिए नमूना समारोह उत्पादन n = 1024, r = 4, l = 2: सर्पोली उत्पादन


मैं नाइट-पिकिंग हूं, लेकिन यूनिट पिक्सल में हैं
डिजिटल ट्रॉमा

3
@DigitalTrauma: आह। उस पर ध्यान नहीं दिया। MATLAB के आंकड़ों में निश्चित इकाइयाँ नहीं हैं; वे खिड़की के पैमाने पर हैं। और यह वैसे भी एक लूट बिंदु है। पायथन में आपके लोगो आधारित समाधान ने मेरी आवाज़ को हरा दिया है। आज से पहले मैंने किसी को कल्पना नहीं की होगी कि लोग लोगो को पायथन में पोर्ट करेंगे, लेकिन यह वहाँ है। मैं जैसे-जैसे सीखता जा रहा हूँ। : P
COTO

खैर +1 वैसे भी :)
डिजिटल ट्रॉमा

छवि लगभग एपर्चर का लोगो है।
गर्वित हैकेलर

4

HTML + जावास्क्रिप्ट (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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.