DrawLines не прорисовывает некоторые линии

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Monstria
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.07.2010 (Чт) 11:25
Откуда: Нижний Новгород

DrawLines не прорисовывает некоторые линии

Сообщение Monstria » 29.07.2010 (Чт) 11:46

Всем доброго времени суток.

Столкнулся с тем, что при прорисовке линий методом DrawLines
Код: Выделить всё
gr.DrawLines(New Pen(Brushes.Black, 0.00001), line2.DataPoins)

некоторые линии не прорисовываются. Исходный проект приложил...

Буду рад выслушать всех, кто подскажет где моя ошибка, или как избежать подобного казуса.

Вложение Test.rar больше недоступно.
Вложения
Test.rar
(76.61 Кб) Скачиваний: 81

Monstria
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.07.2010 (Чт) 11:25
Откуда: Нижний Новгород

Re: DrawLines не прорисовывает некоторые линии

Сообщение Monstria » 29.07.2010 (Чт) 12:58

Ну и еще вопрос...
В дальнейшем будет обрисовываться большое количество линий - более 100000, в результате процесс отрисовки становится крайне медлительным...
Думал решить проблему, разбив все линии на матрицу (двухмерный массив массивов) площадью в четверть градуса и прорисовывать только те линии, которые попадают в область на экране - скорость увеличилась, но не на столько что бы быть приемлемой.
Как можно еще ускорить работу подобной программы?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: DrawLines не прорисовывает некоторые линии

Сообщение Viper » 29.07.2010 (Чт) 13:12

Ну попробуй для начала хранить координаты не в строках, а в численных переменных (или даже константах) и не пересчитывать неизменяющуюся картинку при каждом событии Paint.
Весь мир матрица, а мы в нем потоки байтов!

Monstria
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.07.2010 (Чт) 11:25
Откуда: Нижний Новгород

Re: DrawLines не прорисовывает некоторые линии

Сообщение Monstria » 29.07.2010 (Чт) 13:21

Viper писал(а):Ну попробуй для начала хранить координаты не в строках, а в численных переменных (или даже константах) и не пересчитывать неизменяющуюся картинку при каждом событии Paint.

Ну как бы координаты рассчитываются в метрическую систему и выводятся в массиве PoinF (класс Polyline). После этого они уже хранятся в массиве, из которых и берутся данные - расчеты больше не делаются, окромя того что циклично подставляются данные в DrawLines (в приведенном примере это объявленные переменные Line as polyline - значения им присваивается единожды в процедуре Form_Load.. )
На счет констант - можно поподробнее, что именно вы имели ввиду?
Viper писал(а): и не пересчитывать неизменяющуюся картинку при каждом событии Paint.

Эээ... как это реализовать? Если сейчас перерисовка происходит при измерении размера, масштаба и сдвига карты...

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: DrawLines не прорисовывает некоторые линии

Сообщение FireFenix » 29.07.2010 (Чт) 14:09

Monstria писал(а): некоторые линии не прорисовываются. Исходный проект приложил...

Правильно сопоставь свои линии с масштабом и единицами измерений... Естесно очень мелкие линии он не нарисует, т.е. может и нарисует, но размером с 1 пиксель всю полилинию

Вообще это извращение рисовать линии с изменением почти в 1 миллионную целого числа, проще сами линии вначале порезать и отмаштабировать

В чём вообще стоит задача и для чего это нужно?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Monstria
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.07.2010 (Чт) 11:25
Откуда: Нижний Новгород

Re: DrawLines не прорисовывает некоторые линии

Сообщение Monstria » 29.07.2010 (Чт) 14:18

FireFenix писал(а):В чём вообще стоит задача и для чего это нужно?

Первоначальная задача отрисовать карту полилиний заданных по координатам WGS84...
В дальнейшем планируется работа с этими линиями (подобие векторного редактора карт в упращенном виде)

В целом шел от желания минимально изменять вводные данные и вопрос как бы решился...
29.07.png
29.07.png (89.48 Кб) Просмотров: 2175

но... пробелы в некоторых линиях ставит на нет подобное решение...

Как вы посоветуете реализовать данное решение?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: DrawLines не прорисовывает некоторые линии

Сообщение FireFenix » 29.07.2010 (Чт) 15:54

Monstria писал(а):Первоначальная задача отрисовать карту полилиний заданных по координатам WGS84...
В дальнейшем планируется работа с этими линиями (подобие векторного редактора карт в упращенном виде)

Жесть

Monstria писал(а):В целом шел от желания минимально изменять вводные данные и вопрос как бы решился...
но... пробелы в некоторых линиях ставит на нет подобное решение...

  • Если исходные данные тоже с пробелами... Можно в окрестности конечной точки брать некий радиус и проводить коллизию с другими векторами
    Как найдены все линии входящие в эту окрестность, то находим центр и соединяем их все
  • Если исходные данные - нормальные, то проблемы с матричными преобразованиями (не хватает точности)
    Тут уж думаю нада вручную работать с линиями и сделать их типом Double или Decimal

Monstria писал(а):Как вы посоветуете реализовать данное решение?

Зачем вообще это нужно? Тема так и не раскрыта...
Для рисования поверх карты каких-то объектов? Тогда проще сделать 1 большой рисунок (скажем содрать с гугл мапс) и указать начальные координаты... Потом по верх него уже манипулировать
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Samsonov
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 22.04.2010 (Чт) 7:32
Откуда: DC

Re: DrawLines не прорисовывает некоторые линии

Сообщение Samsonov » 29.07.2010 (Чт) 16:10

Перво-наперво, попробуйте рисовать не напрямую в объект Graphics, а с использованием двойной буферизации — BufferedGraphics. Это скорее всего повысит скорость первичного рисования (если узким местом является именно графическая система), и совершенно точно минимизирует время повторной прорисовки готового изображения — буфер с готовым рисунком можно сохранять.

Во-вторых, попробуйте избавиться от «индусского» кода, например такого:
Код: Выделить всё
        gr.DrawLines(New Pen(Brushes.Black, 0.00001), line.DataPoins)
        gr.DrawLines(New Pen(Brushes.Black, 0.00001), line1.DataPoins)
        gr.DrawLines(New Pen(Brushes.Black, 0.00001), line2.DataPoins)
        gr.DrawLines(New Pen(Brushes.Black, 0.00001), line3.DataPoins)
        gr.DrawLines(New Pen(Brushes.Black, 0.00001), line4.DataPoins)
        gr.DrawLines(New Pen(Brushes.Black, 0.00001), line5.DataPoins)
Или такого:
Код: Выделить всё
        For i = 0 To id - 1
            ...
            ReDim Preserve arr(i)
            ...
        Next

Monstria
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.07.2010 (Чт) 11:25
Откуда: Нижний Новгород

Re: DrawLines не прорисовывает некоторые линии

Сообщение Monstria » 29.07.2010 (Чт) 16:15

FireFenix писал(а):Жесть

Как бы то нибыло - тут не слова полезной информации
Если исходные данные тоже с пробелами...

Исключено - все данные работают в других GIS системах
Если исходные данные - нормальные, то проблемы с матричными преобразованиями (не хватает точности)

Опять таки исключено - точность данных можете проверить сами из проекта-примера в первом посте

Зачем вообще это нужно? Тема так и не раскрыта...
Для рисования поверх карты каких-то объектов? Тогда проще сделать 1 большой рисунок (скажем содрать с гугл мапс) и указать начальные координаты... Потом по верх него уже манипулировать

Мне не нужно рисования ни поверх, ни под ними, ни подкладывать спутниковые снимки... Первоначальная задача более чем полно отображена в проекте-примере - мне нужно отрисовать всю карту и иметь, возможность масштабирования и перемещения по динамически созданной карте. Как больше открыть тему?

Monstria
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.07.2010 (Чт) 11:25
Откуда: Нижний Новгород

Re: DrawLines не прорисовывает некоторые линии

Сообщение Monstria » 29.07.2010 (Чт) 16:30

Samsonov писал(а):Перво-наперво, попробуйте рисовать не напрямую в объект Graphics, а с использованием двойной буферизации — BufferedGraphics. Это скорее всего повысит скорость первичного рисования (если узким местом является именно графическая система), и совершенно точно минимизирует время повторной прорисовки готового изображения — буфер с готовым рисунком можно сохранять.

Покапаю в эту сторону... хотя я и так рисую на созданном в памяти изображении...

Во-вторых, попробуйте избавиться от «индусского» кода, например такого

