একটি বৃত্তের বিভ্রম অ্যানিমেশন তৈরি করুন


84

আপনার কাজটি এই বৃত্তের মায়া সঞ্চারিত করা । দেখে মনে হচ্ছে বৃত্তের অভ্যন্তরে পয়েন্টগুলি ঘোরছে তবে এগুলি আসলে কেবল সরলরেখায় চলছে moving

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

criterias

  • ফলাফলটি অ্যানিমেটেড করতে হবে। আপনি অ্যানিমেশনটি যেভাবে করেন তা অপ্রাসঙ্গিক, এটি একটি উত্পন্ন করতে পারে .gif, এটি একটি উইন্ডোতে আঁকতে পারে, কিছু ডিভাইস স্ক্রিন বা যাই হোক না কেন।
  • এটি একটি জনপ্রিয়তা প্রতিযোগিতা, সুতরাং আপনি আরও বেশি কিছু পেতে আপনার প্রোগ্রামে কিছু অতিরিক্ত বৈশিষ্ট্য যুক্ত করতে চাইতে পারেন, উদাহরণস্বরূপ পয়েন্টের সংখ্যা পৃথক করে।
  • বিজয়ী সর্বশেষ বৈধ জমা দেওয়ার 7 দিন পরে সর্বাধিক উন্নত বৈধ উত্তর is
  • যে উত্তরগুলি প্রকৃতপক্ষে সরলরেখায় চলমান পয়েন্টগুলি বাস্তবায়িত করবে এবং অন্য কোনও উপায়ে নয় more

"বিজয়ী 7 দিনের পরে সর্বাধিক উন্নত বৈধ"। সুতরাং তারার মারা যাওয়ার আগ পর্যন্ত যদি প্রতি 6 দিনে কেউ কিছু পোস্ট করে তবে আমাদের কোনও বিজয়ী নেই?
কেভিন এল

3
@ কেভিনল যা হওয়ার সম্ভাবনা নেই এবং আমি মনে করি না যে এই ১৫ টি অতিরিক্ত প্রতিনিধি এই প্রশ্নটি থেকে আপনি যে উত্সাহ পেয়েছেন তার তুলনায় প্রতি 6 দিনের মধ্যে শীর্ষে উঠা উচিত important
মার্টিন এন্ডার

1
কখনও কখনও আমি ভাবছি যদি কিছু লোক কেবল এই কাজটি করার জন্য এটি করে ...
ড্যানিয়েল পেন্ডারগাস্ট

3
"এটি দেখতে বৃত্তের ভিতরে পয়েন্টগুলি ঘোরার মতো দেখায়, তবে এগুলি আসলে কেবল সরলরেখায় চলেছে" ", বা, সম্ভবত তারা সত্যিকার অর্থে একটি বৃত্তের ভিতরে ঘোরছে এবং সরলরেখায় চলেছে বলে মনে হচ্ছে ...
coredump

1
এই অ্যানিমেশনটি পাওয়া যায় না .. আমার মনের বাইরে .. বিশেষত 3-দফা সংস্করণ!
থমাস

উত্তর:


126

পাইথন ৩.৪

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

11 কচ্ছপ

মাত্র 3 বা 4 টি কচ্ছপের সাথেও মায়া এখনও বেশ শক্তিশালী বলে মনে হচ্ছে:

3 টি কচ্ছপ4 টি কচ্ছপ

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

import turtle
import time
from math import sin, pi
from random import random


def circle_dance(population=11, resolution=480, loops=1, flip=0, lines=0):
    population = int(population)
    resolution = int(resolution)
    radius = 250
    screen = turtle.Screen()
    screen.tracer(0)
    if lines:
        arrange_lines(population, radius)
    turtles = [turtle.Turtle() for i in range(population)]
    for i in range(population):
        dancer = turtles[i]
        make_dancer(dancer, i, population)
    animate(turtles, resolution, screen, loops, flip, radius)


def arrange_lines(population, radius):
    artist = turtle.Turtle()
    for n in range(population):
        artist.penup()
        artist.setposition(0, 0)
        artist.setheading(n / population * 180)
        artist.forward(-radius)
        artist.pendown()
        artist.forward(radius * 2)
    artist.hideturtle()


def make_dancer(dancer, i, population):
    dancer.setheading(i / population * 180)
    dancer.color(random_turtle_colour())
    dancer.penup()
    dancer.shape('turtle')
    dancer.turtlesize(2)


def random_turtle_colour():
    return random() * 0.9, 0.5 + random() * 0.5, random() * 0.7


def animate(turtles, resolution, screen, loops, flip, radius):
    delay = 4 / resolution      # 4 seconds per repetition
    while True:
        for step in range(resolution):
            timer = time.perf_counter()
            phase = step / resolution * 2 * pi
            draw_dancers(turtles, phase, screen, loops, flip, radius)
            elapsed = time.perf_counter() - timer
            adjusted_delay = max(0, delay - elapsed)
            time.sleep(adjusted_delay)


def draw_dancers(turtles, phase, screen, loops, flip, radius):
    population = len(turtles)
    for i in range(population):
        individual_phase = (phase + i / population * loops * pi) % (2*pi)
        dancer = turtles[i]
        if flip:
            if pi / 2 < individual_phase <= 3 * pi / 2:
                dancer.settiltangle(180)
            else:
                dancer.settiltangle(0)
        distance = radius * sin(individual_phase)
        dancer.setposition(0, 0)
        dancer.forward(distance)
    screen.update()


if __name__ == '__main__':
    import sys
    circle_dance(*(float(n) for n in sys.argv[1:]))

বিপরীতে এখানে এমন কিছু রয়েছে যা সত্যিই ঘোরান:

23 লুপ কচ্ছপ23 ট্রাফয়েল কচ্ছপ

... নাকি তারা?

কোডটি 5 টি alচ্ছিক আর্গুমেন্ট দিয়ে চালানো যেতে পারে: জনসংখ্যা, রেজোলিউশন, লুপ, ফ্লিপ এবং লাইন।

  • population কচ্ছপের সংখ্যা
  • resolution সময় রেজোলিউশন (পুনরাবৃত্তি প্রতি অ্যানিমেশন ফ্রেমের সংখ্যা)
  • loopsকচ্ছপগুলি নিজের উপর কতবার ফিরে আসে তা নির্ধারণ করে। 1 এর ডিফল্ট একটি স্ট্যান্ডার্ড বৃত্ত দেয়, অন্যান্য বিজোড় সংখ্যা কচ্ছপের স্ট্রিংতে সেই সংখ্যাটিকে দেয়, এমনকি সংখ্যক প্রান্তে সংযোগ বিচ্ছিন্ন কচ্ছপের একটি স্ট্রিং দেয় তবে এখনও বক্র গতির মায়া দিয়ে।
  • flipযদি অ-শূন্যের কারণে কচ্ছপগুলি তাদের প্রত্যাবর্তনের ভ্রমণের জন্য দিক থেকে সরিয়ে ফেলার কারণ হয়ে থাকে ( aslum দ্বারা প্রস্তাবিত যাতে তারা কখনও পিছনে না যায়)। ডিফল্ট হিসাবে তারা শেষ পয়েন্টগুলিতে দৃষ্টিভঙ্গি এড়াতে একটি নির্দিষ্ট দিক রাখে।
  • lines যদি শূন্য-বিহীন প্রশ্নটির উদাহরণ চিত্রের সাথে সামঞ্জস্যের জন্য কচ্ছপগুলি সরানো রেখাগুলি প্রদর্শন করে।

