Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Новое сообщение без темы Добавлено: 12.11.05 23:17  

Автор вопроса:  Victor | Web-сайт: vt-dbnz.narod.ru | ICQ: 345743490 

subject=Круг с Antialiasing'ом. Производительность. Sqr()
Пишу все тот же движок для линий напряженности. Решил сделать точки не
пикселями, а кружочками. И притом с антиалиасингом.
И получилось что-то вроде
...
DrawCircle:
    maxD = 3.14 * pr * pr
    If maxD > 1 Then maxD = 1
    If maxD < 0.001 Then Return 'точку не видно будет - не надо рисовать
    For ty = Max(0, Int(py + 0.5 - pr)) To Min(-Int(-(py - 0.5 + pr)), h -
1)
        For tx = Max(Int(px + 0.5 - pr), 0) To Min(-Int(-(px - 0.5 + pr)),
w - 1)
            d = pr - Sqr((tx - px) * (tx - px) + (ty - py) * (ty - py)) +
0.5
            If d < 0 Then d = 0
            If d > maxD Then d = maxD

            Data(tx, ty).rgbBlue = Data(tx, ty).rgbBlue * (1# - d) +
Points(i).Color.rgbBlue * d
            Data(tx, ty).rgbGreen = Data(tx, ty).rgbGreen * (1# - d) +
Points(i).Color.rgbGreen * d
            Data(tx, ty).rgbRed = Data(tx, ty).rgbRed * (1# - d) +
Points(i).Color.rgbRed * d
        Next tx
    Next ty
Return
...
, где
Data - массив RGBQUAD'ов, содержащий рисунок на PictureBox
px,py,pr - параметры кружка, в пикселях. тип = Double
Points(i).Color - цвет рисования кружка, типа RGBQUAD.
w,h - ширина, высота рисунка, в пикселях. Тип=long

Переменные:
 tx,ty - координаты очередного пикселя в кружке (а иногда и вне него). Типа
Long.
d - прозрачность, с которой рисовать данный пиксель. Типа Double.
MaxD - максимальная прозрачность, которая введена для того, чтобы кружки
маленького радиуса рисовались корректно. Типа Double.

Прошу не осуждать меня за использование устаревшей конструкции GoSub ...
Label ... Return. Просто удобно было написать все это прямо в процедуре
обработки, чтобы быстрее было и чтобы не передавать кучу параметров.

Проблема
Работает медленно, если окружность большого радиуса (почти на весь экран к
примеру). Предположительно из-за использования Sqr.
Как обойти проблему? Подскажите, как сделать вычисление Sqr быстрее или как
вообще от него избавиться.

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #1
Добавлено: 14.11.05 02:05
Попробуй замораживать PictureBox на время рисования.
Кстати, на каком это Васе?!
Если на шестом, то поздравьте меня - я не знал, что он поддерживает Return. Да и способ рисования я что-то не понял - нельзя ли банально circle'ами?

Ответить

Номер ответа: 2
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #2
Добавлено: 14.11.05 07:40
Если на шестом, то поздравьте меня - я не знал, что он поддерживает Return.

 Ну обычный поддерживает
GoSub Label
Label:
Return

 А как средство выхода из процедуры, Return Бейсику совершенно не свойственен.

Ответить

Номер ответа: 3
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #3
Добавлено: 14.11.05 23:28
For ty = Max(0, Int(py + 0.5 - pr)) To Min(-Int(-(py - 0.5 + pr)), h -
1)
        For tx = Max(Int(px + 0.5 - pr), 0) To Min(-Int(-(px - 0.5 + pr)),
w - 1)


Вынеси из циклов функции Min и Max. Это кончно не панацея, но должно работать побыстрее.
При каждом проходе цикла функции вызыватся, а это очень значительные издержки.
Т.е. сделай оценку перед входом в цикл.

Ответить

Номер ответа: 4
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #4
Добавлено: 16.11.05 17:04

Попробуй замораживать PictureBox на время рисования.
Это как?
При каждом проходе цикла функции вызыватся, а это очень значительные издержки.
Не правда. Точнее, не совсем. Для каждой инициализации цикла они вызываются ровно один раз, во время работы цикла они уже не вызываются. Но действительно, границы чикла по x считаются заново при каждом y, в чем нет необходимости. Я, правда, уверен, что это ни капли не ускорит рисование больших кругов, а именно с ними у меня тормоза.

Да и способ рисования я что-то не понял - нельзя ли банально circle'ами?
У них анти-алиасинга нет. И вообще, когда их много и они мелкие - Circle будет жутко тормозить. Я там на массиве рисую, о пикчербоксе вообще почти не знаю.

Ответить

Номер ответа: 5
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #5 Добавлено: 16.11.05 20:03
Это как?
А че, AutoRedraw у PicBox'a уже не работает? :~)

Ответить

Номер ответа: 6
Автор ответа:
 el-paso



Вопросов: 3
Ответов: 164
 Профиль | | #6 Добавлено: 16.11.05 20:12
http://alglib.sources.ru/graphics/wucircle.php

Почему то, когда я постил первый раз (пару дней обратно), не прошло....

Ответить

Номер ответа: 7
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #7 Добавлено: 17.11.05 20:22
Лучше пока ограничиться кружками без anti-alias'а. Их можно рисовать очень быстро (построчно).

Ответить

Номер ответа: 8
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #8
Добавлено: 17.11.05 23:49

Это как?
А че, AutoRedraw у PicBox'a уже не работает? :~)

Все равно не понял, как это замрорзить.
У меня на пикчербокс выбран gdi-объект типа DIB Section, котороый вполне может быть Visual Basic-ом любезно удален при изменении свойства Autoredraw, а на каком массиве рисовать-то тогда?
Короче, пикчербокс морозить не вижу смысла - как от этого поменяется скорость работы с массивом? -никак.


http://alglib.sources.ru/graphics/wucircle.php
Я, кажется, как-то уже пробовал это смотреть. Ничерта не понял. Но можно попробовать еще раз.

Лучше пока ограничиться кружками без anti-alias'а. Их можно рисовать очень быстро (построчно).
Зато это не так круто выглядит. Не видно, как кружок смещается на доли пикселей. В таком случае, я наверно не буду ничего нового делать, просто оставлю пиксели вместо кружков - еще сильно быстрее будет.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам