स्पिरोग्राफ टाइम!


14

स्पाइरोग्राफ एक ऐसा खिलौना है जो हाइपोथ्रॉइड और एपिट्रोचोइड्स को खींचता है। इस चुनौती के लिए, हम सिर्फ हाइप्रोचोइड पर ध्यान केंद्रित करेंगे।

से विकिपीडिया :

एक hypotrochoid एक रूले एक बिंदु त्रिज्या का एक चक्र से जुड़ी द्वारा पता लगाया है r त्रिज्या की एक निश्चित चक्र के अंदर चारों ओर रोलिंग आर , जहां बिंदु एक दूरी है आंतरिक चक्र के केंद्र से।

उनके लिए पैरामीट्रिक समीकरण निम्नानुसार परिभाषित किए जा सकते हैं:

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

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

कहाँ θ कोण क्षैतिज और रोलिंग चक्र के केंद्र द्वारा गठित है।


आपका कार्य एक कार्यक्रम लिखना है जो ऊपर बताए गए बिंदु से पता लगाया जाएगा। इनपुट के रूप में, आपको R , r , और d , सभी पूर्णांकों को 1 और 200 के बीच सम्मिलित किया जाएगा।

आप इस इनपुट को स्टड, तर्क या उपयोगकर्ता इनपुट से प्राप्त कर सकते हैं, लेकिन इसे प्रोग्राम में हार्डकोड नहीं किया जा सकता है। आप इसे उस रूप में स्वीकार कर सकते हैं जो आपके लिए सबसे सुविधाजनक है; तार, पूर्णांक, आदि के रूप में।

मान लीजिये:

  • पिक्सल में इनपुट यूनिट दी गई हैं।
  • आर > = आर

आउटपुट इनपुट द्वारा परिभाषित हाइपोथ्रोइड का एक ग्राफिकल प्रतिनिधित्व होना चाहिए। कोई ASCII- या अन्य पाठ-आधारित आउटपुट की अनुमति नहीं है। इस छवि को फ़ाइल में सहेजा जा सकता है या स्क्रीन पर प्रदर्शित किया जा सकता है। अपने चयन के इनपुट के लिए आउटपुट का स्क्रीनशॉट या चित्र शामिल करें।

आप पथ / पृष्ठभूमि के लिए कोई भी रंग चुन सकते हैं, जो एक विपरीत प्रतिबंध के अधीन है। दो रंगों में कम से कम आधे पैमाने पर एचएसवी 'वैल्यू' घटक होना चाहिए। उदाहरण के लिए, यदि आप HSV से माप रहे हैं, तो [0...1]कम से कम 0.5अंतर होना चाहिए । के बीच [0...255]न्यूनतम 128अंतर होना चाहिए ।


यह एक कोड गोल्फ है, बाइट्स जीत में स्रोत कोड का न्यूनतम आकार।


क्या हम मान सकते हैं R > rया R ≥ r? (एक ही के लिए rऔर d।)
मार्टिन Ender

10
2000 वें प्रश्न को पोस्ट करने के लिए बधाई! ;-)
दरवाज़े

@ m.buettner R>=r, लेकिन dविवश नहीं है rऔर यह 1-200 रेंज में कहीं भी हो सकता है।
भूतकाल

हम किस तरह के संकल्प की बात कर रहे हैं?
काइल कानोस

@KyleKanos चूंकि इनपुट पिक्सल में है और प्रत्येक में 200 की कैप है, यह कभी भी 798x798 से बड़ा नहीं होना चाहिए R=200, r=1, d=200। आप छवि को इनपुट पर आकार दे सकते हैं यदि आप चाहते हैं, या इसे लगातार आकार में रख सकते हैं, जब तक कि यह सब दिखाई दे।
'17

जवाबों:


8

गणितज्ञ, 120 बाइट्स

f[R_,r_,d_]:=ParametricPlot[p#@t+#[-p*t/r]d&/@{Cos,Sin},{t,0,2r/GCD[p=R-r,r]Pi},PlotRange->400,ImageSize->800,Axes->0>1]

अ-कोड कोड और उदाहरण आउटपुट: यहाँ छवि विवरण दर्ज करें

यदि मैं भूखंड में कुल्हाड़ियों को शामिल कर सकता हूं, तो मैं अन्य 9 पात्रों को बचा सकता हूं।


5

जावास्क्रिप्ट (ECMAScript 6) - 312 314 वर्ण

document.body.appendChild(e=document.createElement("canvas"))
v=e.getContext("2d")
n=(e.width=e.height=800)/2
M=Math
P=2*M.PI
t=0
p=prompt
r=p('r')
R=p('R')-r
d=p('d')
X=x=>n+R*M.cos(t)+d*M.cos(R/r*t)
Y=x=>n+R*M.sin(t)-d*M.sin(R/r*t)
v.beginPath()
v.moveTo(X(),Y())
for(;t<R*P;v.lineTo(X(),Y()))t+=P/2e4
v.stroke()

JSFIDDLE

उदाहरण आउटपुट

r = 1, आर = 200, डी = 30

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


मुझे यह पसंद है, लेकिन ikt किसी भी तरह टूट गया। उदाहरणों को R.
edc65

अंतिम पंक्ति (; t <R * P; v.lineTo (X (), Y ()) t + = P / R
edc65

@ edc65 यह नहीं टूटा है यह उन उदाहरणों में एक पूर्ण रोटेशन करने के लिए पर्याप्त पुनरावृत्तियों नहीं कर रहा था। मैंने पुनरावृत्तियों को 9 * PI से R * 2 * PI तक बढ़ा दिया है और यह बेहतर होना चाहिए (हालांकि, मैंने PI / 1000 में वृद्धि को छोड़ दिया है अन्यथा यह R के छोटे मानों के लिए टूट जाएगा)।
MT0

3

पायथन: 579

सारांश

यह सभी गणितज्ञों के उत्तर को देखते हुए प्रतिस्पर्धी नहीं है, लेकिन मैंने इसे वैसे भी पोस्ट करने का फैसला किया क्योंकि चित्र बहुत सुंदर हैं और यह किसी को प्रेरित कर सकता है या किसी के लिए उपयोगी हो सकता है। क्योंकि यह बहुत बड़ा है, इसलिए मैंने इसे मूल रूप से अधूरा छोड़ दिया। कार्यक्रम को आर, आर, डी के कमांड-लाइन इनपुट की उम्मीद है।

स्क्रीनशॉट

यहाँ दो उदाहरण हैं, एक (5,3,5) और एक (10,1,7) के लिए उदाहरण 5-3-5 उदाहरण 10-1-7

कोड

import math
import matplotlib.pyplot as P
from matplotlib.path import Path as H
import matplotlib.patches as S
import sys
a=sys.argv
(R,r,d)=int(a[1]),int(a[2]),int(a[3])
v=[]
c=[]
c.append(H.MOVETO)
t=0
while(len(v)<3 or v.count(v[-1])+v.count(v[-2])<3):
 p=t*math.pi/1000
 t+=1
 z=(R-r)*p/r
 v.append((round((R-r)*math.cos(p)+d*math.cos(z),3),round((R-r)*math.sin(p)-d*math.sin(z),3)))
 c.append(H.LINETO)
c.pop()
v.append((0,0))
c.append(H.CLOSEPOLY)
f=P.figure()
x=f.add_subplot(111)
x.add_patch(S.PathPatch(H(v,c)))
l=R+d-r
x.set_xlim(-l-1,l+1)
x.set_ylim(-l-1,l+1)
P.show()

2
क्या आप अनुपात को समायोजित कर सकते हैं? ऐसा लगता है कि छवि लंबवत संकुचित है।
AL

3

पर्ल / टीके - 239 227

use Tk;($R,$r,$d)=@ARGV;$R-=$r;$s=$R+$d;$c=tkinit->Canvas(-width=>2*$s,-height=>2*$s)->pack;map{$a=$x;$b=$y;$x=$s+$R*cos($_/=100)+$d*cos$_*$R/$r;$y=$s+$R*sin($_)-$d*sin$_*$R/$r;$c->createLine($a,$b,$x,$y)if$a}0..628*$s;MainLoop

आर = १२०, आर = २०, डी = ४०:

आर = 120, आर = 20, डी = 40

R = 128, r = 90, d = 128:

आर = 128, आर = 90, डी = 128

आर = 179, आर = 86, डी = 98:

आर = 179, आर = 86, डी = 98


2

प्रसंस्करण, 270

import java.util.Scanner;
void setup(){size(500, 500);}
Scanner s=new Scanner(System.in);
int R=s.nextInt(),r=s.nextInt(),d=s.nextInt();
void draw(){
  int t=width/2,q=(R-r);
  for(float i=0;i<R*PI;i+=PI/2e4)
    point(q*sin(i)-d*sin(i*q/r)+t,q*cos(i)+d*cos(i*q/r)+t);
}

इनपुट को कंसोल के माध्यम से दर्ज किया जाता है, प्रति पंक्ति एक नंबर।

R = 65, r = 15, d = 24 के लिए स्क्रीनशॉट: यहाँ छवि विवरण दर्ज करें


2

जप, 87

यही है, अगर आप एक मान्य भाषा का जिक्र करते हैं।

R=2
r=1
d=1
D=R-r
Curve[D*cos(t)+d*cos(D*t/r),D*sin(t)-d*sin(D*t/r),t,0,2π*r/GCD[D,r]]

जियो इनपुट बार से इनपुट स्वीकार करता है <variable>=<value>, उदाहरण के लिए, उदाहरण के लिए R=1000

ध्यान दें कि आपको पूरी छवि देखने के लिए ज़ूम साइज़ को मैन्युअल रूप से बदलना पड़ सकता है।

स्क्रीनशॉट

(खिड़की के नीचे की चीज़ इनपुट बार है जिसके बारे में मैं बात कर रहा था)

इसे यहाँ ऑनलाइन आज़माएँ ।


1
मुझे लगता है कि यह काइल कानोस की सबमिशन के समान है, कि आप पिक्सेल में आकार निर्दिष्ट नहीं कर सकते हैं?
मार्टिन एंडर

@ m.buettner हाँ तुम सही कह रहे हो ... याद किया कि
user12205

2

HTML + जावास्क्रिप्ट 256 286 303

हटाये जाने के लिए 1 कॉल हटाएं संपादित करें , यह वैसे भी काम करता है। अधिक कटिंग शुरू करने से बचा सकता है, लेकिन तब यह पहली बार ही काम करता है

Edit2 30 बाइट्स ने thx @ 30П2 को बचाया

<canvas id=c></canvas>R,r,d:<input oninput="n=400;c.width=c.height=t=n+n;v=c.getContext('2d');s=this.value.split(',');r=s[1],d=s[2],R=s[0]-r;v.beginPath();for(C=Math.cos,S=Math.sin;t>0;v.lineTo(n+R*C(t)+d*C(R/r*t),n+R*S(t)-d*S(R/r*t)),t-=.02);v.stroke()">

परीक्षा

टेक्स्ट बॉक्स में इनपुट रखें (अल्पविराम से अलग) तब टैब दबाएँ

R,r,d:<input onchange="n=400;c.width=c.height=t=n+n;v=c.getContext('2d');s=this.value.split(',');r=s[1],d=s[2],R=s[0]-r;v.beginPath();for(C=Math.cos,S=Math.sin;t>0;v.lineTo(n+R*C(t)+d*C(R/r*t),n+R*S(t)-d*S(R/r*t)),t-=.02);v.stroke()"><canvas id=c></canvas>


1
क्या आप बस कैनवास में एक आईडी नहीं जोड़ सकते थे और क्वेरीसेलेक्टर का उपयोग करने के बजाय विश्व स्तर पर उस आईडी का उपयोग कर सकते थे!
मामा फन रोल

@ ӍѲꝆΛҐӍΛПӍѲꝆΛҐӍΛ yeeeeees मैं कर सकता था। यह ऐसा कुछ है जिसके बारे में मुझे 2014 में पता नहीं था
edc65

वाह, जो मैंने सोचा था की तुलना में अधिक बाइट्स बचाया गया था।
मामा फन रोल

2

आर, 80 बाइट्स

f=function(R,r,d){a=0:1e5/1e2;D=R-r;z=D*exp(1i*a)+d*exp(-1i*D/r*a);plot(z,,'l')}

हालाँकि, यदि कोई 'स्वच्छ' आंकड़े (कोई कुल्हाड़ी, कोई लेबल आदि नहीं) चाहता है, तो कोड को थोड़ा लंबा होना होगा (88 अक्षर:)

f=function(R,r,d)plot((D=R-r)*exp(1i*(a=0:1e5/1e2))+d*exp(-1i*D/r*a),,'l',,,,,,'','',,F)

एफ के लंबे संस्करण का उपयोग करके एक कोड उदाहरण:

f(R<-179,r<-86,d<-98);title(paste("R=",R,", r=",r," d=",d,sep=""))

कुछ उदाहरण आउटपुट:

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

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

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


यह पिक्सेल में इनपुट आकार नहीं लेता है, क्या यह? पहला उदाहरण लगभग तीन गुना होना चाहिए जितना कि दूसरा।
मार्टिन एंडर

सभी क्यों ,??
प्लेनैपस

कॉमा का उपयोग तर्कों को अलग करने के लिए किया गया था, जिनमें से कई NULL (कुछ भी नहीं) थे। यहां कोड की लंबाई को कम करने के लिए स्थितीय तर्क मिलान का उपयोग किया गया था। यह निश्चित रूप से खराब कोडिंग अभ्यास है। अनुशंसित तरीका नामित तर्क सूची का उपयोग करना होगा, जैसे प्रकार = "l", xlabel = "", आदि (और निरर्थक अल्पविराम से छुटकारा पाएं!)।
फेंग

1

C # 813, 999 था

बाइट काउंट कम करने के लिए कुछ काम चाहिए। मैं इसे थोड़ा कम करने में कामयाब रहा। यह कंसोल से तीन अलग-अलग पूर्णांक को स्वीकार करता है।

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
class P:Form
{
int R,r,d;
P(int x,int y,int z) {R=x;r=y;d=z;}
protected override void OnPaint(PaintEventArgs e)
{
if(r==0)return;
Graphics g=e.Graphics;
g.Clear(Color.Black);
int w=(int)this.Width/2;
int h=(int)this.Height/2;
List<PointF> z= new List<PointF>();
PointF pt;
double t,x,y;
double pi=Math.PI;
for (t=0;t<2*pi;t+=0.001F)
{
x=w+(R-r)*Math.Cos(t)+d*Math.Cos(((R-r)/r)*t);
y=h+(R-r)*Math.Sin(t)-d*Math.Sin(((R-r)/r)*t);
pt=new PointF((float)x,(float)y);
z.Add(pt);
}
g.DrawPolygon(Pens.Yellow,z.ToArray());
}
static void Main()
{
char[] d={' '};
string[] e = Console.ReadLine().Split(d);
Application.Run(new P(Int32.Parse(e[0]),Int32.Parse(e[1]),Int32.Parse(e[2])));
}
}

आउटपुट नमूना:

spirograph


1

शेल स्क्रिप्ट + gnuplot (153)

अधिकांश प्रयास कुल्हाड़ियों और टिक्स को हटाने, आकार और सीमा निर्धारित करने और परिशुद्धता बढ़ाने के लिए है। शुक्र है, गोल्फिंग के लिए gnuplot स्वाभाविक है, इसलिए अधिकांश कमांड संक्षिप्त हो सकते हैं। पात्रों को बचाने के लिए, आउटपुट को मैन्युअल रूप से एक छवि फ़ाइल पर पुनर्निर्देशित किया जाना चाहिए।

gnuplot<<E
se t pngc si 800,800
se pa
se sa 1e4
uns bor
uns tic
a=$1-$2
b=400
p[0:2*pi][-b:b][-b:b]a*cos($2*t)+$3*cos(a*t),a*sin($2*t)-$3*sin(a*t) not
E

स्क्रिप्ट देने के साथ spiro.sh 175 35 25>i.pngदेता है यहाँ छवि विवरण दर्ज करें


1

आर, 169 वर्ण

f=function(R,r,d){png(w=2*R,h=2*R);par(mar=rep(0,4));t=seq(0,R*pi,.01);a=R-r;x=a*cos(t)+d*cos(t*a/r);y=a*sin(t)-d*sin(t*a/r);plot(x,y,t="l",xaxs="i",yaxs="i");dev.off()}

इंडेंट:

f=function(R,r,d){
    png(w=2*R,h=2*R) #Creates a png device of 2*R pixels by 2*R pixels
    par(mar=rep(0,4)) #Get rid of default blank margin
    t=seq(0,R*pi,.01) #theta
    a=R-r
    x=a*cos(t)+d*cos(t*a/r)
    y=a*sin(t)-d*sin(t*a/r)
    plot(x,y,t="l",xaxs="i",yaxs="i") #Plot spirograph is a plot that fits tightly to it (i. e. 2*R by 2*R)
    dev.off() #Close the png device.
}

उदाहरण:

> f(65,15,24)

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

> f(120,20,40)

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

> f(175,35,25)

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


1

स्माइलबासिक, 96 बाइट्स

INPUT R,Q,D
M=R+MAX(Q,D)
S=R-Q@L
GPSET M+S*COS(I)+D*COS(S/Q*I),M+S*SIN(I)-D*SIN(S/Q*I)I=I+1GOTO@L

इनपुट: 50,30,50:

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


1

Befunge-98, 113 बाइट्स

&&:00p-10p&20p"PXIF"4(10g'd:*:I10v>H40gF1+:"}`"3**`>jvI@
1(4"TURT"p04/d'*g02I/g00*p03/d'*g<^-\0/g00*g01:Fg03H:<0P

यह कोड कुछ त्रिकोणमितीय गणनाओं के लिए फिक्स्ड प्वाइंट मैथ्स (FIXP) फिंगरप्रिंट और स्पाइरोग्राफ के पथ को खींचने के लिए टर्टल ग्राफिक्स (TURT) फिंगरप्रिंट पर निर्भर करता है ।

Befunge में टर्टल ग्राफिक्स लोगो प्रोग्रामिंग भाषा में ग्राफिक्स के व्यवहार के समान हैं । आप एक 'कछुए' (अपनी कलम के रूप में सेवा) के साथ आकर्षित करते हैं, जिसे आप आउटपुट सतह के आसपास चलाते हैं। यह कछुए को एक विशेष दिशा में उन्मुख करने पर जोर देता है, और फिर उसे एक निश्चित दूरी तक आगे बढ़ने के निर्देश देता है।

इस प्रणाली के साथ काम करने के लिए, मुझे मूल स्पाइरोग्राफ समीकरणों को कुछ अधिक कछुए के अनुकूल कुछ में समायोजित करने की आवश्यकता थी। मुझे यकीन नहीं है कि यह सबसे अच्छा तरीका है, लेकिन एल्गोरिथ्म मैं कुछ इस तरह काम करता है:

ratio = (R-r)/r
distance1 = sin(1°) * (R-r)
distance2 = sin(1° * ratio) * d
foreach angle in 0° .. 36000°:
  heading(angle)
  forward(distance1)
  heading(-ratio*angle)
  forward(distance2)

ध्यान दें कि यह वास्तव में एक तरह के ज़िग-ज़ैग पैटर्न के साथ पथ खींचता है, लेकिन जब तक आप छवि पर बारीकी से ज़ूम नहीं करते हैं, तब तक आप वास्तव में नोटिस नहीं करते हैं।

यहां पैरामीटर R = 73, r = 51, d = 45 का उपयोग करके एक उदाहरण दिया गया है।

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

मैंने CCBI और cfunge के साथ कोड का परीक्षण किया है , दोनों एक SVG छवि के रूप में आउटपुट का उत्पादन करते हैं। चूंकि यह एक स्केलेबल वेक्टर प्रारूप है, जिसके परिणामस्वरूप छवि में पिक्सेल आकार नहीं होता है - यह सिर्फ स्क्रीन आकार (कम से कम जब एक ब्राउज़र में देखा जाता है) फिट करने के लिए तराजू है। ऊपर दिया गया उदाहरण एक स्क्रीन कैप्चर है जिसे मैन्युअल रूप से क्रॉप और स्केल किया गया है।

सिद्धांत रूप में कोड Rc / Funge पर भी काम कर सकता है , लेकिन उस स्थिति में आपको XWindows के साथ एक सिस्टम पर चलने की आवश्यकता होगी, क्योंकि यह एक विंडो में आउटपुट रेंडर करने की कोशिश करेगा।


0

wxMaxima : 110

f(R,r,d):=plot2d([parametric,(p:R-r)*cos(t)+d*cos(t*(p)/r),(p)*sin(t)-d*sin(t*(p)/r),[t,0,2*%pi*r/gcd(p,r)]]);

इसे इंटरेक्टिव सत्र में कहा जाता है f(#,#,#)। नमूने के रूप में, विचार करें f(3,2,1):

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


जबकि मुझे सुंदर आउटपुट पसंद है, मुझे यकीन नहीं है कि यह "1 और 200 के बीच पूर्णांक" या "पिक्सेल के रूप में दिया गया" कैसे है।
14:14

इनपुट पूर्णांक या फ्लोट्स हो सकते हैं, wxMaxima अपने काम को करने के लिए फ्लोट में परिवर्तित हो जाएगा, मैं पूर्णांक का उपयोग करके एक छवि अपडेट करूंगा। मुझे पिक्सल के रूप में इनपुट के बारे में अधिक सोचना होगा।
काइल कानोस

हाँ, मुझे लगा कि यह उन्हें आंतरिक रूप से परिवर्तित कर देगा, और यह कोई समस्या नहीं है। इनपुट पर पूर्णांक बाधा मुख्य रूप से बंद छोरों को आसान बनाने के लिए थी (वे सिर्फ बेहतर इमो दिखते हैं)।
जोबिट्स

0

रैकेट

#lang racket/gui
(require 2htdp/image)

(define frame (new frame%
                   [label "Spirograph"]
                   [width 300]
                   [height 300]))

(define-values (R r d) (values 50 30 10)) ; these values can be adjusted;

(new canvas% [parent frame]
     [paint-callback
      (lambda (canvas dc)
        (send dc set-scale 3 3)
        (for ((t (in-range 0 (* 10(* R pi)) 1)))
          (define tr (degrees->radians t))
          (define a (- R r))
          (define x (+ (* a (cos tr))
                       (* d (cos (* tr (/ a r))))))
          (define y (- (* a (sin tr))
                       (* d (sin (* tr (/ a r))))))
          (send dc draw-ellipse (+ x 50) (+ y 50) 1 1)))])

(send frame show #t)

आउटपुट:

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

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