বোডস অ্যালগরিদম প্রয়োগ করুন


18

ভূমিকা

Boids অ্যালগরিদম একটি গ্রুপ উত্থানশীল ব্যবহারের একটি অপেক্ষাকৃত সহজ বিক্ষোভ। এর তিনটি প্রধান নিয়ম রয়েছে, যেমন এর নির্মাতা ক্রেগ রেইনল্ডস বর্ণনা করেছেন:

বেসিক ফ্লকিং মডেলটিতে তিনটি সহজ স্টিয়ারিং আচরণ রয়েছে যা বর্ণনা করে যে কীভাবে কোনও পৃথক বোড কৌশলগুলি তার কাছাকাছি ফ্লকমেট অবস্থান এবং গতির উপর ভিত্তি করে:

  • বিচ্ছেদ : স্থানীয় ফ্লকমেটদের ভিড় এড়াতে চালাও।
  • সারিবদ্ধকরণ : স্থানীয় ফ্লকমেটগুলির গড় শিরোনামের দিকে এগিয়ে যান।
  • সংহতি : স্থানীয় ফ্লকমেটগুলির গড় অবস্থানের দিকে এগিয়ে যেতে er

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

জিনিসগুলি ব্যাখ্যা করার সময় আমি নিখুঁত নই, তাই উত্সটি পরীক্ষা করার জন্য আমি উচ্চ পরামর্শ দিই । তাঁর সাইটে কয়েকটি সুপার তথ্যমূলক ছবিও রয়েছে has

চ্যালেঞ্জ

বোডের সংখ্যা (সিমুলেটেড সত্তা) এবং ফ্রেমের সংখ্যা দেওয়া, সিমুলেশনের একটি অ্যানিমেশন আউটপুট।

  • বোডগুলি একটি লাল বৃত্ত হিসাবে রেন্ডার করা উচিত, বৃত্তের অভ্যন্তরের একটি লাইন তার শিরোনাম দেখায়, যা বোডটি যে দিকে নির্দেশ করছে সেদিকে:

দুটি "বোড" এর অপরিশোধিত অঙ্কন, একটি বাম মুখোমুখি এবং অন্যটি ডান মুখী।

  • প্রতিটি বোডের কোণ (যেমন রেনল্ডস দ্বারা বর্ণিত) একটি পূর্ণ 300 ডিগ্রি হওয়া উচিত। (360 নয়)
  • প্রতিটি বিডের শুরুর শিরোনাম এবং অবস্থান সমানভাবে এলোমেলো হওয়া উচিত (তবে বীজযুক্ত, যাতে আউটপুট এখনও নির্ধারিত হয়) পাশাপাশি অবস্থানও।
  • বিডের ব্যাসার্ধটি যদি 1 হয় তবে তার চেয়ে ব্যাসার্ধের ব্যাসার্ধ 3 হওয়া উচিত।
  • বিডের সংখ্যা 2-2 থেকে যে কোনও জায়গায় থাকবে।
  • ফ্রেম সংখ্যা 1-5000 থেকে যে কোনও জায়গায় হবে
  • অ্যানিমেশনটি প্রতি ফ্রেমে সর্বনিম্ন 10 মিলিসেকেন্ড এবং বোডের সংখ্যা সর্বাধিক 1 সেকেন্ডের সাথে প্লে করা উচিত। (2 বোডস = 2 সেকেন্ড প্রতি ফ্রেম সর্বাধিক, 3 বোড = 3 সেকেন্ড প্রতি ফ্রেম সর্বাধিক, এবং সেল্টেরা)
  • আউটপুট অ্যানিমেশনটি কমপক্ষে 5 বোড-রেডিয়াই দ্বারা 5 বোড-রেডিয়ি হওয়া উচিত, বোডগুলির সংখ্যার অর্ধগুণ বেশি। সুতরাং, 2 বোডের জন্য সর্বনিম্ন আকার 10 বোড-রেডিও হবে 10 বোড-রেডিয়াই, 3 বোডের জন্য সর্বনিম্ন হবে 15 বোড-রেডিআই দ্বারা 15 বোড-রেডি, এবং সেটার।
  • প্রতিটি বিডের ব্যাসার্ধ অবশ্যই সর্বনিম্ন 5 পিক্সেল এবং সর্বোচ্চ 50 পিক্সেল হতে হবে be
  • প্রতিটি বিডের গতি সীমিত হওয়া দরকার যাতে এটি তার ফ্রেমের ব্যাসার্ধের 1/5 এর বেশি স্থান পরিবর্তন করে না।
  • আউটপুট নির্ধারণ করা দরকার, যাতে একাধিকবার চালানো হলে একই ইনপুট একই আউটপুট উত্পাদন করে।
  • যদি কোনও বোড একটি সীমানায় পৌঁছে যায়, তবে এটি অন্যদিকে ফিরে জড়ানো উচিত। তেমনিভাবে, প্রতিটি বিডের চারপাশের সীমানাগুলির চারপাশেও মোড়ানো উচিত।

অ্যালগরিদমের নিয়ম

এই ক্ষেত্রে, প্রতিটি বোডের চারপাশে 300 ডিগ্রি বিস্তৃত একটি সেক্টর রয়েছে, বোডের শিরোনামকে কেন্দ্র করে। এই "প্রতিবেশী" অন্য যে কোনও বিডকে "প্রতিবেশী" বা "রেনল্ডস শব্দটি ব্যবহার করতে" "ফ্লকমেট" হিসাবে বিবেচনা করা হয়।

  1. সংঘর্ষ এড়াতে এবং প্রতিটি প্রতিবেশীর সাথে এক বোড-ব্যাসার্ধের আরামদায়ক দূরত্ব বজায় রাখতে প্রতিটি বিডের শিরোনাম সামঞ্জস্য করা উচিত। (এটি আলগোরিদমের "বিচ্ছেদ" দিক The এক বোড-ব্যাসার্ধটি বাইপাস করা যেতে পারে তবে এটি একটি রাবার ব্যান্ডের মতো হওয়া উচিত, এটি জায়গায় ফিরে ছড়িয়ে পড়ে))

  2. প্রতিটি বিডকে তার শিরোনামটি তার নিয়মিতভাবে তার পাড়ার অন্যান্য বোডের গড় শিরোনামের কাছাকাছি স্থায়ী করতে হবে যতক্ষণ না এটি প্রথম নিয়মে হস্তক্ষেপ না করে। (এটি আলগোরিদিমের "প্রান্তিককরণ" দিক)

  3. যতক্ষণ না এটি সংঘর্ষের সৃষ্টি করে বা দ্বিতীয় নিয়মে উল্লেখযোগ্যভাবে হস্তক্ষেপ করে না ততক্ষণ প্রতিটি বিডকে তার ফ্লকমেটগুলির গড় অবস্থানের দিকে নিজেকে ঘুরিয়ে দেওয়া উচিত।

ইন বিষয় তার কাগজ , তিনি এই ব্যাখ্যা নিম্নরূপ:

সিমুলেটেড ফ্লক তৈরির জন্য, আমরা একটি বোড মডেল দিয়ে শুরু করি যা জ্যামিতিক বিমানকে সমর্থন করে। আমরা এমন আচরণগুলি সংযোজন করি যা সংঘর্ষ এড়ানোর বিরোধী শক্তির সাথে এবং ঝাঁক দলে যোগদানের তাগিদকে সামঞ্জস্য করে। সংক্ষিপ্তভাবে নিয়ম হিসাবে স্থিরীকৃত, এবং ক্রমহ্রাসমান অগ্রগতির ক্রম হিসাবে, আচরণগুলি যা অনুকরণীয় ঝাঁকুনির দিকে পরিচালিত করে:

  • সংঘর্ষ এড়ানো: নিকটবর্তী ফ্লকমেটগুলির সাথে সংঘর্ষ এড়ান
  • বেগ ম্যাচিং: নিকটস্থ ফ্লকমেটের সাথে বেগের সাথে মিলানোর চেষ্টা
  • ফ্লক সেন্টারিং: কাছাকাছি ফ্লকমেটদের কাছে থাকার চেষ্টা করুন

