এপিসাইক্লাগন অঙ্কন


22

একটি এপিসাইক্লয়েড হ'ল একটি বৃত্তের বিন্দুটি একটি অন্য বৃত্তের চারদিকে ঘুরার সাথে সাথে একটি বৃত্তের বিন্দু হয়। একটি সাইক্লগন হ'ল আকারটিকে নিয়মিত বহুভুজের উপরের বিন্দু হিসাবে তৈরি করে যখন এটি একটি বিমান জুড়ে ঘুরছে । একটি এপিসাইক্লগন হ'ল একটি নিয়মিত বহুভুজের উপরের বিন্দু দ্বারা আঁকানো বাঁক যা অন্যটির চারপাশে ঘুরছে।

একটি প্রোগ্রাম যা একটি epicyclogon দেওয়া স্বপক্ষে লিখুন r, r1, r2, n1, n2:

r = number of clockwise revolutions rolling polygon makes around stationary polygon (any real number as limited by float values) 
r1 = distance from center of stationary polygon to each of its vertices (positive real number)
r2 = distance from center of rolling polygon to each of its vertices (positive real number)
n1 = number of sides stationary polygon has (integer greater than 2)
n2 = number of sides rolling polygon has (integer greater than 2)

নোট

  • যখন rনেতিবাচক বেলন যেতে হবে বামাবর্তে
  • কারণ r, একটি বিপ্লব ঘটে যখন দুটি আকারের সেন্ট্রয়েডগুলির সাথে সংযোগকারী লাইনটি পুরো 360 ডিগ্রি বের করে দেয়। এই ধারণাটি সমস্ত মানকে অন্তর্ভুক্ত করার জন্য প্রসারিত r। (সুতরাং এক চতুর্থাংশ বিপ্লবে সেন্ট্রয়েডগুলি সংযুক্ত রেখাটি 90 ডিগ্রি ছাড়িয়ে যায়))
  • এই যুক্তিগুলি কমান্ড লাইন থেকে আসা উচিত বা আপনার প্রোগ্রামটি তাদের জন্য অনুরোধ করা উচিত (যেমন পাইথনের সাথে input())।
  • r1এবং r2একে অপরের সাথে সম্পর্কিত, চিত্রটির মাত্রা নয়। সুতরাং আপনি যেকোন সংখ্যক প্রকৃত পিক্সেল হিসাবে একটি "ইউনিট" সেট করতে পারেন।

আপনি যে পয়েন্টটি সন্ধান করতে হবে তা হ'ল ঘূর্ণায়মান আকারের একটি শীর্ষে is আকারগুলি অবশ্যই এই প্রান্তবিন্দুটির সাথে একটি স্থির শীর্ষবিন্দু এবং সংলগ্ন দুটি দিক স্পর্শ করে শুরু করা উচিত:

এপিসাইক্লাগন উদাহরণ

স্থির বহুভুজের যথাযথ প্রারম্ভিক শীর্ষগুলি এবং কোণটি কোনও বিষয় নয়।

আউটপুট

আউটপুটটি এমন একটি চিত্রে যেতে হবে যা কমপক্ষে 600x600 পিক্সেল (অথবা কিছু কিছু পরিবর্তনশীল মাত্রা যা 600 এ সেট করা যায়)। এটি অবশ্যই পরামিতিগুলির দ্বারা বর্ণিত পুরো এপিসাইক্লগন বক্ররেখাটি অবশ্যই চিত্রের মধ্যে ফ্রেমে তৈরি করা উচিত।

ঘূর্ণায়মান এবং নিশ্চল বহুভুজগুলিও আঁকতে হবে (এটি চূড়ান্ত অবস্থায় রোলার সহ)। দুটি আকার এবং এপিসাইক্লাগন তিনটি লক্ষণীয়ভাবে ভিন্ন বর্ণের হওয়া উচিত।

এছাড়া এটি একটি সহজ উপায় হতে হবে না বহুভুজ (পরিবর্তন আঁকা trueথেকে falseকোড যথেষ্ট মধ্যে)।

আমাদের কমপক্ষে 2 আউটপুট চিত্র প্রদর্শন করুন। প্রয়োজনে এগুলি সঙ্কুচিত করা ঠিক আছে।

স্কোরিং

সংক্ষিপ্ততম কোড যা বৈধ আউটপুট চিত্রগুলি জয় করে।

বোনাসেস

  • যদি আউটপুটটি বক্ররেখাটির অ্যানিমেটেড জিআইএফ (বা অনুরূপ) হয় তবে মাইনাস 50 বাইট।
  • মাইনাস 150 বাইটস যদি আপনি মান 2 দিয়ে দেন n1এবং n2নেন তবে আকারগুলি একে অপরের চারপাশে "ঘূর্ণায়মান" দৈর্ঘ্যের 2 * r1(বা r2) রেখার অংশ হয়ে যায়। 2 এবং rযখন 2 হয় তখন আপনি কীভাবে হ্যান্ডেল করবেন তা সেন্ট্রয়েডগুলি অন্য ক্ষেত্রে যেমনভাবে একে অপরের চারপাশে ঘোরাফেরা করে না। (মোটেও "ঘূর্ণায়মান" নয় এটি পরিচালনা করা হিসাবে গণ্য হয় না))n1n2