flipসেট সহ, সাথে এবং বাইরে উদাহরণগুলি lines। আমি উপরে আমার মূল উদাহরণটি ফ্লিপ ছাড়াই ছেড়ে দিয়েছি কারণ আমি বিক্ষিপ্ত লাফ না পছন্দ করি, তবে বৃত্তের প্রান্তটি সমস্ত কচ্ছপ প্রান্তিককরণের সাথে মসৃণ দেখায়, তাই লোকেরা চলার সময় যেকোন শৈলীর পছন্দ পছন্দ করার জন্য বিকল্প রয়েছে কোড.

ফ্লিপ এবং লাইন সহ 11 টি কচ্ছপফ্লিপ সহ ১১ টি কচ্ছপ

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

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

বিভিন্ন সংখ্যা চেষ্টা করে দেখতে পেয়েছি আমি এর মধ্যে কয়েকটি বিকৃতি আরও বেশি প্রতিসম মূলের চেয়ে আকর্ষণীয় পেয়েছি তাই আমি এখানে একটি অন্তর্ভুক্ত করতে চেয়েছিলাম ...


18
আমি কচ্ছপ পছন্দ করি.
ফ্রিএএসআইনবিয়ার

18
আমি কচ্ছপগুলির জন্য +1 শেল আউট করেছি
MrEngineer 13

@ প্রোগ্রামফক্স ধন্যবাদ সিনট্যাক্স হাইলাইট করার জন্য ধন্যবাদ! আমি সহায়তা এবং মেটা দিয়ে অনুসন্ধান করেছিলাম এবং নিজেকে নিশ্চিত করেছিলাম যে কোড গল্ফে আমাদের কাছে সিনট্যাক্স হাইলাইট করা নেই - আমি এখন এ থেকে অনেক বেশি খুশি।
23:54

1
@ এস্লাম যে এটি করা সহজ-সরল পরিবর্তন হতে পারে তবে আমি চাইছিলাম তাদের অভিমুখীকরণ হ'ল সত্যই জোর দেওয়ার জন্য যে তারা তাদের সরলরেখার পথ থেকে বিচ্যুত হয় না। হতে পারে আমার কোডটিতে এটি বিকল্প হিসাবে যুক্ত করা উচিত যাতে লোকেরা তাদের পছন্দের পদ্ধতির পছন্দ করতে পারে।
ট্রাইকোপল্যাক্স

4
+1 - মার্চিং ব্যান্ডটি এই ফানকিয়ারদের মধ্যে কিছু করতে দেখে দুর্দান্ত লাগবে!
এমকোইস্টেইনেন

96

সি

ফলাফল:

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

#include <stdio.h>
#include <Windows.h>
#include <Math.h>

int round (double r) { return (r > 0.0) ? (r + 0.5) : (r - 0.5); }
void print (int x, int y, char c) {
    COORD p = { x, y };
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p);
    printf("%c", c);
}

int main ()
{
    float pi = 3.14159265358979323846;
    float circle = pi * 2;
    int len = 12;
    int hlen = len / 2;
    int cx = 13;
    int cy = 8;
    float w = 11.0;
    float h =  8.0;
    float step = 0.0;

    while (1)
    {
        system("cls"); // xD

        for (int i = 0; i < len; i++)
        {
            float a = (i / (float)len) * circle;
            int x = cx + round(cos(a) * w);
            int y = cy + round(sin(a) * h);
            print(x, y, 'O');

            if (i < hlen) continue;

            step -= 0.05;
            float range = cos(a + step);
            x = cx + round(cos(a) * (w - 1) * range);
            y = cy + round(sin(a) * (h - 1) * range);
            print(x, y, 'O');
        }

        Sleep(100);
    }

    return 0;
}

3
কিছু ফ্রেমে এটি কিছুটা বন্ধ। তবে এটি ASCII তে করায় অভিনন্দন!
জাস্টহেল্ফ

10
ASCII এর জন্য +1 এবংsystem("cls"); // xD
ক্রিস্টোফ বাহ্মওয়ালদার

1
এটা সুন্দর.
ট্রাইকোপলাক্স


বাধ্যতামূলক বিদ্বেষী মন্তব্য: "এটি সি হয় না! স্ট্যান্ডার্ডটি স্লিপ, কর্ড বা সেটকনসোলকর্সর অবস্থানের সংজ্ঞা দেয় না!"
ইমিবিস

52

এসভিজি (জাভাস্ক্রিপ্ট নেই)

জেএসফিডাল লিঙ্কটি এখানে

<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 380 380" width="380" height="380" version="1.0">
  <g transform="translate(190 190)">
    <circle cx="0" cy="0" r="190" fill="#000"/>
    <line x1="0" y1="-190" x2="0" y2="190" stroke="#fff" stroke-width="1.5"/>
    <line x1="72.71" y1="175.54" x2="-72.71" y2="-175.54" stroke="#fff" stroke-width="1.5"/>
    <line x1="134.35" y1="134.35" x2="-134.35" y2="-134.35" stroke="#fff" stroke-width="1.5"/>
    <line x1="175.54" y1="72.71" x2="-175.54" y2="-72.71" stroke="#fff" stroke-width="1.5"/>
    <line x1="190" y1="0" x2="-190" y2="0" stroke="#fff" stroke-width="1.5"/>
    <line x1="175.54" y1="-72.71" x2="-175.54" y2="72.71" stroke="#fff" stroke-width="1.5"/>
    <line x1="134.35" y1="-134.35" x2="-134.35" y2="134.35" stroke="#fff" stroke-width="1.5"/>
    <line x1="72.71" y1="-175.54" x2="-72.71" y2="175.54" stroke="#fff" stroke-width="1.5"/>
    <g transform="rotate(0)">
      <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0" to="360" begin="0" dur="8s" repeatCount="indefinite"/>
      <g transform="translate(0 90)">
        <g transform="rotate(0)">
          <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0" to="-360" begin="0" dur="4s" repeatCount="indefinite"/>
          <circle cx="0" cy="90" r="10" fill="#fff"/>
          <circle cx="63.64" cy="63.64" r="10" fill="#fff"/>
          <circle cx="90" cy="0" r="10" fill="#fff"/>
          <circle cx="63.64" cy="-63.64" r="10" fill="#fff"/>
          <circle cx="0" cy="-90" r="10" fill="#fff"/>
          <circle cx="-63.64" cy="-63.64" r="10" fill="#fff"/>
          <circle cx="-90" cy="0" r="10" fill="#fff"/>
          <circle cx="-63.64" cy="63.64" r="10" fill="#fff"/>
        </g>
      </g>
    </g>
  </g>
</svg>

হুম, আমি নিশ্চিত যে এটি নিয়মগুলি মজুত করে চলেছে, তবে আমি ব্যক্তিগতভাবে হতাশ হয়েছি যে আপনি আসলে বিপরীত কাজ করছেন। পরিবর্তে "দেখে মনে হচ্ছে এটি বিন্দুগুলির মধ্যে [পয়েন্টগুলি] বৃত্তের অভ্যন্তরে ঘুরছে, তবে সেগুলি আসলে কেবল সরলরেখায় চলছে ” ", আপনার প্রয়োগগুলি:" দেখে মনে হচ্ছে পয়েন্টগুলি [সরল রেখায়] চলেছে, তবে সেগুলি আসলে কেবলমাত্র বৃত্তের অভ্যন্তরে ঘোরানো । "
মকোইস্টেইনেন

স্মুটেস্ট উত্তর!
ডেরেক 朕 會

14
@ এমকোয়েস্টিনেন আমি আপনাকে বোঝাতে চাইছি তবে পয়েন্টগুলি সত্যই সরলরেখায় চলছে। দুটি
ঘোরাঘুরি

আপনি এটি 'হাত দ্বারা' সমস্ত করেছেন বা আপনি কোনও ধরণের (অ-পাঠ্য-সম্পাদক) ব্যবহার করেছেন?
flawr

5
@flawr আমি শুধু একটি ব্যবহৃত প্লেইন টেক্সট এডিটর সংখ্যার কাজ এবং আমার ফোনে ক্যালকুলেটর :-)
খুঁতখুঁতে ossifrage

47

http://jsfiddle.net/z6vhD/13/

intervaltimeএফপিএস (এফপিএস = 1000 / ইন্টারভালটাইম) পরিবর্তন করে।
balls# বল পরিবর্তন করে।
maxstepএকটি চক্রের # পদক্ষেপগুলি সামঞ্জস্য করে, এটি যত 'মসৃণ' হয় তত বড়। 64 টি যথেষ্ট বড় হওয়া উচিত যেখানে এটি মসৃণ প্রদর্শিত হবে।

লাইনের সাথে বলগুলি সরানোর পরিবর্তে চেনাশোনা সরানো হিসাবে মডেল করা, তবে ভিজ্যুয়াল এফেক্টটি (হওয়া উচিত?) একইরকম। কিছু কোড বেশ ভার্জোজ, তবে এটি কোড গল্ফ নয়, তাই ...

var intervalTime = 40;
var balls = 8;
var maxstep = 64;

var canvas = $('#c').get(0); // 100% necessary jquery
var ctx = canvas.getContext('2d');
var step = 0;

animateWorld = function() {
    createBase();
    step = step % maxstep;
    var centerX = canvas.width/2 + 115 * Math.cos(step * 2 / maxstep * Math.PI);
    var centerY = canvas.height/2 + 115 * Math.sin(step * 2 / maxstep * Math.PI);

    for (var i=0; i<balls; i++) {
        drawCircle(ctx, (centerX + 115 * Math.cos((i * 2 / balls - step * 2 / maxstep) * Math.PI)), (centerY + 115 * Math.sin((i * 2 / balls - step * 2 / maxstep) * Math.PI)), 10, '#FFFFFF');     
    }

    step++;
}

function createBase() {
    drawCircle(ctx, canvas.width/2, canvas.height/2, 240, '#000000');
    for(var i=0; i<balls*2; i++) {
        drawLine(ctx, canvas.width/2, canvas.height/2, canvas.width/2 + 240 * Math.cos(i / balls * Math.PI), canvas.height/2 + 240 * Math.sin(i / balls * Math.PI), '#FFFFFF');
    }
}

function drawLine(context, x1, y1, x2, y2, c) {
    context.beginPath();
    context.moveTo(x1,y1);
    context.lineTo(x2,y2);
    context.lineWidth = 3;
    context.strokeStyle = c;
    context.stroke();
}

function drawCircle(context, x, y, r, c) {
    context.beginPath();
    context.arc(x, y, r, 0, 2*Math.PI);
    context.fillStyle = c;
    context.fill();
}

function drawRect(context, x, y, w, h, c) {
    context.fillStyle = c;
    context.fillRect(x, y, w, h);
}

$(document).ready(function() {
    intervalID = window.setInterval(animateWorld, intervalTime);
});

2
এটা এত মসৃণ! খুব সুন্দর.
nneonneo

5
অ্যানিমেশনগুলির জন্য setInterval ব্যবহার করবেন না, requestAnimationFrameপরিবর্তে গ্রহণ করুনজেএসফিডেল ব্যবহার করে পরিবর্তিতrequestAnimationFrame
klingt.net

1
মাত্র কয়েকটি প্যারামিটারের টুইটের সাহায্যে আপনি একটি খুব আলাদা জিনিস পেয়ে যান
ফ্রিএএসআইনবিয়ার

কেভিনল ইয়েপ, কেবল এটি লক্ষ্য করা গেছে। আপডেট করা হয়েছে।
ফ্রিএএসইনবিয়ার 13

1
@ ফ্রিএএসআইনবীর ওহ, যখন আপনি খুব আলাদা কথা বলেছিলেন, আমি ভেবেছিলাম যে আপনি jsfiddle.net/z6vhD/100-এর
কেভিন এল

41

সিএসএস অ্যানিমেশন

কেবলমাত্র সিএসএস অ্যানিমেশন ব্যবহার করে একটি সমাধান ( জেএসফিডেলে অ্যানিমেশন দেখুন - নোট করুন যে আমি ব্রাউজারটিতে সুনির্দিষ্ট উপসর্গগুলি যুক্ত করেছি যাতে এটি সাম্প্রতিক সংস্করণগুলিতে কাজ করতে পারে)।

<body>
    <div id="w1"></div>
    <div id="w2"></div>
    <div id="w3"></div>
    <div id="w4"></div>
    <div id="w5"></div>
    <div id="w6"></div>
    <div id="w7"></div>
    <div id="w8"></div>
