示例#1
0
 public Mandelbrot_Julia(Mandelbrot_Julia mj)
 {
     IPos       = mj.IPos;
     JPos       = mj.JPos;
     XPos       = mj.XPos;
     YPos       = mj.YPos;
     Radius     = mj.Radius;
     Repert     = mj.Repert;
     Resolution = mj.Resolution;
     Data       = mj.Data;
 }
示例#2
0
        //http://qwerty2501.hatenablog.com/entry/2014/04/24/235849 async/await ~非同期なライブラリは楽じゃない~
        //http://mcommit.hatenadiary.com/entry/2016/07/22/014657 C# Task async, await の使い方
        //http://ufcpp.net/study/csharp/misc_task.html [雑記] スレッド プールとタスク
        //http://outside6.wp.xdomain.jp/2016/08/06/post-343/ Task.Waitはスレッドをロックする Task.Waitの問題点
        //http://outside6.wp.xdomain.jp/2016/08/09/post-568/ TaskとawaitのデッドロックをTaskで回避する
        //http://qiita.com/acple@github/items/8f63aacb13de9954c5da Taskを極めろ!async/await完全攻略

        public static Task <short[]> JuliaMap(double xpos, double ypos, double radius, short repert, int resolution, int split)
        {
            return(Task.Run <short[]>(() => {
                int size = resolution / split;
                resolution = size * split;

                short[] data = new short[resolution * resolution];

                double julia = radius * 2 / (split - 1);

                List <Task <short[]> > tasks = new List <Task <short[]> >();

                for (int j = 0; j < split; ++j)
                {
                    for (int i = 0; i < split; ++i)
                    {
                        tasks.Add(Mandelbrot_Julia.Julia(-radius + julia * i, radius - julia * j, 0, 0, 2, repert, size));
                    }
                }

                Task.WaitAll(tasks.ToArray());

                for (int j = 0; j < split; ++j)
                {
                    for (int i = 0; i < split; ++i)
                    {
                        for (int y = 0; y < size; ++y)
                        {
                            for (int x = 0; x < size; ++x)
                            {
                                data[j * size * resolution + i * size + y * resolution + x] = tasks[j * split + i].Result[y * size + x];
                            }
                        }
                    }
                }

                return data;
            }));
        }