যেহেতু আমি এই অভিনব ধারণাটি কার্যকরভাবে দেখতে পেরে বেশ আগ্রহী (এবং এটি হ'ল কেকওয়াক নয়), তাই আমি বিজয়ীর জন্য দেড়শত অনুদানের সম্মাননা দিতে যাচ্ছি । প্রতিযোগিতাটি সমাপ্ত হবে একই দিনে অনুগ্রহ শেষ হবে।

বিজয়ীকে অনুগ্রহ প্রদান করা হবে না যদি এটি স্পষ্ট হয় যে তারা বেশিরভাগ কোড কেবল অন্য জমা দেওয়া থেকে পুনরায় লিখেছিল।

ইতিমধ্যে এটি করার জন্য লাইব্রেরি ফাংশনগুলি (যদি থাকে তবে) অনুমোদিত নয়।

দ্রষ্টব্য: এটি আমার অবশিষ্ট প্রশ্নগুলি থেকে এসেছে যে যে কেউ পোস্ট করতে পারেন নি। তবে অন্য কেউ যদি তাদের পোস্ট না করে তবে সময় মতো আমার পক্ষে ভাল সুযোগ রয়েছে। : P: P


আমি মনে করি পরিবর্তে এন্টিকলোকের দিকটি ইতিবাচক হওয়া উচিত।
সোহম চৌধুরী

3
@ সোহমচৌধুরী আমি মনে করি এটি গুরুত্ব সহকারে গুরুত্বপূর্ণ নয়।
ক্যালভিনের

আপনি ঠিক বলেছেন। আপনার কি কোনও উদাহরণ চিত্র আছে? আমার সিডিএফ প্লেয়ার নেই।
সোহম চৌধুরী

@ Githubphagocyte- এ আমি আপনার বক্তব্যটি দেখছি। সংশোধন করা হয়েছে।
ক্যালভিনের

@ মার্টিনবাটনার খুব কঠোর নয়, এটি আমার প্রথম বিষয় ছিল। প্রয়োজনে আপনি অন্য উপায়ে প্রম্পট করতে পারেন।
ক্যালভিনের

উত্তর:


3

ম্যাটল্যাব: 735 বাইট - 200 বোনাস = 535

আমার প্রোগ্রামটি n = 2 কেস পরিচালনা করে এবং একটি রিয়েল-টাইম অ্যানিমেশন আঁকে। গল্ফযুক্ত এবং ungolfed সংস্করণগুলির মধ্যে কয়েকটি পার্থক্য রয়েছে:

অরোগল্ফড সংস্করণটিতে কোডটি সেট করে কেবল একটি ফাইল 'g.gif' এ অ্যানিমেশনটি সংরক্ষণ করার বিকল্প রয়েছে savegif = 1। এটি ডিফল্ট হিসাবে বন্ধ কারণ এটি কয়েকটি কারণে বিরক্তিকর হতে পারে:

  • একটি অযাচিত ফাইল তৈরি
  • সম্ভাব্য পিছিয়ে
  • আপনার একাধিক মনিটর থাকলে এবং প্লটের উইন্ডোটি সঠিক একটিতে না থাকলে একটি ত্রুটি উত্পন্ন হয় ... বোনাসের আকার ছাড়িয়ে প্রায় 100 বাইট নেওয়ার সাথে সাথে জিআইএফ সেভিংটি গল্ফযুক্ত সংস্করণে ফেলে দিতে হয়েছিল।

অবরুদ্ধ সংস্করণটি ট্রেসার শীর্ষে একটি বৃত্ত আঁকে। এটি আরও বেশি ফ্রেম তৈরি করে এবং দ্রুত গতি সঞ্চার করে (যদিও এটি সংখ্যা পরিবর্তন করে গল্ফযুক্ত সংস্করণে সামঞ্জস্য করা যেতে পারে)।

নমুনা:

f(11,5,90,2,99,0) প্রোগ্রাম সমাপ্তির পরে

গল্ফ নমুনা

epic(1.3,4,2,6,6,1) জিআইএফ আউটপুট সহ

অসম্পূর্ণ নমুনা

অবহেলিত কোড

%epicyclogon animation outputs to 'g.gif' if savegif=1 as well as animating in real time

function[] = epic(r,r1,r2,n1,n2,dispPoly)

savegif = 0;  %set to 1 to write .gif

cs = @(a) [cos(a);sin(a)];
vert = @(r, n, v) r * cs(2*pi*v/n);
polyPt = @(l, s, n, r) vert(r, n, floor(l/s)) + mod(l/s,1)*(vert(r, n, floor(l/s)+1) - vert(r, n, floor(l/s)));
polyPt2 = @(i, f, n, r) vert(r, n, i) + f*(vert(r, n, i+1) - vert(r, n, i));
rotm = @(a) [cos(a) -sin(a);sin(a) cos(a)];
arrpluspt = @(a, p) a + kron(p, ones(1,length(a)));
arg = @(p) atan2(p(2), p(1));

E = 1e-9;

dispPoly = dispPoly / dispPoly;

sgn = sign(-r);
r = abs(r);

s1 = 2*r1*sin(pi/n1);
s2 = 2*r2*sin(pi/n2);

%d1 = (r1*r1 - s1*s1*.25)^.5;
d2 = (r2*r2 - s2*s2*.25)^.5;

plotmax = r1+2*r2;

astep = .05; %determines amount of frames per rotation
delay = .01; % time per frame

l = 0;

lRem = 0;
lr = 0;

P1 = vert(r1, n1, 1:n1+1) * dispPoly; 
trace = [];

first = 1;
while 1

    if lr %exists while rotating about a corner of the stationary
        rotA = 2*pi/n1;
    else
        rotA = 2*pi/n2;
    end
    rotPt = polyPt(l, s1, n1, r1);
    lb = l + lRem;
    side1 = floor(l / s1 - E);
    side1up = side1 + lr;
    p2cen = polyPt2(side1, lb/s1 -side1 - .5 * s2/s1, n1, r1) + d2 * cs(2*pi*(side1+.5)/n1);
    if first
        p2cen0 = p2cen;
        r = r + arg(p2cen0)/(2*pi);
    end

    for a = 0:astep:rotA    
        P2 = vert(r2, n2, 0:n2);
        P2 = rotm( pi +pi/n1 -pi/n2   +2*pi*side1/n1) * P2;
        P2 = arrpluspt(P2, p2cen);
        P2 = arrpluspt(P2, -rotPt);
        P2 = rotm(a) * P2;
        P2 = arrpluspt(P2, rotPt);
        trV = mod(floor(l/s2 + E) + lr, n2) + 1;

        cen = rotm(a) * (p2cen - rotPt) + rotPt;
        trace = [trace,P2(:,trV)]; 

        plot(P1(1,:), sgn*P1(2,:), P2(1,:)*dispPoly, sgn*P2(2,:)*dispPoly, trace(1,:),sgn*trace(2,:),P2(1,trV), sgn*P2(2,trV),'o');

        %plot(P1(1,:), P1(2,:), P2(1,:), P2(2,:), trace(1,:),trace(2,:),...
        %[0,p2cen0(1)],[0,p2cen0(2)],[0,cen(1)],[0,cen(2)], P2(1,trV), P2(2,trV),'o');

        axis([-plotmax,plotmax,-plotmax,plotmax]);
        axis square
        figure(1);
       if savegif
           drawnow
           frame = getframe(1); % plot window must be on same monitor!
           img = frame2im(frame);
           [img1,img2] = rgb2ind(img,256);
       end
       if first
           if savegif
               imwrite(img1,img2,'g','gif','DelayTime',2*delay); %control animation speed(but not really)
           end
           first = 0;
       else
           if savegif
               imwrite(img1,img2,'g','gif','WriteMode','append','DelayTime', 2*delay);
           end
       end
       pause(.01);

        adf = mod(arg(cen) - r*2*pi, 2*pi);
        if adf < astep & l/(n1*s1) + .5 > r
            return
        end

    end

%cleanup for next iteration 
    jump = lRem + ~lr * s2; 
    lnex = l + jump; 

    if floor(lnex / s1 - E) > side1up 
        lnex = s1*(side1up+1);
        lRem = jump - (lnex - l);
        lr = 1;
    else    
        lRem = 0;
        lr = 0;
    end
    l = lnex;
end

গল্ফ কোড

function[]=f(r,h,H,n,N,d)
P=pi;T=2*P;F=@floor;C=@(a)[cos(a);sin(a)];g=@(i,f,n,r)r*C(T*i/n)*(1-f)+f*r*C(T*(i+1)/n);R=@(a)[C(a),C(a+P/2)];W=@(a,p)[a(1,:)+p(1);a(2,:)+p(2)];b=@(p)atan2(p(2),p(1));E=1e-9;d=d/d;S=1-2*(r>0);r=-r*S;x=2*h*sin(P/n);X=2*H*sin(P/N);M=h+2*H;l=0;z=0;L=0;A=h*C(T*(0:n)/n)*d;t=[];while 1
v=l/x;D=F(v-E);q=g(D,v-D,n,h);Z=D+L;c=g(D,v+z/x-D-.5*X/x,n,h)+H*cos(P/N)*C(T*D/n+P/n);r=r+~(l+L)*b(c)/T;for a=0:.1:T/(L*n+~L*N)
O=@(p)W(R(a)*W(p,-q),q);B=O(W(R(P+P/n-P/N+T*D/n)*H*C(T*(0:N)/N),c));t=[t,B(:,mod(F(l/X+E)+L,N)+1)];plot(A(1,:),S*A(2,:),d*B(1,:),d*S*B(2,:),t(1,:),t(2,:)*S)
axis([-M,M,-M,M],'square');pause(.1);if.1>mod(b(O(c))-r*T,T)&v/n+.5>r
return;end;end;j=z+~L*X;J=l+j;L=F(J/x-E)>Z;l=L*x*(Z+1)+~L*J;z=L*(J-l);end

নির্দেশাবলী:

একই নামের, অর্থাত্ সঙ্গে একটি ফাইলে ফাংশন সংরক্ষণ epic.mবা f.m। মতলব কনসোল থেকে ফাংশনটি কল করে এটি চালান।

ব্যবহার: epic(r, r1, r2, n1, n2, dispPoly) যেখানে dispPolyএকটি বুলিয়ান পরিবর্তনশীল (শূন্য যদি মিথ্যা, সত্য একটি অশূন্য সংখ্যা) নির্ধারণের বহুভুজ আঁকা কিনা।

সম্পাদনা করুন: অ্যানিমেটেড চিত্রের জন্য 50 টির বোনাস যুক্ত হয়েছে।


14

জাভা - 2,726 2,634 - 200 = 2434 টি অক্ষর

3800 ইশ বাইট থেকে উন্নত

আপনার পরামর্শের জন্য সকলকে ধন্যবাদ (বিশেষ করে ছদ্মনাম 117), এখানে নতুন সংস্করণ দেওয়া আছে।

আমি একটি ক্লাস পি যুক্ত করেছি যা পয়েন্ট ক্লাস এবং একটি ক্লাস এল যা অ্যারেলিস্ট প্রসারিত করে

আমি কিছু ছোটখাটো লজিক পরিবর্তনও যুক্ত করেছি।

এখানে মূল শ্রেণি (গল্ফড নয়):

import java.awt.*;
import java.awt.geom.*;

import javax.swing.*;
public class Polygons2 extends JPanel{
    public static void main(String[] args) throws InterruptedException{new Polygons2(args);}
    double q=Math.PI*2;
    int d=1;
    public Polygons2(String[] args) throws InterruptedException{
        double revolutions=Double.valueOf(args[0])*q;
        double stationaryRadius = Double.valueOf(args[1]);
        double rollingRadius = Double.valueOf(args[2]);
        int stationarySides = Integer.valueOf(args[3]);
        int rollingSides = Integer.valueOf(args[4]);    
        double dist = stationaryRadius+rollingRadius+70;
        P sp = new P(dist,dist);
        P rp = new P(sp.x,sp.y-rollingRadius-stationaryRadius);
        //get points for rolling polygon and stationary polygon
        int key=0;
        for(double stationaryAngle=-q/4;stationaryAngle<q-q/4;stationaryAngle+=q/stationarySides){
            P p=new P(Math.cos(stationaryAngle)*stationaryRadius+sp.x,Math.sin(stationaryAngle)*stationaryRadius+sp.y);
            p.k=key;key++;
            stationaryPoints.add(p);
        }
        for(double rollingAngle=q/4;rollingAngle<q+q/4;rollingAngle+=q/rollingSides){
            P p=new P(Math.cos(rollingAngle)*rollingRadius+rp.x,Math.sin(rollingAngle)*rollingRadius + rp.y);
            p.k=key;key++;
            rollingPoints.add(p);
        }
        double g=(q/2)-((q/2-(q/rollingSides))/2) - ((q/2-(q/stationarySides))/2)-.05;
        for(P p:rollingPoints){p.r(getPoint(0), g);}
        //set up JFrame
        JFrame f = new JFrame();
        f.add(this);
        f.setSize((int)dist*2+60,(int)dist*2+60);
        f.setVisible(true);
        int[] pKeys= new int[]{stationaryPoints.get(0).k,rollingPoints.get(0).k};
        int index=1;
        P rc = rollingPoints.c();
        P sc =stationaryPoints.c();
        double currentRadian=Math.atan2(rc.y-sc.y,rc.x-sc.x);
        double totalRadian = 0;
        while(Math.abs(totalRadian)<revolutions){
            P rc2 = rollingPoints.c();
            P sc2 =stationaryPoints.c();
            double angle = Math.atan2(rc2.y-sc2.y,rc2.x-sc2.x);
            if(currentRadian-angle<2){totalRadian+=(angle-currentRadian);}
            currentRadian=angle;
            L clone=(L)path.clone();
            clone.add(new P(rollingPoints.get(1).x,rollingPoints.get(1).y));
            path = clone;
            for(P p:rollingPoints){
                p.r(getPoint(pKeys[index]),.01);
                int size = stationaryPoints.size();
                for(int i=0;i<size;i++){
                    P stationaryPointAtI = stationaryPoints.get(i);
                    P nextPoint=null;
                    if(i==size-1){nextPoint=stationaryPoints.get(0);}
                    else{nextPoint=stationaryPoints.get(i+1);}
                    if(p.b(stationaryPointAtI, nextPoint)==1&&containsKey(pKeys,p.k)==0){
                        //rolling point is between 2 stationary points
                        if(index==1){index=0;}else{index=1;}
                        pKeys[index]=p.k;
                    }
                    int size2=rollingPoints.size();
                    for(int h=0;h<size2;h++){
                        P nextPoint2=null;
                        if(h==size2-1){nextPoint2=rollingPoints.get(0);}
                        else{nextPoint2=rollingPoints.get(h+1);}
                        if(stationaryPointAtI.b(rollingPoints.get(h), nextPoint2)==1&&containsKey(pKeys,stationaryPointAtI.k)==0){
                            //stationary point is between 2 rolling points
                            if(index==1){index=0;}else{index=1;}
                            pKeys[index]=stationaryPointAtI.k;
                        }
                    }
                }
            }
            repaint();
            Thread.sleep(5);
        }
    }
    volatile L path = new L();
    L rollingPoints = new L();
    L stationaryPoints = new L();
    P getPoint(int key){
        for(P p:rollingPoints){if(p.k==key){return p;}}
        for(P p:stationaryPoints){if(p.k==key){return p;}}
        return null;
    }
    int containsKey(int[] keys,int key){
        for(int i:keys){if(key==i){return 1;}}
        return 0;
    }
    @Override
    public void paintComponent(Graphics g){
        Path2D.Double sPath = new Path2D.Double();
        sPath.moveTo(stationaryPoints.get(0).x, stationaryPoints.get(0).y);
        for(P p:stationaryPoints){
            sPath.lineTo(p.x, p.y);
        }
        sPath.closePath();
        Path2D.Double rPath = new Path2D.Double();
        rPath.moveTo(rollingPoints.get(0).x, rollingPoints.get(0).y);
        for(P p:rollingPoints){
            rPath.lineTo(p.x, p.y);
        }
        rPath.closePath();
        g.setColor(Color.white);
        g.fillRect(0,0,getWidth(),getHeight());
        Graphics2D t = (Graphics2D)g;
        if(d==1){
        t.setColor(Color.black);
        t.draw(sPath);
        t.setColor(Color.blue);
        t.draw(rPath);
        }
        g.setColor(Color.green);
        for(P p:path){g.fillOval((int)p.x-1, (int)p.y-1, 2, 2);}
    }
}

এবং গল্ফ সংস্করণ:

import java.awt.*;import java.awt.geom.*;import javax.swing.*;import static java.lang.Math.*;class Polygons2Golfed extends JPanel{public static void main(String[]a)throws Exception{new Polygons2Golfed(a);}double q=PI*2;int d=1;public Polygons2Golfed(String[]a)throws Exception{double b,c,f;b=Double.valueOf(a[1]);c=Double.valueOf(a[2]);int d,e;d=Integer.valueOf(a[3]);e=Integer.valueOf(a[4]);f=b+c+100;P o=new P(f,f);P r=new P(o.x,o.y-c-b);int s=0;for(double u=-q/4;u<q-q/4;u+=q/d){P p=new P(cos(u)*b+o.x,sin(u)*b+o.y);p.k=s;s++;l.add(p);}for(double u=q/4;u<q+q/4;u+=q/e){P p=new P(cos(u)*c+r.x,sin(u)*c+r.y);p.k=s;s++;k.add(p);}double g=q/e/2+q/d/2-.05;for(P p:k){p.r(v(0),g);}JFrame j=new JFrame();j.add(this);j.setSize((int)f*2+60,(int)f*2+60);j.setVisible(true);m=new int[]{l.get(0).k,k.get(0).k};int ad=1;P rc=k.c();P sc=l.c();double ab,ac;ab=atan2(rc.y-sc.y,rc.x-sc.x);ac=0;while(abs(ac)<Double.valueOf(a[0])*q){P rc2=k.c();P sc2=l.c();double ah=atan2(rc2.y-sc2.y,rc2.x-sc2.x);if(ab-ah<2)ac+=(ah-ab);ab=ah;L ag=(L)n.clone();ag.add(new P(k.get(1).x,k.get(1).y));n=ag;for(P p:k){p.r(v(m[ad]),.01);int af=l.size();for(int i=0;i<af;i++){P aa=l.get(i);P w=null;if(i==af-1){w=l.get(0);}else{w=l.get(i+1);}if(p.b(aa, w)==1&&w(p.k)==0){if(ad==1)ad=0;else ad=1;m[ad]=p.k;}int ae=k.size();for(int h=0;h<ae;h++){P u=null;if(h==ae-1)u=k.get(0);else u=k.get(h+1);if(aa.b(k.get(h),u)==1&&w(aa.k)==0){if(ad==1)ad=0;else ad=1;m[ad]=aa.k;}}}}repaint();Thread.sleep(5);}}L n=new L();L k=new L();L l=new L();P v(int key){for(P p:k){if(p.k==key)return p;}for(P p:l){if(p.k==key)return p;}return null;}int[]m;int w(int key){for(int i:m){if(key==i)return 1;}return 0;}@Override public void paintComponent(Graphics g){Path2D.Double aq=new Path2D.Double();aq.moveTo(l.get(0).x,l.get(0).y);for(P p:l){aq.lineTo(p.x, p.y);}aq.closePath();Path2D.Double aw=new Path2D.Double();aw.moveTo(k.get(0).x, k.get(0).y);for(P p:k){aw.lineTo(p.x, p.y);}aw.closePath();g.setColor(Color.white);g.fillRect(0,0,getWidth(),getHeight());Graphics2D t=(Graphics2D)g;if(d==1){t.setColor(Color.black);t.draw(aq);t.setColor(Color.blue);t.draw(aw);}g.setColor(Color.green);for(P p:n){g.fillOval((int)p.x-1,(int)p.y-1,2,2);}}}

পাশাপাশি ক্লাস পি:

import java.awt.geom.*;class P{double x,y;public P(double a,double b){x=a;y=b;}int k;void r(P c,double g){double a,r;a=Math.atan2(y-c.y,x-c.x)+g;r=Math.sqrt((c.x-x)*(c.x-x)+(c.y-y)*(c.y-y));x=Math.cos(a)*r+c.x;y=Math.sin(a)*r+c.y;}public int b(P a,P b){if(Line2D.ptSegDist(a.x,a.y,b.x,b.y,x,y)<.5)return 1;return 0;}}

এবং আমি:

import java.util.*;public class L extends ArrayList<P>{public P c(){double x,y;x=0;y=0;for(P p:this){x+=p.x;y+=p.y;}return new P(x/size(),y/size());}}

বহুভুজ দেখানোর জন্য int d 0 বা 1 তে পরিবর্তন করুন

যুক্তি - 1 100 50 5 2

এখানে চিত্র বর্ণনা লিখুন

আরগস - 1.5 100 100 7 3

এখানে চিত্র বর্ণনা লিখুন

আরগস - 2 40 100 3 7

এখানে চিত্র বর্ণনা লিখুন


কি rসত্যিই আপনার সমস্ত উদাহরণ 50? এর অর্থ রোলারটি প্রায় 50 বার যায়।
ক্যালভিনের শখ 1

@ ক্যালভিনের শখের নতুন উদাহরণ পাই * 3 দেখায়
স্ট্রেচ পাগল

1
পছন্দ করুন 3 poly আপনাকে স্থির বহুভুজের আশেপাশে 9 বার কিছুটা সময় নেবে।
মার্টিন এন্ডার

4
ক্লাসের নামটি RotatingPolygonsGolfed"গল্ফড" কোডে রয়েছে এমনটা মজার বিষয় যখন এটি ঠিক RotatingPolygonsসাধারণ কোডের মধ্যে থাকে। ;)
ক্যালভিনের