চলাচলের আরও বিশদ বিবরণ:

  • বোইডস অ্যালগরিদমের স্ট্যান্ডার্ড বাস্তবায়ন প্রতিটি নিয়মের জন্য সাধারণত একটি গণনা করে এবং একসাথে একত্রী করে।
  • প্রথম নিয়মের জন্য, বোডটি তার আশেপাশের প্রতিবেশী বোডগুলির তালিকার মধ্য দিয়ে যায় এবং যদি নিজের এবং প্রতিবেশীর মধ্যে দূরত্ব একটি নির্দিষ্ট মানের চেয়ে কম হয়, তবে বোডকে দূরে সরিয়ে রাখে এমন একটি ভেক্টর বোাইডের শিরোনামে প্রয়োগ করা হয়।
  • দ্বিতীয় নিয়মের জন্য, বিডটি তার প্রতিবেশীদের গড় শিরোনাম গণনা করে এবং তার বর্তমান শিরোনাম এবং তার বর্তমান শিরোনামের গড় শিরোনামের মধ্যে পার্থক্যের একটি ছোট অংশ (আমরা এই চ্যালেঞ্জের মধ্যে 1/10 ব্যবহার করব) যুক্ত করি।
  • তৃতীয় এবং চূড়ান্ত নিয়মের জন্য, বোডটি তার প্রতিবেশীদের অবস্থানগুলির গড় গড় করে, একটি ভেক্টর গণনা করে যা এই অবস্থানটির দিকে নির্দেশ করে। এই ভেক্টরটি 2 রুল (এই চ্যালেঞ্জের জন্য 1/50 ব্যবহার করা হবে) এর চেয়ে বেশি ছোট সংখ্যার দ্বারা গুণিত হয়েছে এবং শিরোনামটিতে প্রয়োগ হয়েছে।
  • এরপরে বোডটিকে তার শিরোনামের দিকে নিয়ে যাওয়া হয়

বোডস অ্যালগরিদমের কার্যকর সিউডোকোড বাস্তবায়ন এখানে

উদাহরণ ইনপুট এবং আউটপুট

ইনপুট:

5, 190 (5 বোড, 190 ফ্রেম)

আউটপুট:

5 বোডের সাথে বোডস অ্যালগরিদমের 190-ফ্রেম অ্যানিমেশন।

বিজয়ী মানদণ্ড

এটি , তাই বাইটগুলির মধ্যে ক্ষুদ্রতম সমাধানটি জিততে পারে।


7
"অবশ্যই অ্যালগরিদমের আরও অনেক কিছু রয়েছে, তাই উত্সটি পরীক্ষা করার জন্য আমি অত্যন্ত পরামর্শ দিই।" - এখানে সব কি দরকার? যদি না হয় আমি এটি ঠিক করার সুপারিশ করব।
জোনাথন অ্যালান

1
জিজ্ঞাসা পৃষ্ঠায় পরামর্শ হিসাবে, চ্যালেঞ্জ পোস্ট করার আগে স্যান্ডবক্স ব্যবহার করুন
flawr

@ জোনাথান অ্যালান হ্যাঁ, প্রয়োজনীয় সমস্ত কিছুই এখানে রয়েছে তবে অন্যান্য ব্যবহারকারীদের আরও বোধগম্য হতে পারে এমন আরও গভীরতার ব্যাখ্যা উত্সটিতে উপলব্ধ।
আইফোনিক্স

11
এটি একটি আকর্ষণীয় চ্যালেঞ্জ (আমি flocking আচরণগুলি আকর্ষণীয় মনে করি) তবে এটি ভালভাবে নির্দিষ্ট করা দরকার, বিশেষত একটি কোড-গল্ফের জন্য, অন্যথায় কোডটির দৈর্ঘ্য হ্রাস করার চাপ চ্যালেঞ্জের মনোভাব থেকে প্রতিটি সম্ভাব্য বিচ্যুতি ঘটায় উত্সাহিত করা।
ট্রিকোপল্যাক্স

উত্তর:


7

প্রসেসিং ৩.৩..6 (জাভা) ,932 931 940 928 957 917 904 বাইট

-1 থেকে বাইট জনাথন Frech
ভাল করার +11 বাইট মেলে বৈশিষ্ট
-2 থেকে বাইট কেভিন Cruijssen
টি args () পরিবর্তন করার জন্য -12 বাইট
+29 বাইট কারণ আমি ভুল ghosting করছেন, নীচের সংস্করণ মন্তব্য দেখুন
জন্য ব্যবহার করার জন্য -40 বাইট
ডিফল্ট ফ্রেমরেট, 30 ব্যবহারের জন্য প্রতিটি ভূত -13 বাইটের জন্য পৃথক কলের পরিবর্তে লুপগুলি

ভাল, এটি জাভা-গল্ফ না এমন ব্যক্তির জন্য একটি সূচনা। :)

int n=15,f=400,i,j,z=255,w=500;float d=200./n;PVector m;B[]a=new B[n];void setup(){size(500,500);fill(z,0,0);randomSeed(n);for(i=0;i<n;a[i++]=new B(new PVector(random(w),random(w)),m.fromAngle(random(TAU))));}void draw(){background(z);for(B b:a)b.u();if(frameCount%f<1)setup();}class B{PVector p,v,e,q,r;ArrayList<B>n;B(PVector m,PVector o){p=m;v=o;}void u(){e=v.copy();n=new ArrayList();for(B b:a){if(b!=this)for(i=-w;i<=w;i+=w)for(j=-w;j<=w;j+=w)t(i,j,b);}if(n.size()>0){q=new PVector();r=q.copy();for(B b:n){q.add(b.v);r.add(b.p);if(p.dist(b.p)<=d)e.add(p).sub(b.p);}e.add(q.div(n.size()).sub(v).div(10));e.add(r.div(n.size()).sub(p).div(50));}p.add(e.limit(d/10));v=e.mult(10);p.set((p.x+w)%w,(p.y+w)%w);noStroke();ellipse(p.x,p.y,d,d);stroke(0,0,z);line(p.x,p.y,p.x+v.x,p.y+v.y);}void t(int x,int y,B o){m=o.p.copy().add(x,y);if(2*d>=p.dist(m)&q.angleBetween(v,q.sub(m,p))<=5*PI/6)n.add(new B(m,o.v));}}

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

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

ফর্ম্যাট কোড, মন্তব্য সহ

int n=15, // Number of boids
    f=400, // Number of frames
    i,j,z=255,w=500; // temp*2, and two constants
float d=200./n; // Boid diameter
PVector m; // temp
B[]a=new B[n];
void setup(){ // This is automatically called at startup
  size(500,500); // Can't use variables for this without extra bytes for settings()
  fill(z,0,0);
  randomSeed(n); // seeded from number of Boids, so that n=19 is very different from n=20
  for(i=0;i<n;a[i++]=new B(new PVector(random(w),random(w)),m.fromAngle(random(TAU))));
}
void draw(){ // This is automatically called each frame
  background(z);
  for(B b:a)
    b.u();
  if(frameCount%f<1) // When desired frames length is hit, reset everything.
    setup();         // Could also use noLoop() instead of setup() to just stop instead.
                     // Or, remove this if statement altogether to go on to infinity.
}
class B{ // Boid
  PVector p,v,e,q,r; // Position, Velocity, Next velocity, and two temp vectors
  ArrayList<B>n; // List of neighbors
  B(PVector m,PVector o){
    p=m;
    v=o;
  }
  void u(){ // Update function, does rules and redraw for this Boid
    e=v.copy();
    n=new ArrayList();
    for(B b:a){ // Test a Boid and its eight ghosts for neighborship
      if(b!=this) // Note: Assumes neighborhood diameter < min(width,height)
        // The ghosts are to check if it'd be closer to measure by wrapping
        // We need eight for wrapping north, east, south, west, northeast,
        // northwest, southeast, and southwest. And also the non-wrapped one.
        // The above assumption ensures that each ghost is further apart than
        // the neighborhood diameter, meaning that only one neighbor might be
        // found for each boid. To test this, place a boid in each corner, right
        // to the edge, facing away from center. Each boid should find three
        // neighbors, that are the three other boids.
        for(i=-w;i<=w;i+=w)for(j=-w;j<=w;j+=w)t(i,j,b);
    }
    if(n.size()>0){
      q=new PVector();
      r=q.copy();
      for(B b:n){
        q.add(b.v); // Velocity matching, pt 1
        r.add(b.p); // Flock centering, pt 1
        if(p.dist(b.p)<=d)  
          e.add(p).sub(b.p); // Collision avoidance
      }
      e.add(q.div(n.size()).sub(v).div(10)); // Velocity matching, pt 2
      e.add(r.div(n.size()).sub(p).div(50)); // Flock centering, pt 2
    }
    p.add(e.limit(d/10)); // Update vectors
    v=e.mult(10);
    p.set((p.x+w)%w,(p.y+w)%w); // Wrapping
    noStroke();
    ellipse(p.x,p.y,d,d); // Draw Boid, finally
    stroke(0,0,z);
    line(p.x,p.y,p.x+v.x,p.y+v.y);
  }
  void t(int x,int y,B o){ // Test if a Boid (or a ghost) is a neighbor
    m=o.p.copy().add(x,y);
    if(2*d>=p.dist(m)&q.angleBetween(v,q.sub(m,p))<=5*PI/6)
      n.add(new B(m,o.v));
  }
}

নমুনা আউটপুট

n = 15, ফ্রেম = 400:

boids

বা, একই অ্যানিমেশন, তবে প্রতিটি বিডের আশেপাশে দেখানো হচ্ছে।


1
বাইট বাঁচাতে 2*PIহয়ে উঠতে পারে না TAU?
জোনাথন ফ্রেচ 18

@ জোনাথানফ্রেচ হ্যাঁ এটি করতে পারে; আমার মূলত -পিআই, পিআই এবং আমি সে পথে যাচ্ছিলাম, কিন্তু বিচ্ছিন্ন হয়ে পড়েছিলাম।
ফিলারেক্স

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

অন্য একটি বন্ধুত্বপূর্ণ অনুস্মারক, এই উত্তরটি অনুমানটিকে অনুসরণ করে না, সুতরাং এটি অনুগ্রহ পাবে না।
আইফোনিক্স

1
আমি প্রসেসিং জানি না, কিন্তু আমি মনে করি আপনি গলফ নিম্নলিখিত অপশন যা করতে পারেন: ,i,থেকে ,i=0,পরে অপসারণ i=0জন্য-লুপ ভিতরে। (-1 বাইট); frameCount%f==0to frameCount%f<1(1 বাইট); &&থেকে &চূড়ান্ত তাহলে 2*d>=p.dist(m)&q.angleBetween(v,q.sub(m,p))<=5*PI/6(-1 বাইট)। আবার, এগুলি সম্ভব কিনা তা নিশ্চিত নয়, তবে যেহেতু প্রসেসিং জাভার সাথে মোটামুটি অনুরূপ বলে মনে হয়, তাই আমি এটি মনে করি। এছাড়াও, আপনি স্ক্রেন্টোগিফ ডট কম দিয়ে একটি জিআইএফ তৈরি করার চেষ্টা করতে পারেন ।
কেভিন ক্রুইজসেন

