Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скорость прорисовки графических построений 
:(
    Опции темы
ShamanK
Дата 27.2.2010, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.2.2010

Репутация: нет
Всего: нет



написал: 

Код

    Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        Dim p() As Point = {New Point(100, 100), New Point(150, 100)}
        Dim gp As Drawing2D.GraphicsPath
        gp.addlines(p)
        PictureBox1.CreateGraphics.DrawPath(Pens.Red, gp)
    End Sub

выдает ошибку на строке gp.addlines(p):

Переменная gp используется до присвоения ей значения. Во время исполнения может произойти исключение при ссылке на значение NULL.

PM MAIL   Вверх
diadiavova
Дата 27.2.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(ShamanK @  27.2.2010,  11:54 Найти цитируемый пост)
но вопрос сразу возникает что будет быстрей работать стандартный контрол или собственный? 

Пикчербокс предназначен для отображения картинок, я так понимаю тебе это не нужно, стало быть нет смысла его использовать. Создать контрол просто: добавляешь в проект новый элемент и в диалоговом окне выбираешь UserControl или Control. В нём надо переопределить метод OnPaint и в нём выполнить прорисовку. Фон(например оси графика) можно прорисовывать там же или в методе OnPaintBackground.

А вообще по теме начни отсюда
http://msdn.microsoft.com/ru-ru/library/6hws6h2t.aspx


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
xXxSataNxXx
Дата 27.2.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 25.12.2009

Репутация: 1
Всего: 1



Код

dim p() as point={ new point(100,100), new point(150,100)}
dim gp as new graphicspath ' Запарился, тут не просто GraphicsPath, а New GraphicsPath
gp.addlines(p)
picturesbox1.creategraphics.drawpath(pen.black,gp)


А ещё лучше, чтоб не писать Drawing2D.GraphicsPath и тому подобные графические функции, перед классом формы добавь

Код

Imports System.Drawing.Drawing2D


И этот код не обязательно ставить в событие Paint...

Это сообщение отредактировал(а) xXxSataNxXx - 27.2.2010, 17:37
PM MAIL   Вверх
diadiavova
Дата 27.2.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(xXxSataNxXx @  27.2.2010,  17:36 Найти цитируемый пост)
И этот код не обязательно ставить в событие Paint..

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
xXxSataNxXx
Дата 27.2.2010, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 25.12.2009

Репутация: 1
Всего: 1



Согласен, что исчезнет, но если там постоянное обновление, то все точки будут прорисовываться постоянно...
А на сколько я помню, обновление графикка будет идти со скоростью не больше 1 секунды... =0)
Можно вынести точки, чтоб они хранились не в обработчике типо "Public p() as point"

Это сообщение отредактировал(а) xXxSataNxXx - 27.2.2010, 18:09
PM MAIL   Вверх
Pilger
Дата 27.2.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 10.5.2008
Где: Германия

Репутация: нет
Всего: нет



Согласен, для быстродействия в обработчике Paint лучше оставить только:
Код

g.drawpath(pen.black,gp)


Но прислушайся к советам diadiavova.

Это сообщение отредактировал(а) Pilger - 27.2.2010, 18:26


--------------------
Ein Leben nach der Schleife existiert, nur wenn die Schleife terminiert.
PM MAIL ICQ   Вверх
diadiavova
Дата 27.2.2010, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



На счёт DrawPath я не думаю, что это хорошая идея, создание лишнего Disposable объекта при такой частой перерисовке - это лишние затраты ресурсов, думаю можно ограничиться DrawLines.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ShamanK
Дата 28.2.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.2.2010

Репутация: нет
Всего: нет



подскажите а как передвигать график? 

к примеру есть двумерный массив с координатами точек.

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

как это лучше сделать?

удалить весь старый график ( как это делается ? ) и нарисовать новый с уже пришедшей ценой?  и не будет ли при этом мерцания?
или
передвинуть влево старый график ( как это делается? ) и пририсовать к графику еще одну линию?

Это сообщение отредактировал(а) ShamanK - 28.2.2010, 11:25
PM MAIL   Вверх
diadiavova
Дата 28.2.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Двумерный массив там не нужен. Тебе понадобится одномерный массив точек(идеальным вариантом будет собственный класс, который будет представлять линию на графике и содержать коллекцию точек за какой-то промежуток времени). Всякий раз при прорисовке контрола тебе надо будет нарисовать оси и прочие фоновые дела, после чего брать точки из этого массива(класса), который будет объявлен в контроле как внутренне поле и рисовать линию по этим точкам. Иными словами для того чтобы всё сдвинуть придётся перерисовать всё заново.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ShamanK
Дата 28.2.2010, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.2.2010

Репутация: нет
Всего: нет



diadiavova, а можно хотябы небольшой пример. ибо то что вы написали мне понятно по логике а вот по умению написания вообще нихрена не понял.. 

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