1
আপনি কেবলমাত্র নির্দিষ্ট শ্রেণীর পরিবর্তে * আপনার আমদানি * ব্যবহারের জন্য আমদানি পরিবর্তন করে একটি ভাল অক্ষর সংরক্ষণ করতে পারেন ...
ছদ্মনাম

12

জাভাস্ক্রিপ্ট, 1284 টি অক্ষর (-200 = 1084 অক্ষর)

Minified কোড হয়

function epi(B,r2,r1,n2,n1){K=Math;function C(t){return K.cos(t)}function S(t){return K.sin(t)}function A(y,x){return K.atan2(y,x)}P=K.PI;v=[[],[]];w=[[],[]];z=[];function Z(x,y,j){c=C(t=f*H+P/2);s=S(t);v[j][n]=c*x-s*y;w[j][n]=s*x+c*y;}function E(i){return{x:r1*S(t=p-i*q),y:r1*C(t)};}function D(x,y,X,Y,t){L=A(m.y,m.x);M=K.sqrt(m.x*m.x+m.y*m.y);N=K.sqrt(X*X+Y*Y);O=~~(t*(M>N?M:N)+1);for(i=J;i<=O;i++){J=1;z[n]=f*H+P+t*i/O;Z(x+M*C(T=L+t*i/O),y+M*S(T),0);Z(x+N*C(T=A(Y,X)+t*i/O),y+N*S(T),1);n++}}function F(x,y,n,r,L,s){I.strokeStyle=s;I.beginPath();for(i=0;i<n;i++)I[i?'lineTo':'moveTo'](x+r*C(t=L+(1-2*i)*P/n),y+r*S(t)*W);I.closePath();I.stroke()}p=P/n1;q=2*p;u=P/n2;H=2*u;s2=r2*S(u);g=f=l=n=J=h=0;R=300;while(l<=(B*2+1)*P/H){o=E(0);m=E(h);m.y-=o.y;m.x-=o.x;if(g<s2){D(g,-r2*C(u),-o.x,-o.y,q);h=(h+1)%n1;g+=2*r1*S(p)}else{m.x+=g-s2;D(s2,-r2*C(u),-o.x+g-s2,-o.y,H);g-=s2*2;f=(f+1)%n2;l++}}return function(e_,t,aa,W_){W=aa?-1:1;I=(e=e_).getContext('2d');I.fillStyle='black';I.fillRect(0,0,600,600);W_&1&&F(R,R,n2,r2,0,'white');T=A(w[1][0],v[1][0]);U=V=0;I.strokeStyle='teal';I.beginPath();I.moveTo(R+v[0][0],R+w[0][0]*W);while(U<t){_=A(w[1][V+1],v[1][V+1]);U+=_-T+(_+1<T?2*P:0);T=_;V++;I.lineTo(R+v[0][V],R+w[0][V]*W)}W_&2&&I.stroke();W_&4&&F(R+v[1][V],R+w[1][V]*W,n1,r1,z[V],'red')}}

