Пример #1
0
        private int frames; // на сколько кадров вперед идет расчет

        // компонента отвечающая за расчет погоды
        public List <WeatherCadr> GetWeatherFromBegin(IUserID user, string map, string weather)
        {
            frames = 50; // порция кадров

            // дай мне графику(набор кадров вперед) для этой карты для этой погоды в это время
            // считается что можно указывать файлик погоды. типа например есть карта россии
            // для нее есть погода в январе, в феврале .... и соответственно файлики называются. загружаем и смотрим

            List <Graphics> workFrames = new List <Graphics>();

            // этот буффер и отдадим

            // загрузим данные
            FileManagement.FileManager fm = Fabric.GetFileManager();


            string[] mapBuffer     = fm.GetThisFile(user, map);     // буффер карты
            string[] weatherBuffer = fm.GetThisFile(user, weather); // буффер погоды
            //
            // прочитаем заполним структуры в  WeatherCalculator
            WeatherCalculator wcalc = new WeatherCalculator();

            wcalc.setTime = 0;

            // прочитаем карту сначала

            string[] lines = mapBuffer[0].Split(default(string[]), StringSplitOptions.RemoveEmptyEntries);
            wcalc.SetRect(Convert.ToDouble(lines[0]), Convert.ToDouble(lines[1]));
            // установили размеры карты


            for (int i = 1; i < mapBuffer.Length; i++)
            {
                string[] lines1 = mapBuffer[i].Split(default(string[]), StringSplitOptions.RemoveEmptyEntries);

                double X     = Convert.ToDouble(lines1[0]);
                double Y     = Convert.ToDouble(lines1[1]);
                double R     = Convert.ToDouble(lines1[2]);
                double VALUE = Convert.ToDouble(lines1[3]);
                double COND  = Convert.ToDouble(lines1[4]);

                Land tmp = new Land(X, Y, R, VALUE, COND);

                wcalc.AddLand(tmp);
            }

            // теперь прочитаем файл погоды.
            // добавим циклоны
            int pos = 0;

            for (int i = 1; i < weatherBuffer.Length; i++)
            {
                string[] lines1 = weatherBuffer[i].Split(default(string[]), StringSplitOptions.RemoveEmptyEntries);

                if (lines1.Length != 0) // это условие отбросит строчки после пустой(траектории там для циклонов, если это погода)
                {
                    double X     = Convert.ToDouble(lines1[0]);
                    double Y     = Convert.ToDouble(lines1[1]);
                    double R     = Convert.ToDouble(lines1[2]);
                    double VALUE = Convert.ToDouble(lines1[3]);
                    double COND  = Convert.ToDouble(lines1[4]);

                    Cyclone tmp = new Cyclone(X, Y, R, VALUE, COND);

                    wcalc.AddWeather(tmp);
                }
                else
                {
                    pos = i; break;
                }
            }
            // к циклонам добавим траектории пути

            if (pos != 0)
            {
                pos++;

                for (int i = 0; i < weatherBuffer.Length - pos; i++)
                {
                    if (weatherBuffer[i + pos].Length != 0)
                    {
                        List <double[]> add = new List <double[]>();

                        string[] tmp = weatherBuffer[i + pos].Split(default(string[]), StringSplitOptions.RemoveEmptyEntries);

                        for (int t = 0; t < tmp.Length; t += 2)
                        {
                            add.Add(new double[2] {
                                Convert.ToDouble(tmp[t]), Convert.ToDouble(tmp[t + 1])
                            });
                        }
                        wcalc.AddWeatherPath(i, add);
                    }
                }
            }

            // все структуры заполнены


            List <WeatherCadr> answer = new List <WeatherCadr>();

            for (int i = 0; i < frames; i++)
            {
                answer.Add(wcalc.CalculateTact());// рассчитали такт еще один и положили в ролик
            }

            return(answer);

            //  return workFrames;
        }
Пример #2
0
        public List <WeatherCadr> GetWeatherFromCadr(WeatherCadr cadr, int time, IUserID user, string weather)
        {
            frames = 10; // порция кадров

            // нам нужно в память загрузить кадо

            WeatherCalculator wcalc = new WeatherCalculator();

            wcalc.setTime = time;
            // добавим землю
            for (int i = 0; i < cadr.Land.Count; i++)
            {
                Land t   = (Land)cadr.Land[i];
                Land tmp = new Land(t.X, t.Y, t.R, t.V, t.C);
                wcalc.AddLand(tmp);
            }
            // добавим циклоны
            for (int i = 0; i < cadr.Weather.Count; i++)
            {
                Cyclone t   = (Cyclone)cadr.Weather[i];
                Cyclone tmp = new Cyclone(t.X, t.Y, t.R, t.V, t.C);
                wcalc.AddWeather(tmp);
            }



            // добавим траектории циклонов
            FileManagement.FileManager fm = Fabric.GetFileManager();
            string[] weatherBuffer        = fm.GetThisFile(user, weather);// буффер погоды

            string[] lines = weatherBuffer[0].Split(default(string[]), StringSplitOptions.RemoveEmptyEntries);
            wcalc.SetRect(Convert.ToDouble(lines[0]), Convert.ToDouble(lines[1]));


            int pos = 0;

            for (int i = 1; i < weatherBuffer.Length; i++)
            {
                string[] lines1 = weatherBuffer[i].Split(default(string[]), StringSplitOptions.RemoveEmptyEntries);

                if (lines1.Length == 0) // это условие отбросит строчки после пустой(траектории там для циклонов, если это погода)
                {
                    pos = i; break;
                }
            }

            if (pos != 0)
            {
                pos++;

                for (int i = 0; i < weatherBuffer.Length - pos; i++)
                {
                    if (weatherBuffer[i + pos].Length != 0)
                    {
                        List <double[]> add = new List <double[]>();

                        string[] tmp = weatherBuffer[i + pos].Split(default(string[]), StringSplitOptions.RemoveEmptyEntries);

                        for (int t = 0; t < tmp.Length; t += 2)
                        {
                            add.Add(new double[2] {
                                Convert.ToDouble(tmp[t]), Convert.ToDouble(tmp[t + 1])
                            });
                        }
                        wcalc.AddWeatherPath(i, add);
                    }
                }
            }

            // все заполнили


            List <WeatherCadr> answer = new List <WeatherCadr>();

            for (int i = 0; i < frames; i++)
            {
                answer.Add(wcalc.CalculateTact());// рассчитали такт еще один и положили в ролик
            }

            return(answer);
        }