4

জাভাস্ক্রিপ্ট (ES6) + HTML5, 1200 বাইট

ক্যানভাস এপিআই ব্যবহার করে এখানে আমার বর্তমান সমাধান। eval()একটি curried ফাংশন যার প্রথম ইনপুট ফেরৎ Boidজনসংখ্যা, এবং দ্বিতীয় অ্যানিমেশন ফ্রেম সংখ্যা। আপনি Infinityঅবিচ্ছিন্ন অ্যানিমেশন জন্য ব্যবহার করতে পারেন ।

eval(...)1187 বাইট এবং <canvas id=c>13 বাইট, 1200. মোট সিএসএস অপ্রয়োজনীয় উপার্জন কিন্তু সুবিধার জন্য, আপনার ক্যানভাস কোণগুলি দেখতে পারবেন।

eval("L7F7{function B8{t=this,t.a=o8*T,t.x=o8*S,t.y=o8*S}C=this.c,D=C.getContext`2d`,({abs:z,random:o,atan2:k,cos:u,sin:g,PI:P,T=2*P,G={c:_7A[r='filter'](b7b!=t)[i](9)79)),n:_7A[r](b7b!=t)[i](9)7({a,x,y:y-S})),s:_7A[r](b7b!=t)[i](9)7({a,x,y:y+S})),e:_7A[r](b7b!=t)[i](9)7({a,x:x-S,y})),w:_7A[r](b7b!=t)[i](9)7({a,x:x+S,y}))},M=I7[I,I+T,I-T][p]((a,x)7z(x)<z(a)?x:a)}=Math),B.prototype={d8{with(D)save8,translate(x,y),rotate(a),beginPath8,arc(0,0,5,0,T),fillStyle='red',fill8,beginPath8,moveTo(0,0),lineTo(10,0),strokeStyle='blue',stroke8,restore8},n:_7(({c,n,s,e,w}=G),c8.concat(n8,s8,e8,w8)[r](b7(d=b.x-x,f=b.y-y,400>d*d+f*f&&z(z(k(f,d)-a)/P-1)>1/6))),s8{q=(j=t.n8).length,v=t.v8||0,l=t.l8||0,f=t.f8||0,a=t.a=(t.a+v+l/10+f/50)%T,t.x=(x+u(a)+S)%S,t.y=(y+g(a)+S)%S},v:_7([d,f]=j[r](b7225>(b.x-x)**2+(b.y-y)**2)[p='reduce'](([d,f],b)7[x+d-b.x,y+f-b.y],[0,0]),d||f?M(k(f,d)-a):0),l:_7j[i](b7M(b.a-a))[p]((a,x)7a+x,0)/q,f:_7([d,f]=j[p](([d,f],b)7[d+b.x,f+b.y],[-x*q,-y*q]),d||f?M(k(f,d)-a):0)},S=C.width=C.height=50*L,A=Array(L).fill().map(_7new B),R=_7{D.clearRect(0,0,S,S),A[i='map'](b79=b).d8),A[i](b79=t=b).s8),F--&&setTimeout(R,10)},R8}".replace(/[789]/g,m=>['=>','()','({a,x,y}'][m-7]))
(10)(Infinity)
canvas{border:1px solid}
<canvas id=c>

সম্পাদন করা

অনুরোধ হিসাবে, বোডের জনসংখ্যার জন্য একটি ইনপুট সহ আরও একটি স্নিপেট:

