回転するリサージュ図のアニメーション化


15

このチャレンジのエントリには、アニメーションの回転するリサージュ図が表示されます。xパラメータが各フレームで連続的に位相シフトされると、3D回転が発生します。

入力:

a及びb(パーなどのパラメータWikipediaの記事)コマンドラインで指定された、または標準入力から読み取られます。

出力:

これはであるため、出力はターミナルエミュレータウィンドウまたは同等のものに表示されます。出力サイズはハードコーディングされている場合がありますが、リサージュの数字は少なくとも80x24のウィンドウを満たすのに十分な大きさでなければなりません。

アニメーションのフレームレートは約50 fpsです。各フレーム間の20msのスリープは、各フレームを計算する時間が固定スリープ時間と比較して短い限り、問題ありません。選択したプラットフォームで言語の選択が十分に速く計算できない場合は、動的にスリープする時間を計算する必要があります。

各フレームは、そのフレームのすべての計算が完了するまで表示されません。各フレーム間で画面をクリアする必要はありません。

図は、2*Pi約4秒ごとに完全に回転します。

フレームごとに、完全な閉曲線を生成する必要があります。曲線に沿って少なくとも1000ポイントを計算する必要があります。ポイント間の線描画は必要ありません。

カーブのポイントは、としてプロットされる#文字。表示領域の残りの部分は空白/空白になります。

これはであるため、この投稿の1週間後に、バイト単位の最短回答(私が受け入れられるとみなす)が受け入れられた勝者になります。


非ゴルフ参照回答


1
グラフィックス指向言語を使用して描画することは許可されますか?
TheDoctor 14

@TheDoctor私はそれに引き裂かれましたが、ascii-artに制限することにしました。おそらくこれが一般的になった場合、グラフィカル出力のフォローアップを行うことができます。
デジタル外傷14

1
多くの回転図形と同様に、これらの図形は、それらをどのように見るかに応じて異なる方法で回転します。たとえば、あなたの答えは私に行き来しています。しかし、一生懸命やると、定期的な回転が見られます。
ジャスティン14

回答:


7

Perl-177

while($d+=.1){print"\e[H\e[2J";$a=0;while(($a+=.01)<4*atan2 1,0){$x=$==40+40*cos$d+$a*$ARGV[0];$y=$==13+13*sin$d+$a*$ARGV[1];print"\e[$y;$x"."H#";}print$/;select($v,$v,$v,.03);}

係数は引数を介して渡されます。上記のgifはから生成されますperl % 2 3


1
@DigitalTrauma私はX11の画面を記録するための私の非常に独自のツールを持っている
mniip

7

C(参照回答-ゴルフではない)

出力./lissajous 2 3

ここに画像の説明を入力してください

/*
 * lissajous.c
 *
 * Compile with:
 *   cc lissajous.c -lm -o lissajous
 *
 * Usage:
 *   ./lissajous a b
 *
 * a and b are the parameters as described in:
 * http://en.wikipedia.org/wiki/Lissajous_curve
 */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <unistd.h>

int main (int argc, char **argv) {
    char buffer[25][80];
    double t, p;
    int x, y;
    int a, b;

    if (argc != 3) return 1;

    a = atoi(argv[1]);
    b = atoi(argv[2]);

    for (;;) {
        for (p = 0; p < 2 * M_PI; p += M_PI / 100) {
            memset(buffer, ' ', sizeof(buffer));
            /* Set 1st char of final line to nul.  Then we can printf
             * the whole 2d array as if it were one long 1d buffer.
             * Line wraps at 80 chars are assumed */
            buffer[24][0] = 0;
            for (t = 0; t < 2 * M_PI; t += M_PI / 500) {
                x = 39.5 * (1 + sin(a * t + p));
                y = 11.5 * (1 + sin(b * t)); 
                buffer[y][x] = '#';
            }
            printf("%s\n", &buffer[0][0]);
            usleep(20000);
        }
    }
    return (0);
}

C、257バイト

わかりました、まあ、私は自分で少しゴルフをすることに抵抗できませんでした。しかし、これにはもっと多くのゴルフが必要だと思います。

#include<math.h>
main(int a,char**v){char x,y,b,d[25][80];double t,p,q=2*M_PI;a=atoi(v[1]);b=atoi(v[2]);for(p=0;memset(d,32,2000);p+=q/100){p=p<q?p:0;d[24][0]=0;for(t=0;t<q;y=11.5*sin(b*t)+12,d[y][x]=35,t+=q/1e3)x=39.5*sin(a*t+p)+40;puts(d);usleep(20000);}}

2
面白いはどのように参照答えは... upvotesを取得している
TheDoctor

@TheDoctor知ってますよね。それが、私がゴルフバージョンを追加することになった理由です。それは、無回答の回答に対して賛成票を得るのが適切ではないと感じたためです。
デジタル外傷14

あなたがいる場合はusleep20000msのためにINGのは、なぜだけでなく、sleep20代のために?
user12205 14

@ace usleep(20000)== 20000 マイクロ秒、20000 ミリ秒ではない
デジタル外傷14

申し訳ありませんが、申し訳ありません。どうusleep(2e4);
user12205 14

2

Python 3-280

これらの派手なアニメーションGIFは持っていません。ごめんなさい。Windowsコンソールの印刷が遅い:P

これが50fpsの要件を満たしているかどうかはわかりませんが、Pythonで本当に可能かどうかはわかりません。計算するポイントの量について、2行目の1000を調整できます(リストは、出力幅、出力高さ、検索するポイント、フレームごとの進行(pi * 2 / n)および開始ポイントです)。または、それらを削除して、入力で指定することもできます。

import math as m
a,b,w,h,p,r,t=list(map(int,input().split()))+[79,24,1000,100,0]
while 1:v,z=w/2,h/2;d=[[int(m.sin(a*k+t)*v+v),int(m.sin(b*k)*z+z)]for k in[m.pi*2/p*l for l in range(p)]];print('\n'.join(''.join([' ','#'][[i,j]in d]for i in range(w))for j in range(h)));t+=m.pi*2/r

より重要な編集:標準入力、スペース区切り、改行で入力。入力を待ちます。

編集:スクリーンショット。これの高さを40に変更しました。

リサージュレンダリング


うーん、Ubuntuでpython 3.2.3(および2.7.3)を使用するとハングします。どこかからWindows VMを掘り起こす必要があると思います。または、Pythonを学びます。
デジタル外傷14

@DigitalTrauma Hm。3.3.2を実行しています。奇妙なことに、それは機能しません。私のコードにはプラットフォーム固有の手順はありません。
cjfaure 14

名前を付けて保存してlissajous.pyから、実行python3 lissajous.py 2 3で十分でしょうか?
デジタル外傷14

@DigitalTraumaああ、ああ、ごめんなさい。stdinargsではなくからの入力を受け取ります(...... oopsの指定に失敗しました)。スペース区切り。
cjfaure 14

ああ-私はそれを見input()て推測したはずだと思います。3.2.3で今はうまく動作します。+1
デジタル外傷14

1

C#-360 352(クロスプラットフォーム-332 for Windowsのみ)

マイクロゴルフと丸めのバグ修正+ Ypnypnによる提案の後に編集

ちょうどその長さの競争相手ではありません-そしてそれは参照のほとんど逐語的なコピーです-しかしまあまあ。:)

namespace System{class P{static int Main(string[]m){double p=Math.PI*2,a=int.Parse(m[0]),b=int.Parse(m[1]),q,t;for(;;)for(q=0;q<p;q+=p/200){var s=new string(' ',1920).ToCharArray();for(t=0;t<p;t+=p/1000)s[(int)(39.5*Math.Sin(a*t+q)+40)+(int)(11.5*Math.Sin(b*t)+12)*80]='#';Console.SetCursorPosition(0,0);Console.Write(s);Threading.Thread.Sleep(20);}}}}

メモリを独り占めし、更新ごとに新しい配列を作成します-もともとStringBuilderを(再)使用していましたが、短さのために犠牲にしました。ただし、古いCore2では、少なくとも更新に1ミリ秒未満しかかかりません。

いくつかの(今では長さが痛い)古いゴルフを削除して8文字減らした後、int解析ではなくdoubleに戻し、1920年ではなく80 * 24に戻すことで「詩的な」360に戻そうとしました。しかし、それはまだ359にすぎません-そして、私が考えることができる他の単一文字の追加はコードに値を追加しません。したがって、352だけを使います。:-)

展開(ゴルフ前のコードを紛失):

namespace System
{
    class P
    {
        static int Main(string[] m)
        {
            double p = Math.PI * 2,
                   a = int.Parse(m[0]),
                   b = int.Parse(m[1]),
                   q, t;

            for (;;)
            {
                for (q = 0; q < p; q += p/200)
                {
                    var s = new string(' ', 1920).ToCharArray();
                    // Alternative - Windows console only:
                    // var s = new char[1920];

                    for (t = 0; t < p; t += p/1000)
                    {
                        s[
                            (int) (39.5*Math.Sin(a * t + q) + 40)
                          + (int) (11.5*Math.Sin(b * t) + 12) * 80
                        ] = '#';
                    }
                    Console.SetCursorPosition(0, 0);
                    Console.Write(s);
                    Threading.Thread.Sleep(20);
                }
            }
        }
    }
}

Windowsコンソールは、実際には多くのnull文字の出力を受け入れます。その結果、実際のスペース文字を使用した場合と(グラフィック上)同一の出力が得られます。

派手なアニメーションはありません、申し訳ありません:-)


Windowsコンソールは、実際には多くのnull文字の出力を受け入れます。ああ、それがUbuntuのモノではあまりうまくいかない理由をおそらく説明しています。私は今のところ便利なwindows / .netを持っていないので、それが機能することをあなたの言葉で伝えます。
デジタル外傷

スクリーンショットを追加しました-クロスプラットフォームにする必要がありますが、すでに競合していないステータスを考慮してください-かなり「詩的な」キャラクターの数は、そのままにしておくべきでしょう。:-)
JimmiTh 14

すべての回答がクロスプラットフォームIMOである必要はありません。回答がプラットフォーム固有の場合、プラットフォームについて言及するのは良いことですが、C#は非常によく知られているため、すでに明らかです。
デジタル外傷14

using C = Console本当に任意の文字を保存しますか?
Ypnypn 14年

@Ypnypn-System名前空間に侵入した後ではありません。自明の目標は、「適切な」char配列初期化を使用しながら同じ360文字に到達することだったため、変更も検索もしませんでした。ありがとう。:-)
JimmiTh 14年

1

Python 2.7-214

私はこれをもう一度見ていこうと思います。これをさらに引き下げることができると感じていますが、Perlのバイトカウントに達するのは難しいでしょう。ここでの数学は私の最大の制限のようです。

警告:使用している端末がクラッシュする可能性があります。これをWindowsコマンドプロンプトでテストしましたlissajous.py 2 3。コマンドプロンプトにすばやく書き込むため、フレームが少しジャンプすることを期待してください。これはsrange(s)とでより大きい値を使用することにより、(速度を犠牲にして)ほとんど解決できますt=2*pi*i

私はWindows上でそれを実行しているので、意図的に使用しない\rか、\bここでは余分な文字がかかります。

from math import*;import sys;a,b=sys.argv[1:];p=s=1920
while p:
 c = [" "]*s
 for i in range(s):
    t=2*pi*i/s;c[int(round((39.5*(1+sin(eval(a)*t+p))))+round(11.5*(1+sin(eval(b)*t)))*80)]="#"
 print ''.join(c)
 p+=.1

Ubuntuの上で1つの作品、出力はビットびくびくですが
デジタルトラウマ

@DigitalTraumaうん、これはクロスプラットフォームソリューション(つまり、Windowsコマンドプロンプトで動作する)が原因です。
grovesNL 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.