мнеб самый простой примерчик чтобы "догнать" как это все происходит. 
PM MAIL   Вверх
diadiavova
Дата 28.2.2010, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



ShamanK, я набросал как примерно может выглядеть упомянутый класс, но сразу хочу оговориться: этот код не для копипасты, разберись как он устроен и приспособь к своей задаче. Общий принцип работы примерно следующий:
В экземпляр класса добавляются пары <Момент времени;Значение>(для них создана специальная структура).
Экземпляр удерживает некоторое количество таких элементов, которое соответствует заданному промежутку времени(по умолчанию я задал удерживать все значения за последнюю минуту) и всякий раз при обновлении все более ранние элементы удаляются.
Так же можно задать диапазон значений, который будет отображаться в контроле.

Для преобразования пары "время-значение" в точку есть две функции, которые тебе придётся реализовать самому и возможно для их поддержки понадобятся дополнительные свойства.

Ну и наконец есть функция, которая будет выдавать массив точек для отображения. 

В своём контроле объявишь переменную, которая будет держать такой объект и при прорисовке контрола используй его данные. Надеюсь разберёшься.
Код

Public Class ChartLine
    ''' <summary>
    ''' Коллекция для хранения значений
    ''' </summary>
    ''' <remarks></remarks>
    Private _pointList As New List(Of TimeValue)
    ''' <summary>
    ''' Добавление нового элемента в коллекцию
    ''' </summary>
    ''' <param name="tv">Новый элемент</param>
    ''' <remarks></remarks>
    Public Sub AddNew(ByVal tv As TimeValue)
        _pointList.Add(tv)
    End Sub
    ''' <summary>
    ''' Добавление нового элемента в коллекцию
    ''' </summary>
    ''' <param name="time">Время</param>
    ''' <param name="value">Значение</param>
    ''' <remarks></remarks>
    Public Sub AddNew(ByVal time As Date, ByVal value As Integer)
        Dim tv As New TimeValue
        tv.Time = time
        tv.Value = value
        AddNew(tv)
    End Sub
    ''' <summary>
    ''' Добавление нового элемента в коллекцию
    ''' </summary>
    ''' <param name="value">Значение на текущий момент</param>
    ''' <remarks></remarks>
    Public Sub AddNew(ByVal value As Integer)
        AddNew(Date.Now, value)
    End Sub
    ''' <summary>
    ''' Удаляет все элементы, находящиеся за пределами удерживаемого диапазона
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Update()
        Try
            Dim lastTime = _pointList(_pointList.Count - 1).Time - KeepingRange
            While _pointList(0).Time < lastTime
                _pointList.RemoveAt(0)
            End While
        Catch
        End Try
    End Sub

    Private _keepingRange As New TimeSpan(0, 1, 0)
    ''' <summary>
    ''' Удерживаемый в памяти диапазон времени
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>Показывает за какой промежуток времени надо хранить значения.
    ''' При очередном обновлении из коллекции будут удалены элементы, соответствующие времени
    ''' более раннему, чем текущий момент минус значение данного свойства. 
    ''' По умолчанию 1 минута.</remarks>
    Public Property KeepingRange() As TimeSpan
        Get
            Return _keepingRange
        End Get
        Set(ByVal value As TimeSpan)
            _keepingRange = value
        End Set
    End Property


    Private _showingRange As New TimeSpan(0, 0, 10)
    ''' <summary>
    ''' Промежуток времени, который следует отображать
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>По умолчанию 10 секунд</remarks>
    Public Property ShowingRange() As TimeSpan
        Get
            Return _showingRange
        End Get
        Set(ByVal value As TimeSpan)
            _showingRange = value
        End Set
    End Property
    ''' <summary>
    ''' Функция преобразования момента времени в экранную координату X
    ''' </summary>
    ''' <param name="time"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function TimeToX(ByVal time As Date) As Integer
        'Придётся реализовать самому
    End Function
    ''' <summary>
    ''' Функция преобразования значения в экранную координату Y 
    ''' </summary>
    ''' <param name="value"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ValueToY(ByVal value As Integer) As Integer
        'Придётся реализовать самому
    End Function
    ''' <summary>
    ''' Возвращает массив точек для отображения на графике
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetPointArray() As Point()
        Dim actulPoints = _
        _pointList.FindAll(Function(x) x.Time >= _
                (_pointList(_pointList.Count - 1).Time - ShowingRange))
        Return (actulPoints.Select( _
                Function(x) New Point(TimeToX(x.Time), ValueToY(x.Value)))).ToArray
    End Function

End Class
Public Structure TimeValue
    Public Time As Date
    Public Value As Integer
End Structure
Код естественно не проверялся и написан скорее для иллюстрации, хотя можно немного доработать и использовать.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1129 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.