Ну разумеется "индусский" код существует только в проекте-примере :)))) В разрабатываем программе, где количество линий более 100000, не представляю себе возможным как можно обойтись без цикличности :))))
В разрабатываемой программе "индусский" код несколько упрощен ;)
Код: Выделить всё
'Определим границы матрицы
        Dim matX_0, matY_0, matX_1, matY_1 As Integer
        matX_0 = (Mast.startPoint.X - Matrix_0.X) / 0.25 - 1
        If matX_0 < 0 Then matX_0 = 0
        matY_0 = (Mast.startPoint.Y - Matrix_0.Y) / 0.25 - 1
        If matY_0 < 0 Then matY_0 = 0
        matX_1 = matX_0 + PictureBox1.Width / 96 / Mast.level_Z / 0.25 + 1
        If matX_1 > Matrix_W Then matX_1 = Matrix_W
        matY_1 = matY_0 + PictureBox1.Height / 96 / Mast.level_Z / 0.25 + 1
        If matY_1 > Matrix_H Then matY_1 = Matrix_H
        'Прорисовываем линии из необходимых блоков матрицы
        Dim i, y As Integer
        For i = matX_0 To matX_1
            For y = matY_0 To matY_1
                If Not MatrixLine(i, y) Is Nothing Then
                    Dim ind As Integer
                    For ind = 0 To MatrixLine(i, y).Length - 1
                        gr.DrawLines(New Pen(Brushes.Black, 0.00001), MatrixLine(i, y)(ind).DataPoins)
                    Next
                End If
            Next
        Next
        'Выводим изображение
        e.Graphics.DrawImage(img, 0, 0)
        'Создаем копирайт
        e.Graphics.DrawString("admin@garmin-nnov.ru", Font, Brushes.BurlyWood, 10, 10)
        gr.Dispose()

Monstria
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.07.2010 (Чт) 11:25
Откуда: Нижний Новгород

Re: DrawLines не прорисовывает некоторые линии

Сообщение Monstria » 29.07.2010 (Чт) 17:08

FireFenix писал(а):Правильно сопоставь свои линии с масштабом и единицами измерений... Естесно очень мелкие линии он не нарисует, т.е. может и нарисует, но размером с 1 пиксель всю полилинию

Да, все верно... увеличив входные данные на один разряд 56.36282==563.6282 все линии были прорисованы. Спасибо!

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: DrawLines не прорисовывает некоторые линии

Сообщение Nord777 » 29.07.2010 (Чт) 17:24

gr.DrawLines(New Pen(Brushes.Black, 0.00001), MatrixLine(i, y)(ind).DataPoins)
Зачем ты каждый раз создаешь новый обьект? Один раз создай его и используй:
Код: Выделить всё
Dim P as New Pen(Color.Black, 0.00001!)
....
Sub Paint(...)
gr.DrawLines(P, DataPoins)
End Sub

И вообще с особым вниманием относись ко всем New если они в циклично-вызываемой процедуре.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: DrawLines не прорисовывает некоторые линии

Сообщение FireFenix » 29.07.2010 (Чт) 17:30

Monstria писал(а):В разрабатываемой программе "индусский" код несколько упрощен ;)

Это ещё нормально... Для каркаса программы сойдёт...

Но вот юзать русский в названиях переменных или объектов... Так не долго и 1С-ником стать...
Также сама компоновка проекта и наименования переменных попахивают говнокодм
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Monstria
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.07.2010 (Чт) 11:25
Откуда: Нижний Новгород

Re: DrawLines не прорисовывает некоторые линии

Сообщение Monstria » 29.07.2010 (Чт) 18:05

FireFenix писал(а):Но вот юзать русский в названиях переменных или объектов... Так не долго и 1С-ником стать...
Также сама компоновка проекта и наименования переменных попахивают говнокодм

Да ладно... что то взгрустнулось вот и обозвал два Label русскими ...эхе хе хе.. потом сам плевался от надобности переключать раскладку клавиатуры..
Про компоновку и говнокод - ну если тот проект-тест рассматривать - то полностью согласен, если то что делаю на чистую... ну там тоже до совершенства как до китая раком, но с учетом, что я не программист, а так, полусамоучка - короче сойдет :)...

Кстати, увеличив матрицу (массив массивов с данными) в 10 раз получил вполне приемлемую скорость прорисовки.

Всем откликнувшимся - большое спасибо!!!!

Monstria
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 29.07.2010 (Чт) 11:25
Откуда: Нижний Новгород

Re: DrawLines не прорисовывает некоторые линии

Сообщение Monstria » 29.07.2010 (Чт) 18:09

Nord777 писал(а):Зачем ты каждый раз создаешь новый обьект? Один раз создай его и используй:

Это только в тестовом варианте - позже все будет реализовано на уровне класса (полилинии будут отличаться по цвету, толщине, в зависимости от данных их характеризующих и т.д. и т.п).. Но все равно спасибо за совет!.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList