「Androidは電気羊の夢を見るか」を読みたい管理者のブログ

仕事などでの色々な発見を記事にしてます。不定期更新。

割と簡単にマンデルブロ集合が描けてしまった

フラクタル幾何学(上) (ちくま学芸文庫)

フラクタル幾何学(上) (ちくま学芸文庫)

フラクタル幾何学(下) (ちくま学芸文庫)

フラクタル幾何学(下) (ちくま学芸文庫)

「読まなくてもいい本」の読書案内:知の最前線を5日間で探検する (単行本)

「読まなくてもいい本」の読書案内:知の最前線を5日間で探検する (単行本)

f:id:bignight:20160427203133p:plain

理系の人間には割と常識なのかもしれないけど
この複雑な図がたったの2行の数式で描けるんだよ
C#だけどユーザコントロールとかフォームとか使わないver

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Drawing;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;

namespace opentktest
{
    static class Program
    {
        //表示領域の縦幅
        static readonly double _Height = 4.0;
        //注視点
        static readonly Vector2 _CentralPoint = Vector2.Zero;
        //まんでるぶろ集合描画時の色リスト
        static readonly List<Color> _ColorList = new List<Color>();

        static void InitializeColorList()
        {
            _ColorList.Add(Color.Black);
            for (int i = 1; i <= 16; ++i)
            {
                int x = 31 + 14 * i;
                _ColorList.Add(Color.FromArgb(x, x, x));
            }
        }

        static void SetProjection(int width,int height)
        {
            // ビューポートの設定
            GL.Viewport(0, 0, width, height);

            // 変換行列の初期化
            GL.LoadIdentity();

            // 描画領域の設定
            double sideY = _Height * 0.5;
            double sideX = sideY;
            GL.Ortho(_CentralPoint.X - sideX, _CentralPoint.X + sideX, _CentralPoint.Y - sideY, _CentralPoint.Y + sideY, -1.0, 1.0);
        }
        static void DrawMandelbrot(double xMin, double xMax, double yMin, double yMax, int screenWidth, int screenHeight)
        {
            double xDiff = xMax - xMin, yDiff = yMax - yMin;
            ++screenWidth; ++screenHeight;
            GL.Begin(BeginMode.Points);
            for (int i = 0; i < screenWidth; ++i)
            {
                double x = xMin + xDiff * (double)i / (double)screenWidth;
                for (int j = 0; j < screenHeight; ++j)
                {
                    double y = yMin + yDiff * (double)j / (double)screenHeight;
                    GL.Color3(_ColorList[Mandelbrot(x, y, 16)]);
                    GL.Vertex2(x, y);
                }
            }
            GL.End();
        }
        static int Mandelbrot(double re, double im)
        {
            return Mandelbrot(re, im, 16);
        }
        static int Mandelbrot(double re, double im, int nMax)
        {
            double x = 0.0, y = 0.0, x1, y1;
            for (int n = 0; n < nMax; ++n)
            {
                x1 = x * x - y * y + re;
                y1 = 2.0 * x * y + im;
                if (x1 * x1 + y1 * y1 > 4.0) { return n + 1; }
                x = x1; y = y1;
            }
            return 0;
        }

        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {


            InitializeColorList();
            

            using(var game = new GameWindow())
            {

                game.Load+=(sender,e)=>
                    {
                        
                        game.VSync = VSyncMode.On;
                        GL.ClearColor(Color4.Red);
                        SetProjection(game.Width, game.Height);
                    };
                game.Resize += (sender, e)=>
                    {
                        SetProjection(game.Width, game.Height);
                        //GL.Viewport(0,0,game.Width,game.Height);
                    };
                game.UpdateFrame+=(sender,e)=>
                    {
                        if(game.Keyboard[Key.Escape])
                        {
                            game.Exit();
                        }
                    };
                game.RenderFrame += (sender, e) =>
                    {
                        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

                        GL.PointSize(1.0f);
                        double sideY = _Height * 0.5;
                        double sideX = sideY;
                        DrawMandelbrot(_CentralPoint.X - sideX, _CentralPoint.X + sideX, _CentralPoint.Y - sideY, _CentralPoint.Y + sideY, game.Width, game.Height);

                        game.SwapBuffers();
                    };

                game.Run(60.0);
            }

        }
    }
}