</body>


div {
    position: absolute;
    width: 20px;
    height: 20px;
    border-radius: 20px;
    background: red;
    animation-duration: 4s;
    animation-iteration-count: infinite;
    animation-direction: alternate;
    animation-timing-function: ease-in-out;
}

#w1 { animation-name: s1; animation-delay: 0.0s }
#w2 { animation-name: s2; animation-delay: 0.5s }
#w3 { animation-name: s3; animation-delay: 1.0s }
#w4 { animation-name: s4; animation-delay: 1.5s }
#w5 { animation-name: s5; animation-delay: 2.0s }
#w6 { animation-name: s6; animation-delay: 2.5s }
#w7 { animation-name: s7; animation-delay: 3.0s }
#w8 { animation-name: s8; animation-delay: 3.5s }

@keyframes s1 { from {top: 100px; left:   0px;} to {top: 100px; left: 200px;} } 
@keyframes s2 { from {top:  62px; left:   8px;} to {top: 138px; left: 192px;} } 
@keyframes s3 { from {top:  29px; left:  29px;} to {top: 171px; left: 171px;} } 
@keyframes s4 { from {top:   8px; left:  62px;} to {top: 192px; left: 138px;} } 
@keyframes s5 { from {top:   0px; left: 100px;} to {top: 200px; left: 100px;} } 
@keyframes s6 { from {top:   8px; left: 138px;} to {top: 192px; left:  62px;} } 
@keyframes s7 { from {top:  29px; left: 171px;} to {top: 171px; left:  29px;} } 
@keyframes s8 { from {top:  62px; left: 192px;} to {top: 138px; left:   8px;} } 


1
@ এমকোয়েস্টিনেন - এটি বিভিন্ন ব্রাউজারে কাজ করার জন্য আপনাকে বিভিন্ন উপসর্গ যুক্ত করতে হবে। ( -webkit-ওয়েবকিট-ভিত্তিক এবং -moz-মজিলা ভিত্তিকের
ডেরেক 朕

@ এমকোইস্টিনেন আপনি ঠিক বলেছেন নতুন ফিডল সমস্ত প্রয়োজনীয় ব্রাউজারের উপসর্গ যুক্ত করে এবং সর্বশেষ ক্রোমে কাজ করে।
হাওয়ার্ড

কাঁচা লিঙ্কের পাঠ্যটি কেবল বন্ধ হওয়া প্রথম বন্ধনী অনুপস্থিত - এটি ঠিক করতে চাইলে আপনি এখনও অবধি পুরোপুরি ব্যবহারযোগ্য (আপনার পরিবর্তনের জন্য এটি characters টি অক্ষরের চেয়ে কম হিসাবে আমি করতে পারি না)।
23:51

35

ম্যাথামেটিকাল

এখানে একটি দুর্দান্ত সোজা-এগিয়ে জমা দেওয়া হয়।

animateCircle[n_] := Animate[Graphics[
   Flatten@{
     Disk[],
     White,
     Map[
      (
        phase = #*2 \[Pi]/n;
        line = {Cos[phase], Sin[phase]};
        {Line[{-line, line}],
         Disk[Sin[t + phase]*line, 0.05]}
        ) &,
      Range[n]
      ]
     },
   PlotRange -> {{-1.1, 1.1}, {-1.1, 1.1}}
   ],
  {t, 0, 2 \[Pi]}
  ]

আপনি যদি কল করেন তবে animateCircle[32]আপনি 32 লাইন এবং চেনাশোনা সহ একটি ঝরঝরে অ্যানিমেশন পাবেন।

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

এটি ম্যাথামেটিকায় সম্পূর্ণ মসৃণ, তবে আমাকে জিআইএফের জন্য ফ্রেমের সংখ্যাটি কিছুটা সীমাবদ্ধ করতে হয়েছিল।

এখন আপনি যদি প্রতিটি লাইনে দুটি ডিস্ক রাখেন তবে কী হবে? (এটি, Disk[-Sin[t + phase]*line, 0.05]তালিকার মধ্যে তালিকায় যুক্ত করুন Map))

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

আপনি তাদের 90 phase পর্যায়ের বাইরে রাখতে পারেন ( Cosপরিবর্তে ব্যবহার করুন -Sin):

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


আপনার গ্লিটস বলতে কী বোঝায় তা আমি জানি না, সম্ভবত আপনাকে এমন পরিবর্তন {t, 0, 2 \[Pi]}করতে হবে {t, 0, 2 \[Pi] - 2 \[Pi]/60, 2 \[Pi]/60}যাতে দুটি অভিন্ন ফ্রেম না থাকে এবং এতে পরিবর্তন Animateহয় Table। তারপরে আপনি জিআইএফ রফতানি করতে সক্ষম হবেন।
ফিটফাট

@ সুইশ না এটি আসলে অদ্ভুত অতিরিক্ত লাইন সরবরাহ করে যা সেখানে নেই এবং যেখানে সেগুলি হওয়া উচিত নয় সেখানে ডিস্কগুলি (এবং যেখানে তারা কখনই প্রকৃত ফলাফলের মধ্যে নেই Animate)। আমি Tableআবার ব্যবহার করার চেষ্টা করব ।
মার্টিন ইন্ডার

@ সুইশ এটি কাজ করেছে আমি ভেবেছিলাম গতকাল আমি এই জাতীয় কিছু চেষ্টা করেছি, তবে দৃশ্যত আমি তা করি নি।
মার্টিন ইন্ডার

25

ভিবিএস স্ক্রিপ্ট + ভিবিএ + এক্সেল পাই চার্ট

এটি আপনার প্রসেসরটিকে কিছুটা কাঁদবে তবে এটি দেখতে সুন্দর দেখাচ্ছে এবং আমি বিশ্বাস করি এটি অনুমান অনুসারে কাজ করে। আমি চক্রের আন্দোলন অ্যালগরিদম বাস্তবায়নের জন্য গাইড হিসাবে @ ফ্যাব্রিসিওর উত্তরটি ব্যবহার করেছি।

সম্পাদনা: রেন্ডার গতির উন্নতি করতে কিছু সামঞ্জস্য করেছেন।

পাই চার্টের স্ক্রিনশট

কোড:

'Open Excel
Set objX = CreateObject("Excel.Application")
objX.Visible = True
objX.Workbooks.Add

'Populate values
objX.Cells(1, 1).Value = "Lbl"
objX.Cells(1, 2).Value = "Amt"
For fillX = 2 to 17
    objX.Cells(fillX, 1).Value = "V"+Cstr(fillX-1)
    objX.Cells(fillX, 2).Value = "1"
Next

'Create pie
objX.Range("A2:B17").Select
objX.ActiveSheet.Shapes.AddChart.Select
With objX.ActiveChart
    .ChartType = 5 'pieChart
    .SetSourceData  objX.Range("$A$2:$B$17")
    .SeriesCollection(1).Select
End with    

'Format pie
With objX.Selection.Format
    .Fill.ForeColor.RGB = 0 'black
    .Fill.Solid
    .Line.Weight = 2
    .Line.Visible = 1
    .Line.ForeColor.RGB = 16777215 'white
End With

'animation variables
pi = 3.14159265358979323846
circle = pi * 2 : l  = 16.0
hlen = l / 2    : cx = 152.0
cy = 99.0       : w  = 90.0
h  = 90.0       : s  = 0.0
Dim posArry(7,1)

'Animate
While 1 
  For i = 0 to hlen-1
    a = (i / l) * circle
    range = cos(a + s)
    x = cx + cos(a) * w * range
    y = cy + sin(a) * h * range

    If whileInx = 1 Then 
        createOval x, y
    ElseIf whileInx = 2 Then 
        objX.ActiveChart.Legend.Select
    ElseIf whileInx > 2 Then
        ovalName = "Oval "+ Cstr(i+1)
        dx = x - posArry(i,0)
        dy = y - posArry(i,1)
        moveOval ovalName, dx, dy
    End if

    posArry(i,0) = x
    posArry(i,1) = y
  Next

  s=s-0.05
  wscript.Sleep 1000/60 '60fps
  whileInx = 1 + whileInx
Wend

'create circles
sub createOval(posX, posY)
    objX.ActiveChart.Shapes.AddShape(9, posX, posY, 10, 10).Select '9=oval
    objX.Selection.ShapeRange.Line.Visible = 0
    with objX.Selection.ShapeRange.Fill
       .Visible = 1
       .ForeColor.RGB = 16777215 'white
       .solid
    end with
end sub

'move circles
sub moveOval(ovalName, dx, dy)
    with objX.ActiveChart.Shapes(ovalName)      
        .IncrementLeft dx
        .IncrementTop  dy
    end with
end sub

এটি 81 লাইনে আমার জন্য ক্র্যাশ, 80070057 ত্রুটি, "প্রদত্ত নামের সাথে উপাদান উপস্থিত নেই" বা এর মতো কিছু (হাঙ্গেরিয়ান থেকে ফিরে অনুবাদ, এজন্য আমি সঠিক ত্রুটির বার্তাটি জানি না)।
মার্চজেল্ম

জার্ভুস, @ মার্কেজেলম। আমি যখন চার্টের বাইরে "অ্যানিমেটিং" থাকাকালীন ক্লিক করি তখন আমি ত্রুটিটি পুনরুত্পাদন করতে পারি। আপনাকে এটিকে ফোকাস করার অনুমতি দিতে হবে বা প্রোগ্রামটি ত্রুটি করবে। অন্যথায়, এটি অফিসের সাথে বেমানান হওয়ার কারণে হতে পারে। আমি উইন 7-এ অফিস 2010 এ আছি।
comfortablydrei

অফিস 2007, উইন 7। আমার ক্ষেত্রে দেখে মনে হচ্ছে চার্টটি মোটেই ফোকাস পায় না।
মার্কেজেল্ম

21

এক্সেল, 161 বাইট

সীমা অতিক্রম করা

=2*PI()*(NOW()*24*60*60/A2-FLOOR(NOW()*24*60*60/A2,1))
=ROUND(7*SIN(A1),0)
=ROUND(5*SIN(A1+1*PI()/4),0)
=ROUND(7*SIN(A1+2*PI()/4),0)
=ROUND(5*SIN(A1+3*PI()/4),0)

এ 2 (পিরিয়ড) একটি সম্পূর্ণ 'বিপ্লব' এর জন্য সময় (সেকেন্ড) নির্ধারণ করে।

লাইনের প্রতিটি কক্ষটি সংশ্লিষ্ট লাইনের মান সম্পর্কিত একটি মৌলিক শর্তসাপেক্ষ। উদাহরণস্বরূপ, কে 2 হ'ল:

 =1*(A5=7)

এবং কেন্দ্রের ঘর (K9) হ'ল:

=1*OR(A5=0,A6=0,A7=0,A8=0)

অবিচ্ছিন্ন কক্ষে নিয়মিত একটি রিফ্রেশ ট্রিগার করতে 'মুছুন' ধরে ধরে অ্যানিমেশনটি জোর করে।

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


বাহ, এটি অবিশ্বাস্য যে আপনি এক্সেল দিয়ে এটি করতে পারেন: ডি
বিটা ডেকে

15

কেবল পিএসটিট্রিক্সের সাথে মজাদার জন্য।

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

\documentclass[preview,border=12pt,multi]{standalone}
\usepackage{pstricks}

\psset{unit=.3}