সম্পূর্ণ কোড হয়

function epi( nr, r2, r1, n2, n1 ) {
function C( t )
    { return Math.cos( t ); }
function S( t )
    { return Math.sin( t ); }
function A( dy, dx )
    { return Math.atan2( dy, dx ); }

var iCCW, e, t_, xs = [[],[]], ys = [[],[]], ts = [], n = 0, iArc0 = 0;

function addpt( x, y, iBin ) {
    var c_ = C(t_ = iFrame*t2 + Math.PI/2 ),
        s_ = S(t_);

    xs[iBin][n] = c_*x-s_*y;
    ys[iBin][n] = s_*x+c_*y;
}

function poly1pt( iP )
    { return { x: r1*S(t_ = t1b2-iP*t1), y: r1*C(t_) }; }

function arc1( P_Arc_, xP_, yP_, xC_, yC_, t ) {
    var dx_, dy_, dxC, dyC;
    var t0 = A( dy_ = P_Arc_.y, dx_ = P_Arc_.x ),
        r_ = Math.sqrt( dx_*dx_ + dy_*dy_ ),
        t0C = A( dyC = yC_, dxC = xC_ ),
        rC = Math.sqrt( dxC*dxC + dyC*dyC ),
        nt = ~~(t*(r_>rC?r_:rC)+1);

    for( var i = iArc0; i <= nt; i++ ) {
        iArc0 = 1;
        ts[n] = iFrame*t2 + Math.PI + t*i/nt;
        addpt( xP_ + r_*C(t_ = t0+t*i/nt), yP_ + r_*S(t_), 0 );
        addpt( xP_ + rC*C(t_ = t0C+t*i/nt), yP_ + rC*S(t_), 1 );
        n++;
    }
}

function poly( x,y, n, r, t0, sColor ) {
    var Cx = e.getContext('2d');
    Cx.strokeStyle = sColor;
    Cx.beginPath();
    for( var i = 0; i < n; i++ )
        Cx[i ? 'lineTo' : 'moveTo']( x + r*C(t_ = t0+(1-2*i)*Math.PI/n), y + r*S(t_)*iCCW );

    Cx.closePath();
    Cx.stroke();
}

var t1b2 = Math.PI/n1,
    t1 = 2*t1b2,
    t2b2 = Math.PI/n2,
    t2 = 2*t2b2,
    s1 = 2*r1*S(t1b2),
    s2 = 2*r2*S(t2b2),
    xPivot = 0,
    iPivot = 0,
    iFrame = 0,
    P_Pivot, P_Arc,
    nFrame = 0;

while( nFrame <= (nr*2+1)*Math.PI/t2 ) {
    P_Pivot = poly1pt( 0 );
    P_Arc = poly1pt( iPivot );
    if( xPivot < s2/2 ) {
        P_Arc.x -= P_Pivot.x;
        P_Arc.y -= P_Pivot.y;
        arc1( P_Arc, xPivot, -r2*C(t2b2), -P_Pivot.x, -P_Pivot.y, t1 );
        iPivot = (iPivot+1) %n1;
        xPivot += s1;
    } else {
        P_Arc.x -= (P_Pivot.x - (xPivot - s2/2));
        P_Arc.y -= P_Pivot.y;
        arc1( P_Arc, s2/2, -r2*C(t2b2), -P_Pivot.x + xPivot - s2/2, -P_Pivot.y, t2 );
        xPivot -= s2;
        iFrame = (iFrame+1) %n2;
        nFrame++;
    }
}

function renderTo( eCanvas, t, isCCW, sWhat ) {
    iCCW = isCCW ? -1 : 1;
    var Cx = (e = eCanvas).getContext('2d');
    Cx.fillStyle = 'black';
    Cx.fillRect( 0,0, 600,600 );

    if( sWhat &1 )
        poly( 300,300, n2, r2, 0, 'white' );

    var tRef = A( ys[1][0], xs[1][0] ),
        tCum = 0,
        i0 = 0;

    Cx.strokeStyle = 'green';
    Cx.beginPath();
    Cx.moveTo( 300+xs[0][0], 300+ys[0][0]*iCCW );
    while( tCum < t ) {
        t_ = A( ys[1][i0+1], xs[1][i0+1] );
        tCum += t_ - tRef + (t_ - tRef < -1 ? 2*Math.PI : 0);
        tRef = t_;
        i0++;
        Cx.lineTo( 300+xs[0][i0], 300+ys[0][i0]*iCCW );
    }
    if( sWhat &2 )
        Cx.stroke();
    if( sWhat &4 )
        poly( 300+xs[1][i0], 300+ys[1][i0]*iCCW, n1, r1, ts[i0], 'red' );
}

return renderTo;
}

