Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2013, 02:04   #1
alik98
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 54
Вопрос Проблема с шумом Перлина в С#

Столкнулся с проблемой, когда писал карту высот на основе шума Перлина: вся карта в полосах:



Делал через Bitmap, не создавая массивы с точками. Думаю, возможно, дело в интерполяции, но она стандартная шарповская:

Код:
private Bitmap interpolate(Bitmap image)
        {
            Bitmap newBitmap = new Bitmap(resolution, resolution);
            using (Graphics g = Graphics.FromImage(newBitmap))
            {

                g.SmoothingMode = SmoothingMode.HighQuality;
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.PixelOffsetMode = PixelOffsetMode.HighQuality;

                Rectangle rectFrom = new Rectangle(1, 1, image.Width - 2, image.Height - 2);
                Rectangle rectTo = new Rectangle(0, 0, resolution, resolution);
                g.DrawImage(image, rectTo, rectFrom, GraphicsUnit.Pixel);
            }

            return newBitmap;
        }
Подскажите, в чем может быть проблема.
alik98 вне форума Ответить с цитированием
Старый 03.03.2013, 07:51   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Проблема именно в интерполяции. Полосы, а точнее четырёхугольники, результат работы кубической интерполяции. Нужно применять сплайн-линии, тогда и полосы исчезнут. Когда-то сталкивался с таким, но не помню уже, какую функцию применял (а может и сам писал?).
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 03.03.2013, 12:31   #3
alik98
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 54
По умолчанию

Цитата:
Проблема именно в интерполяции. Полосы, а точнее четырёхугольники, результат работы кубической интерполяции.
Попробовал поменять параметр с bicubic на другие, но остальные дают только худший результат.

Цитата:
Нужно применять сплайн-линии, тогда и полосы исчезнут.
Что такое "сплайн-линии"? Расскажите поподробнее, пожалуйста, или дайте ссылку.
alik98 вне форума Ответить с цитированием
Старый 03.03.2013, 12:39   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Я думаю, имелась в виду билинейная интерполяция.
Кстати, по смыслу должен быть один и тот же вид интерполяции и внутри самого алгоритма, и при визуализации.
И для проверки лучше начинать не с построения картинки в изометрической проекции и с освещением, а с простейшей картинки "пиксель в пиксель" (лучше пиксель->квадрат со стороной 2-4 пикселя), где значению яркости соответствует сама высота. Если есть какие-то проблемы, Вы увидите это сразу, а не будете ломать голову, на каком этапе закралась ошибка - генерации или визуализации.
s-andriano вне форума Ответить с цитированием
Старый 03.03.2013, 15:25   #5
alik98
Пользователь
 
Регистрация: 28.05.2012
Сообщений: 54
По умолчанию

Карта высот:



Я, по карйней мере, ошибок тут не вижу.
Может ошибка в визуализации? Вот код:
Код:
        public void calcNormals()
        {
            Vector3[,,] trianglesNormals = new Vector3[sizeX - 1, sizeY - 1, 2];
            for (int x = 0; x < sizeX - 1; x++)
            {
                for (int y = 0; y < sizeY - 1; y++)
                {
                    Vector3 v1 = new Vector3(x, highmap[x, y], y);
                    Vector3 v2 = new Vector3(x + 1, highmap[x + 1, y], y);
                    Vector3 v3 = new Vector3(x, highmap[x, y + 1], y + 1);
                    Vector3 v4 = new Vector3(x + 1, highmap[x + 1, y + 1], y + 1);
                    
                    trianglesNormals[x, y, 0] = Vector3.Cross(v2 - v1, v2 - v4);
                    trianglesNormals[x, y, 0].Normalize();
                    trianglesNormals[x, y, 1] = -Vector3.Cross(v3 - v1, v3 - v4);
                    trianglesNormals[x, y, 1].Normalize();
                }
            }

            for (int x = 0; x < sizeX; x++)
            {
                for (int y = 0; y < sizeY; y++)
                {
                    Vector3 sum = Vector3.Zero;

                    if (x > 0 && y > 0)
                    {
                        sum += trianglesNormals[x - 1, y - 1, 0];
                        sum += trianglesNormals[x - 1, y - 1, 1];
                    }

                    if (x < sizeX - 1 && y < sizeY - 1)
                    {
                        sum += trianglesNormals[x, y, 0];
                        sum += trianglesNormals[x, y, 1];
                    }

                    if (x < sizeX - 1 && y > 0)
                    {
                        sum += trianglesNormals[x, y - 1, 1];
                    }

                    if (x > 0 && y < sizeY - 1)
                    {
                        sum += trianglesNormals[x - 1, y, 0];
                    }

                    normals[x, y] = sum;
                    normals[x, y].Normalize();
                }
            }   
        }
        public void drawHighmap(Color color)
        {
            for (int y = 0; y < sizeY - 1; y++)
            {
                GL.Begin(BeginMode.TriangleStrip);
                GL.Color3(color);
                for (int x = 0; x < sizeX; x++)
                {
                    GL.Normal3(normals[x, y + 1]);
                    GL.Vertex3((float)x, highmap[x, y + 1], (float)(y + 1));
                    GL.Normal3(normals[x, y]);
                    GL.Vertex3((float)x, highmap[x, y], (float)y);
                }
                GL.End();
            }
        }
alik98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шум Перлина(Pelin Noise) Демик Помощь студентам 6 24.02.2013 16:14
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37