% static point
% #1 : half of the number of points
% #2 : ith point
\def\x[#1,#2]{(3*cos(Pi/#1*#2))}
\def\y[#1,#2]{(3*sin(Pi/#1*#2))}

% oscillated point
% #1 : half of the number of points
% #2 : ith point
% #3 : time parameter
\def\X[#1,#2]#3{(\x[#1,#2]*cos(#3+Pi/#1*#2))}
\def\Y[#1,#2]#3{(\y[#1,#2]*cos(#3+Pi/#1*#2))}

% single frame
% #1 : half of the number of points
% #2 : time parameter
\def\Frame#1#2{%
\begin{pspicture}(-3,-3)(3,3)
    \pstVerb{/I2P {AlgParser cvx exec} bind def}%
    \pscircle*{\dimexpr3\psunit+2pt\relax}
    \foreach \i in {1,...,#1}{\psline[linecolor=yellow](!\x[#1,\i] I2P \y[#1,\i] I2P)(!\x[#1,\i] I2P neg \y[#1,\i] I2P neg)}
    \foreach \i in {1,...,#1}{\pscircle*[linecolor=white](!\X[#1,\i]{#2} I2P \Y[#1,\i]{#2} I2P){2pt}}   
\end{pspicture}}

\begin{document}
\foreach \t in {0,...,24}
{   
    \preview
    \Frame{1}{2*Pi*\t/25} \quad \Frame{2}{2*Pi*\t/25} \quad \Frame{3}{2*Pi*\t/25} \quad \Frame{5}{2*Pi*\t/25} \quad \Frame{10}{2*Pi*\t/25}
    \endpreview
}
\end{document}

11

ফোরট্রান

ফোর্টরান জিআইফ মডিউলটি ব্যবহার করে প্রতিটি ফ্রেম পৃথক জিআইফ ফাইল হিসাবে তৈরি করা হয়: http://fortranwiki.org/fortran/show/writgif
তারপরে আমি পৃথক জিআইফগুলি এক অ্যানিমেটেড জিআইএফ-তে একীভূত করতে ইমেজম্যাগিক ব্যবহার করে কিছুটা ঠকাই।

ফোরট্রান

আপডেট: নতুন = সেট করুন। নিম্নলিখিত পেতে:

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

program circle_illusion

use, intrinsic :: iso_fortran_env, only: wp=>real64
use gif_util  !gif writing module from http://fortranwiki.org/fortran/show/writegif

implicit none

logical,parameter :: new = .false.

integer,parameter  :: n        = 500  !550  !size of image (square)     
real(wp),parameter :: rcircle  = n/2  !250  !radius of the big circle
integer,parameter  :: time_sep = 5    !deg

real(wp),parameter :: deg2rad = acos(-1.0_wp)/180.0_wp
integer,dimension(0:n,0:n):: pixel     ! pixel values
integer,dimension(3,0:3)  :: colormap  ! RGB 0:255 for colors 0:ncol    
real(wp),dimension(2)     :: xy
integer,dimension(2)      :: ixy
real(wp)                  :: r,t
integer                   :: i,j,k,row,col,m,n_cases,ang_sep
character(len=10)         :: istr

integer,parameter  :: black = 0
integer,parameter  :: white = 1
integer,parameter  :: red   = 2
integer,parameter  :: gray  = 3    
colormap(:,0) = [0,0,0]          !black
colormap(:,1) = [255,255,255]    !white
colormap(:,2) = [255,0,0]        !red
colormap(:,3) = [200,200,200]    !gray

if (new) then
    ang_sep = 5
    n_cases = 3
else
    ang_sep = 20
    n_cases = 0
end if

do k=0,355,time_sep

    !clear entire image:
    pixel = white      

    if (new) call draw_circle(n/2,n/2,black,n/2)  

    !draw polar grid:    
    do j=0,180-ang_sep,ang_sep
        do i=-n/2, n/2
            call spherical_to_cartesian(dble(i),dble(j)*deg2rad,xy)
            call convert(xy,row,col)
            if (new) then
                pixel(row,col) = gray
            else
                pixel(row,col) = black  
            end if  
        end do
    end do

    !draw dots:
    do m=0,n_cases
        do j=0,360-ang_sep,ang_sep
            r = sin(m*90.0_wp*deg2rad + (k + j)*deg2rad)*rcircle                
            t = dble(j)*deg2rad    
            call spherical_to_cartesian(r,t,xy)
            call convert(xy,row,col)
            if (new) then
                !call draw_circle(row,col,black,10)  !v2
                !call draw_circle(row,col,m,5)       !v2
                call draw_circle(row,col,white,10)   !v3
            else
                call draw_square(row,col,red)        !v1
            end if
        end do
    end do

    !write the gif file for this frame:        
    write(istr,'(I5.3)') k
    call writegif('gifs/test'//trim(adjustl(istr))//'.gif',pixel,colormap)

end do

!use imagemagick to make animated gif from all the frames:
! from: http://thanosk.net/content/create-animated-gif-linux
if (new) then
    call system('convert -delay 5 gifs/test*.gif -loop 0 animated.gif')
else
    call system('convert -delay 10 gifs/test*.gif -loop 0 animated.gif')
end if

!delete individual files:
call system('rm gifs/test*.gif')

contains

    subroutine draw_square(r,c,icolor)

    implicit none
    integer,intent(in) :: r,c  !row,col of center
    integer,intent(in) :: icolor

    integer,parameter :: d = 10 !square size

    pixel(max(0,r-d):min(n,r+d),max(0,c-d):min(n,c+d)) = icolor

    end subroutine draw_square

    subroutine draw_circle(r,c,icolor,d)

    implicit none
    integer,intent(in) :: r,c  !row,col of center
    integer,intent(in) :: icolor
    integer,intent(in) :: d  !diameter

    integer :: i,j

    do i=max(0,r-d),min(n,r+d)
        do j=max(0,c-d),min(n,c+d)
            if (sqrt(dble(i-r)**2 + dble(j-c)**2)<=d) &
                pixel(i,j) = icolor
        end do
    end do

    end subroutine draw_circle

    subroutine convert(xy,row,col)

    implicit none
    real(wp),dimension(2),intent(in) :: xy  !coordinates
    integer,intent(out) :: row,col

    row = int(-xy(2) + n/2.0_wp)
    col = int( xy(1) + n/2.0_wp)

    end subroutine convert

    subroutine spherical_to_cartesian(r,theta,xy)

    implicit none
    real(wp),intent(in) :: r,theta
    real(wp),dimension(2),intent(out) :: xy

    xy(1) = r * cos(theta)
    xy(2) = r * sin(theta)

    end subroutine spherical_to_cartesian

end program circle_illusion

1
আমি উলম্ব এবং অনুভূমিক উপাদানগুলির জন্য প্রভাব 'স্কোয়াশ' পছন্দ করি।
পোর্টল্যান্ড রানার

11

বাধ্যতামূলক সি 64 সংস্করণ।

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

সি 64 সংস্করণ

1 print chr$(147)
2 poke 53281,0
3 for p=0 to 7
5 x=int(11+(cos(p*0.78)*10)):y=int(12+(sin(p*0.78)*10))
6 poke 1024+x+(y*40),15
9 next p
10 for sp=2040 to 2047:poke sp,13:next sp
20 for i=0 to 62:read a:poke 832+i,a:next i
30 for i=0 to 7:poke 53287+i,i+1:next i
40 rem activate sprites
50 poke 53269,255
60 an=0.0
70 rem maincycle
75 teta=0.0:k=an
80 for i=0 to 7
90 px=cos(k)*64
92 s=i:x=px*cos(teta): y=px*sin(teta): x=x+100: y=y+137: gosub 210
94 teta=teta+0.392699
95 k=k+0.392699
96 next i
130 an=an+0.1
140 goto 70
150 end
200 rem setspritepos
210 poke 53248+s*2,int(x): poke 53249+s*2,int(y)
220 return
5000 data 0,254,0
5010 data 3,199,128
5020 data 7,0,64
5030 data 12,126,96
5040 data 25,255,48
5050 data 59,7,152
5060 data 52,1,200
5070 data 116,0,204
5080 data 120,0,100
5090 data 120,0,100
5100 data 120,0,100
5110 data 120,0,36
5120 data 104,0,36
5130 data 100,0,108
5140 data 54,0,72
5150 data 51,0,152
5160 data 25,131,16
5170 data 12,124,96
5180 data 4,0,64
5190 data 3,1,128
5200 data 0,254,0

10

একটি কমপ্যাক্ট জাভাস্ক্রিপ্ট সংস্করণ, ডিফল্ট সেটিংসকে আলাদা কিছুতে পরিবর্তন করে

http://jsfiddle.net/yZ3DP/1/

এইচটিএমএল:

<canvas id="c" width="400" height="400" />

javascript:

var v= document.getElementById('c');
var c= v.getContext('2d');
var w= v.width, w2= w/2;
var num= 28, M2= Math.PI*2, da= M2/num;
draw();
var bw= 10;
var time= 0;
function draw()
{
    v.width= w;
    c.beginPath();
    c.fillStyle= 'black';
    circle(w2,w2,w2);
    c.lineWidth= 1.5;
    c.strokeStyle= c.fillStyle= 'white';
    var a= 0;
    for (var i=0; i< num*2; i++){
        c.moveTo(w2,w2);
        c.lineTo(w2+Math.cos(a)*w2, w2+Math.sin(a)*w2);
        a+= da/2;
    }
    c.stroke();
    a= 0;
    for (var i=0; i< num; i++){
        circle(w2+Math.cos(a)*Math.sin(time+i*Math.PI/num)*(w2-bw), 
               w2+Math.sin(a)*Math.sin(time+i*Math.PI/num)*(w2-bw), bw);
        a+= da/2;
    }
    time+=0.03;
   requestAnimationFrame(draw);
}

function circle(x,y,r)
{
    c.beginPath();
    c.arc(x, y, r, 0, M2);
    c.fill();

}

2
তুমি বানিয়েছ ... একটি ডোনাট ?? প্রকৃতপক্ষে আপনার অ্যানিমেশনটি ছোট বিন্দুগুলির সাথে দুর্দান্ত দেখাচ্ছে (চেষ্টা করুন bw=10) আপনার কোডটি দেখানোর জন্য আপনার উত্তরটি সম্পাদনা করুন। ওহ, এবং আপনি যখন এটির উপরে রয়েছেন তখন আপনার একটি বাগ অবশ্যই ঠিক করা উচিত: ট্রিগার গণনায় এটির time+i*0.39*0.29সাথে প্রতিস্থাপন করুন time+i*Math.PI/numযাতে স্থানাঙ্কগুলি কোনও মানের জন্য সঠিকভাবে গণনা করা হয় num। (দ্রষ্টব্য JSFiddle এখানে আপডেট করা হয়েছে এবং স্বাগত codegolf.stackexchange.com করতে।)
খুঁতখুঁতে ossifrage

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

1
+1 সামান্য ভিজ্যুয়াল মজাদার জন্য ছোট পরিবর্তন: http://jsfiddle.net/9TQrm/ বা http://jsfiddle.net/Wrqs4/1/
পোর্টল্যান্ড রানার

4

আমার সাথে এলম । আমি একটি সম্পূর্ণ শিক্ষানবিস যারা এই সমাধানটির উন্নতি করতে ( গিটহাব ) আনন্দের সাথে PR গুলি গ্রহণ করবেন :

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

নোট করুন যে এই জমাটি সত্যই সরল রেখাগুলিতে পয়েন্ট করছে:

import Color exposing (..)
import Graphics.Collage exposing (..)
import Graphics.Element exposing (..)
import Time exposing (..)
import Window
import List exposing (..)
import AnimationFrame -- "jwmerrill/elm-animation-frame"
import Debug

-- CONFIG

size = 600
circleSize = 240
dotCount = 12
dotSize = 10
velocity = 0.01

-- MODEL

type alias Dot =
    { x : Float
    , angle : Float
    }

type alias State = List Dot

createDots : State
createDots = map createDot [ 0 .. dotCount - 1 ]

createDot : Int -> Dot
createDot index =
    let angle = toFloat index * pi / dotCount
    in { x = 0
       , angle = angle
       }

-- UPDATE

update : Time -> State -> State
update time dots = map (moveDot time) dots |> Debug.watch "Dots"

moveDot : Time -> Dot -> Dot
moveDot time dot =
  let t = velocity * time / pi
      newX = (-circleSize + dotSize) * cos(t + dot.angle)
  in { dot | x <- newX }

-- VIEW

view : State -> Element
view dots =
   let background = filled black (circle circleSize)
       dotLinePairs = map viewDotWithLine dots
   in collage size size (background :: dotLinePairs)

viewDotWithLine : Dot -> Form
viewDotWithLine dot =
  let dotView = viewDot dot
      lineView = createLineView
  in group [dotView , lineView] |> rotate dot.angle

viewDot : Dot -> Form
viewDot d = alpha 0.8 (filled lightOrange (circle dotSize)) |> move (d.x, 0)

createLineView : Form
createLineView = traced (solid white) (path [ (-size / 2.0, 0) , (size / 2.0, 0) ])

-- SIGNALS

main = Signal.map view (animate createDots)

animate : State -> Signal State
animate dots = Signal.foldp update dots time

time = Signal.foldp (+) 0 AnimationFrame.frame

4
এই কার্সারটি আমাকে ভাল বোকা বানিয়েছে এবং আমার এমনকি কালো বা আকারও নয়।
কোলে

2

সেকেন্ড লাইফ এলএসএল

অ্যানিমেশন টার্টাল আলফা চিত্রের সূচনা (চিত্র সংরক্ষণের জন্য নীচে ডান ক্লিক করুন)
turtle.png
টার্টাল আলফা চিত্রের শেষ (চিত্র সংরক্ষণের জন্য উপরে ডান ক্লিক করুন)

অবজেক্টটি তৈরি করুন:
একটি রুট প্রিম সিলিন্ডার আকার তৈরি করুন <1, 1, 0.01> টুকরো 0.49, 0.51, রঙ < 0, 0, 0>
এই সিলিন্ডারের বিবরণ "8,1,1,1" কোট ছাড়াই করুন (খুব গুরুত্বপূর্ণ)
একটি সিলিন্ডার তৈরি করুন, এটির নাম "সিল", রঙ <0.25, 0.25, 0.25> আলফা 0.5
নকল করুন সিল 48 বার
একটি বাক্স তৈরি করুন, এটির নাম "গোলক" করুন, রঙ <1, 1, 1> স্বচ্ছতা 100 শীর্ষ স্বচ্ছতা ব্যতীত 100
আপনার কচ্ছপের টেক্সচারটি বক্সের মুখের উপরে রাখুন, টার্টল
48 বাক্সে + x নকল করতে হবে
সমস্ত বাক্স এবং সিলিন্ডার নির্বাচন করুন, রুট সিলিন্ডারটি শেষটি নির্বাচন করতে ভুলবেন না,লিঙ্ক (নিয়ন্ত্রণ এল)

এই 2 টি স্ক্রিপ্টগুলি মূলে রাখুন:

//script named "dialog"
default
{
    state_entry()
    {

    }

    link_message(integer link, integer num, string msg, key id)
    {
        list msgs = llCSV2List(msg);
        key agent = (key)llList2String(msgs, 0);
        string prompt = llList2String(msgs, 1);
        integer chan = (integer)llList2String(msgs, 2);
        msgs = llDeleteSubList(msgs, 0, 2);
        llDialog(agent, prompt, msgs, chan);
    }
}

//script named "radial animation"
float interval = 0.1;
float originalsize = 1.0;
float rate = 5;
integer maxpoints = 48;
integer points = 23; //1 to 48
integer multiplier = 15;
integer lines;
string url = "https://codegolf.stackexchange.com/questions/34887/make-a-circle-illusion-animation/34891";

list cylinders;
list spheres;
float angle;
integer running;
integer chan;
integer lh;

desc(integer on)
{
    if(on)
    {
        string desc = 
            (string)points + "," +
            (string)multiplier + "," +
            (string)running + "," +
            (string)lines
            ;

        llSetLinkPrimitiveParamsFast(1, [PRIM_DESC, desc]);
    }
    else
    {
        list params = llCSV2List(llList2String(llGetLinkPrimitiveParams(1, [PRIM_DESC]), 0));
        points = (integer)llList2String(params, 0);
        multiplier = (integer)llList2String(params, 1);
        running = (integer)llList2String(params, 2);
        lines = (integer)llList2String(params, 3);
    }    
}

init()
{
    llSetLinkPrimitiveParamsFast(LINK_ALL_OTHERS, [PRIM_POS_LOCAL, ZERO_VECTOR, 
        PRIM_COLOR, ALL_SIDES, <1, 1, 1>, 0]);
    integer num = llGetNumberOfPrims();
    integer i;
    for(i = 2; i <= num; i++)
    {
        string name = llGetLinkName(i);

        if(name == "cyl")
            cylinders += [i];
        else if(name == "sphere")
            spheres += [i];
    }  

    vector size = llGetScale();
    float scale = size.x/originalsize;

    float r = size.x/4;
    vector cylindersize = <0.01*scale, 0.01*scale, r*4>;
    float arc = 180.0/points;

    for(i = 0; i < points; i++)
    {
        float angle = i*arc;
        rotation rot = llEuler2Rot(<0, 90, 0>*DEG_TO_RAD)*llEuler2Rot(<0, 0, angle>*DEG_TO_RAD);

        integer cyl = llList2Integer(cylinders, i);
        integer sphere = llList2Integer(spheres, i);

        llSetLinkPrimitiveParamsFast(1, [PRIM_LINK_TARGET, cyl, PRIM_POS_LOCAL, ZERO_VECTOR, PRIM_ROT_LOCAL, rot, PRIM_SIZE, cylindersize, PRIM_COLOR, ALL_SIDES, <0.25, 0.25, 0.25>, 0.5*lines,
        PRIM_LINK_TARGET, sphere, PRIM_COLOR, ALL_SIDES, <0.25 + llFrand(0.75), 0.25 + llFrand(0.75), 0.25 + llFrand(0.75)>, 1
        ]);
    }
}

run()
{
    vector size = llGetScale();
    float scale = size.x/originalsize;

    float r = size.x/2;
    vector spheresize = <0.06, 0.06, 0.02>*scale;
    float arc = 180.0/points;
    list params;
    integer i;
    for(i = 0; i < points; i++)
    {

        float x = r*llCos((angle + i*arc*multiplier)*DEG_TO_RAD);

        vector pos = <x, 0, 0>*llEuler2Rot(<0, 0, i*arc>*DEG_TO_RAD);
        rotation rot = llEuler2Rot(<0, 0, i*arc>*DEG_TO_RAD);
        integer link = llList2Integer(spheres, i);
        params += [PRIM_LINK_TARGET, link, PRIM_POS_LOCAL, pos,  
            PRIM_ROT_LOCAL, rot,
            PRIM_SIZE, spheresize
            //PRIM_COLOR, ALL_SIDES, <1, 1, 1>, 1
            ];
    }   

    llSetLinkPrimitiveParamsFast(1, params);
}

dialog(key id)
{
    string runningstring;
    if(running)
        runningstring = "notrunning";
    else
        runningstring = "running";

    string linesstring;
    if(lines)
        linesstring = "nolines";
    else
        linesstring = "lines";
    string prompt = "\npoints: " + (string)points + "\nmultiplier: " + (string)multiplier;
    string buttons = runningstring + ",points+,points-,reset,multiplier+,multiplier-," + linesstring + ",www";
    llMessageLinked(1, 0, (string)id + "," + prompt + "," + (string)chan + "," + buttons, "");
    //llDialog(id, prompt, llCSV2List(buttons), chan);
}

default
{
    state_entry()
    {
        chan = (integer)("0x" + llGetSubString((string)llGetKey(), -8, -1));
        lh = llListen(chan, "", "", "");

        desc(FALSE);
        init();
        run();
        llSetTimerEvent(interval);
    }

    on_rez(integer param)
    {
        llListenRemove(lh);
        chan = (integer)("0x" + llGetSubString((string)llGetKey(), -8, -1));
        lh = llListen(chan, "", "", "");
    }

    touch_start(integer total_number)
    {
        key id = llDetectedKey(0);
        dialog(id);
    }

    timer()
    {
        if(!running)
            return;

        angle += rate;
        if(angle > 360)
            angle -= 360;
        else if(angle < 0)
            angle += 360;

        run();
    }

    listen(integer channel, string name, key id, string msg)
    {
        if(msg == "points+")
        {
            if(points < maxpoints)
            {
                points++;
                desc(TRUE);
                llResetScript();            
            }
        }
        else if(msg == "points-")
        {
            if(points > 0)
            {
                points--;
                desc(TRUE);
                llResetScript();
            }
        }        
        else if(msg == "multiplier+")
        {
            multiplier++;
            desc(TRUE);
        }
        else if(msg == "multiplier-")
        {
            multiplier--;
            desc(TRUE);
        }
        else if(msg == "running")
        {
            running = TRUE;
            desc(TRUE);
        }
        else if(msg == "notrunning")
        {
            running = FALSE;
            desc(TRUE);
        }
        else if(msg == "lines")
        {
            lines = TRUE;
            desc(TRUE);
            llResetScript();
        }
        else if(msg == "nolines")
        {
            lines = FALSE;
            desc(TRUE);
            llResetScript();
        }
        else if(msg == "reset")
            llResetScript();
        else if(msg == "www")
            llRegionSayTo(id, 0, url);
        dialog(id);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.