এর সমস্ত বহুভুজ গৌরবতে (এবং অ্যানিমেশন প্রদর্শনের জন্য) রুটিনটি দেখার জন্য একটি ঝাঁকুনি পাওয়া গেছে

http://jsfiddle.net/7rv751jy/2/embedded/result/

স্ক্রিপ্টটি একটি ফাংশন সংজ্ঞায়িত করে epiযা ওপিতে তালিকাভুক্ত পাঁচটি পরামিতি গ্রহণ করে। epiস্বাক্ষর সহ একটি ফাংশন প্রদান করে (e,t,isCCW,flags)যা আর্গুমেন্ট গ্রহণ করে:

  • e - একটি 600x600 এইচটিএমএল 5 ক্যানভাস উপাদানের একটি রেফারেন্স যা রেন্ডার করতে হয়
  • t- দ্বিতীয় বহুভুজের সেন্ট্রয়েডকে প্রথমটির সেন্ট্রয়েডের চারপাশে ঘোরানো উচিত এমন মোট কোণ (রেডিয়ানে)। আর্গুমেন্টটি পাসে ঘুরানোর সংখ্যার 2 পাই গুনের বেশি হওয়া উচিত নয়epi
  • isCCW - বুলিয়ান নির্দেশ করে যে ট্রেসটি ঘড়ির কাঁটার বিপরীত দিকে এগিয়ে যেতে হবে (ঘড়ির কাঁটার বিপরীতে)
  • flags - বিট পতাকাগুলির একটি সেট যা নির্দেশ করে যে কোন উপাদানগুলি রেন্ডার করা উচিত
    • বিট 1 - সেট করা থাকলে বহুভুজ 1 উপস্থাপন করুন
    • বিট 2 - সেট করা থাকলে ট্রেস রেন্ডার করুন
    • বিট 3 - সেট করা থাকলে বহুভুজ 2 উপস্থাপন করুন