via:
[C#][OpenTK] マンデルブロ集合の描画 - クソネミ( ˘ω˘ )
Chapter 0: Learn OpenTK in 15' | OpenTK

誰にも言えなかったこと

熊本で地震があったなんて全然現実感がない
避難生活を送ってる人がいるなんて全然実感がわかない
どうしてだろうどうしてだ
まるで熊本も平穏な日常を送ってる世界から異世界に転生したみたいだ
どこかに熊本も平穏な日常を送ってる世界があるんだ
千羽鶴の一件まで全然実感がわかなかった
千羽鶴の一件で突然実感が襲ってきた
千羽鶴はだからそれはそれでよかったんじゃないか

なんだかぼくら落ち着くところに落ち着いてしまったな

fujipon.hatenablog.com

 ちょっとイヤなことがあると「閉鎖します」と宣言して、閉鎖・移転を繰り返すサイトが少なからずあったし、それに対して、取り巻きたちが「閉鎖なんて悲しいです!」とコメント欄に書き込む。
 そのコール&レスポンスには、様式美のようなものがあった。
 4月1日のネタとして、「閉鎖します」をやる人がいなくなってから、もう何年経つのだろうか。
 サイトやブログにとっての「閉鎖」というのはプチ自殺みたいなもので、自分の葬式に参列できないことの代用なのかもしれない。
 しかし、いまや、インターネットでも「閉鎖芸」みたいなものの居場所はなくなってしまった。

僕それ知ってる
twitter

twitterでしょっちゅう垢消しやってる人がいてtwittterって垢消しても1ヶ月いないなら復活できるからぼくも経験あるから知ってるんだけど
twitterでしょっちゅう垢消しやってるけどtwitterからは出てかないの
なんだかんだいって居心地がいいんだろうなぁ
クライアントにミュート機能があって読みたくない人は自分の投稿を読まないで済ませられる
それがなんというか気楽(と同時にぼくがtwitterから離れつつある原因だ)

TwitterとかSNSが台頭する前は掲示板とかチャットとか過疎ってる個人サイト持つとか、そういう場所に発散するしかなかった
誰もが読む可能性のある場所と言い換えてもいい
twitterの登場でぼくが何を感じたかというと「ようやく楽に息ができるぞ」
twitterが登場する前はなんだかネット全体が息苦しかった感あるよなぁ
「嫌なら読むな」
「読まれる場所に書くな」
というお互いにいがみ合う緊張感みたいなものがあった
その典型が「半年ロムれ」だろう

だから
昔は必死で居場所を探してたのに今じゃ落ち着くところに落ち着いてしまったな感がある
Noteで自殺すると書いた記事が盛り上がってたの知らなかったもん
へーそんなことがあったんだ
どうりで最近自殺エントリが多かったわけだ(深追いする気はない)

ヒトデさえ重い荷物抱えているのね

なんだか生きるのが楽になったきがする

ふがいない僕は空を見た (新潮文庫)

ふがいない僕は空を見た (新潮文庫)

風に舞いあがるビニールシート (文春文庫)

風に舞いあがるビニールシート (文春文庫)

__FILE__が絶対パスになるのをどうにかしたい

久しぶりに技術ネタです
ずっとC#いじってたからC言語
「不便!」
C#だと一発で出来ることが小細工をしないとできなかったりするんですよ。
たとえば文字列の操作。
開発環境によって独自に文字列型定義しちゃったりしてるからそのままだと標準ライブラリ呼べないし
でもそれでもchar*なんかより全然便利だったりして。
フルパスからファイル名だけ抜き出したいときどうするの?
調べたら標準ライブラリですごいかんたんに実装できる。

#define FILE (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)

これだけ

えっ?


このstrchr関数、調べてみると

文字列 s において文字 c が最後に見つかった位置をポインタで返却します。 見つからなかったときにはNULLを返却します。
文字列終了コードの'\0'も文字列の一部と見なします。つまり、strrchr(s, 0); も可能です。
strrchr

だそうです。

せっかくなので実装してみる
ちなみにうちの環境じゃフォルダの区切り文字は\\だった

#include
#include
#define FILE (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)

int main() {
char* dirpath;

dirpath = FILE;
printf("%s",dirpath);
return 0;
}

そんな感じ!

via:
http://d.hatena.ne.jp/shouh/20131105/1383653323
d.hatena.ne.jp