b.onchange=()=>{eval("L7F7{function B8{t=this,t.a=o8*T,t.x=o8*S,t.y=o8*S}C=this.c,D=C.getContext`2d`,({abs:z,random:o,atan2:k,cos:u,sin:g,PI:P,T=2*P,G={c:_7A[r='filter'](b7b!=t)[i](9)79)),n:_7A[r](b7b!=t)[i](9)7({a,x,y:y-S})),s:_7A[r](b7b!=t)[i](9)7({a,x,y:y+S})),e:_7A[r](b7b!=t)[i](9)7({a,x:x-S,y})),w:_7A[r](b7b!=t)[i](9)7({a,x:x+S,y}))},M=I7[I,I+T,I-T][p]((a,x)7z(x)<z(a)?x:a)}=Math),B.prototype={d8{with(D)save8,translate(x,y),rotate(a),beginPath8,arc(0,0,5,0,T),fillStyle='red',fill8,beginPath8,moveTo(0,0),lineTo(10,0),strokeStyle='blue',stroke8,restore8},n:_7(({c,n,s,e,w}=G),c8.concat(n8,s8,e8,w8)[r](b7(d=b.x-x,f=b.y-y,400>d*d+f*f&&z(z(k(f,d)-a)/P-1)>1/6))),s8{q=(j=t.n8).length,v=t.v8||0,l=t.l8||0,f=t.f8||0,a=t.a=(t.a+v/3+l/10+f/50)%T,t.x=(x+u(a)+S)%S,t.y=(y+g(a)+S)%S},v:_7([d,f]=j[r](b7225>(b.x-x)**2+(b.y-y)**2)[p='reduce'](([d,f],b)7[x+d-b.x,y+f-b.y],[0,0]),d||f?M(k(f,d)-a):0),l:_7j[i](b7M(b.a-a))[p]((a,x)7a+x,0)/q,f:_7([d,f]=j[p](([d,f],b)7[d+b.x,f+b.y],[-x*q,-y*q]),d||f?M(k(f,d)-a):0)},S=C.width=C.height=50*L,A=Array(L).fill().map(_7new B),R=_7{D.clearRect(0,0,S,S),A[i='map'](b79=b).d8),A[i](b79=t=b).s8),F--&&setTimeout(R,10)},R8}".replace(/[789]/g,m=>['=>','()','({a,x,y}'][m-7]))(+b.value)(Infinity);b.remove()}
input{display:block}canvas{border:1px solid}
<input id=b><canvas id=c>


আমি স্নিপেটটি চালানোর সময় বোডগুলি কোনওভাবেই যোগাযোগ করবে বলে মনে হয় না
জো কিং

@ জোকিং এটি এখনই ঠিক করা উচিত
প্যাট্রিক রবার্টস

সমস্যাটি কারণ ব্যাবেল মিনিফায়ার একটি প্যারামিটার নামের সাথে একটি ফাংশনে বিশ্বব্যাপী পরিবর্তনশীলকে ছায়া দিয়েছিল এবং কোনও সংখ্যায় অন্তর্ভুক্ত টাইপকাস্ট কোনও ত্রুটি ঘটায় না, তাই ফাংশনটি কেবল নিঃশব্দে ব্যর্থ হয়েছিল এবং কোনও প্রতিবেশী সনাক্ত করে নি।
প্যাট্রিক রবার্টস

আমি আগামীকাল রাতে একটি ইন্টারেক্টিভ ডেমো করার চেষ্টা করব তবে আমি আজ রাতের জন্য বাষ্প শেষ করেছি।
প্যাট্রিক রবার্টস

কেবল একটি নোট: যেখানে এটি পড়েছে t.a+v+l/10+f/50, আপনি যদি এটিতে পরিবর্তন করেন তবে t.a+v/3+l/10+f/50এটি কিছুটা আরও আকর্ষণীয় আচরণ তৈরি করে তবে বর্তমান প্রোগ্রামটি ছোট এবং এখনও অনুমানযোগ্য।
প্যাট্রিক রবার্টস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.