বিভিন্ন আর্গুমেন্টের সেট সহ ফাংশনটিকে যেকোনও বার বলা যেতে পারে।

কিছু নোট:

  • রুটিনটি অধঃপতন ক্ষেত্রে পরিচালনা করে যেখানে n1 = 2এবং / অথবাn2 = 2 । অ্যানিমেট করার সময়, দৈর্ঘ্যের নির্দিষ্ট সংমিশ্রণগুলি ট্রেসগুলিতে হঠাৎ দ্রুত অগ্রগতির কারণ ঘটবে। কারণ অ্যানিমেশন ফ্রেমগুলি কোণ দ্বারা দ্বিতীয় বহুভুজটির সেন্ট্রয়েডের সাথে সূচিকৃত হয় এবং ডিটা পলি 2 / ডি থাটা সেন্ট্রয়েড এমন ক্ষেত্রে একবচনে পরিণত হয় যেখানে 2-পার্শ্বযুক্ত পলি 2 এর সেন্ট্রয়েড 2-পার্শ্বযুক্ত বহু 1 এর একটি শীর্ষবিন্দুর নিকটে রয়েছে তবে এটি ট্রেসকে প্রভাবিত করে না।

  • প্যারামিটারের নামগুলি epiপুরো বিকাশের পর থেকেই বিভ্রান্তিকর বলে মনে হবে, আমি বহুভুজ 1 কে "2" এবং বহুভুজ 2 কে "1" হিসাবে উল্লেখ করেছি। আমার কনভেনশন এবং ওপি-র মধ্যে অসঙ্গতি বুঝতে পেরে কোডের সমস্ত সূচককে বদলে দেওয়ার পরিবর্তে আমি কেবল যুক্তিগুলির ক্রমটি অদলবদল করেছিলাম epi

  • উপরের ফুলটি jQuery আমদানি করে তবে এটি ইউআই হ্যান্ডেল করা। epiফাংশনটি কোন গ্রন্থাগার নির্ভরতা হয়েছে।

  • কোডটি স্রেফ ওয়াই অক্ষকে উল্টিয়ে সিসিডাব্লু ট্রেসগুলি পরিচালনা করে। এটি কিছুটা অবাস্তব যেহেতু বহুভুজ 2 সিসিডাব্লু ট্রেসের সময় ওয়াই-উল্টানো অবস্থানে শুরু হয়, তবে কেউই বলেনি যে রুটিনটি মার্জিত হতে হবে। ;)


1
সুন্দর! আমি পেয়েছি ফুলস্ক্রিন লিঙ্কটি এর সাথে কাজ করা সবচেয়ে সহজ: jsfiddle.net/7rv751jy/ebded/result
ক্যালভিনের

একটি ক্ষুদ্র অভিযোগটি হ'ল ট্রেসার ভার্টেক্সটি কোনও স্থির ভার্টেক্স থেকে শুরু হয় না।
ক্যালভিনের

হা। আমি চশমাগুলিতে সম্পূর্ণরূপে উপেক্ষা করেছি। আমি 'হা' বলি কারণ কোডটি মূলত (অজান্তেই) নির্দিষ্ট করে তোলা হয়েছিল, তবে আমি ট্রেস ভারটেক্সটি পরিবর্তন করেছি কারণ আমি অনুভব করেছি যে এটি অবিলম্বে শুরু হলে ট্রেসটি আরও ভাল দেখাচ্ছে। আমি কোডটি আপডেট করেছি যাতে এটি অনুমান করা যায়, এবং ফিডলটির লিঙ্কটি একটি সম্পূর্ণ স্ক্রিনের স্পেস-কমপ্লায়েন্ট সংস্করণে আপডেট করে। বোনাস হিসাবে, এটি মোট চরিত্রটি থেকে একটি চরিত্রকে নক করে।
COTO

আমি কীভাবে এটি কিছুটা গতি বাড়িয়ে তুলব? জেএস নুব এখানে।
সোহম চৌধুরী

@SohamChowdhury: পরিবর্তনের কোড nt = ~~(t*(r_>rC?r_:rC)+1)থেকে nt = ~~(t*(r_>rC?r_:rC)/10+1)এবং এটি একটি বিট আপ জিনিষ গতি বাড়াতে হবে।
COTO
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.