Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
.NET 4.x

Рисование на PictureBox

21.12.2017, 11:40. Показов 1442. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вообщем то, есть один квадратный Picturebox, размер 220 * 150.
На нём рисуются точки (каждая точка имеет бордюр длиной 1пиксель).
По скольку как бы пограмотнее замерить я не знаю, воспользовался обычным диспетчером.
При отрисовке 1000 точек 60 раз в секунду нагрузка на ЦП составляет 28% (sic!) на моем i5@4ghz.
Что вообщем то неприлично много.

код примерно такой

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
private PictureBox _pb;      
 
foreach (Spawn obj in _widgetProvider.Objects) {
    var mapObject = new MapObject(obj, Client.Settings.WidgetColors[obj.ObjectType].PointColor);
 
    DrawObject(mapObject, graphics);
 
    if (!_isCursorInside) {
        continue;
    }
 
    //cursor over object
    var mapObjectBounds = _pb.RectangleToScreen(mapObject.Bounds);
    if (mapObjectBounds.Contains(Cursor.Position) && _selectedObject == null) {
        _selectedObject = mapObject;
    }
}  
 
 
private void DrawObject(MapObject obj, Graphics graphics) {
    //calculate offsets
    SolidBrush brush = new SolidBrush(obj.Color);
 
    var locationOffset = new Point(
        Me.Location.X - obj.Spawn.Location.X, 
        Me.Location.Y - obj.Spawn.Location.Y
        );
 
    var offsetOnMap = new Point(
        -(int)(locationOffset.X * Client.Settings.MapScale),
        -(int)(locationOffset.Y * Client.Settings.MapScale)
        );
 
    Point locationToDraw = new Point(
        _pb.Size.Width / 2 - DiameterOfPoint / 2 + offsetOnMap.X,
        _pb.Size.Height / 2 - DiameterOfPoint / 2 + offsetOnMap.Y
        );
 
    if (!Client.Settings.FixedMap) {
        Point center = new Point(_pb.Size.Width / 2, _pb.Size.Height / 2);
        double angle = (double)Client.Camera.RollHorizontal / ushort.MaxValue * -360.0 - 90;
        locationToDraw = RotatePoint(locationToDraw, center, angle);    
    }
 
    obj.Bounds = new Rectangle(
                        locationToDraw.X,
                        locationToDraw.Y,
                        DiameterOfPoint,
                        DiameterOfPoint
                        );
 
    graphics.FillEllipse(brush, obj.Bounds);
    graphics.DrawEllipse(Pens.Black, obj.Bounds);
}
 
private Point RotatePoint(Point pointToRotate, Point centerPoint, double angleInDegrees) {
    double angleInRadians = angleInDegrees * (Math.PI / 180);
    double cosTheta = Math.Cos(angleInRadians);
    double sinTheta = Math.Sin(angleInRadians);
    return new Point {
        X =
            (int)
            (cosTheta * (pointToRotate.X - centerPoint.X) -
            sinTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.X),
        Y =
            (int)
            (sinTheta * (pointToRotate.X - centerPoint.X) +
            cosTheta * (pointToRotate.Y - centerPoint.Y) + centerPoint.Y)
    };
}
Собственно вопрос - как бы оптимизировать имеющий код, может сменить способ рисования в сторону DirectX какого нибудь или что нибудь еще ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2017, 11:40
Ответы с готовыми решениями:

Рисование на PictureBox
Здравствуйте! У меня в PictureBox есть изображение (назовем его "img"). На самом контролле я рисую прямоугольник выделения в событии...

Рисование на picturebox
Доброго времени суток! Собственно, проблемы с сабжем. Прикладываю проект.

Рисование на pictureBox
Всем привет, на ютубе нашёл интересное видео, где описывается рисование int X; int Y; int X1; ...

1
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
23.12.2017, 17:26  [ТС]
немного удивлён, что никто не ответил, апну.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.12.2017, 17:26
Помогаю со студенческими работами здесь

PictureBox, рисование
Итак, ребятки, очередная проблема. Рисую обычным Graphics graf = pictureBox1.CreateGraphics(); Brush fill = new...

Рисование в PictureBox
Здравствуйте! Подскажите, как рисовать именно в pictureBox'е, а не по нему? Чтоб, например, мог потом сохранить через .Image.Save()...

рисование в picturebox-е
Izvinite a kak delat tak chto mouseposition vzyal koordinati, a ne mi napisali ee v code? Voobshe to mne nujna takaya proga. toolstrip...

Рисование в PictureBox
Почему при открытии формы не рисует в picturebox? По клику работает, а по открытию формы тот же код не работает. При этом смена названия...

Рисование в PictureBox
у меня стоит задача сделать Paint как на ХР, хочу сделать карандаш, но с линией не получаться, тогда сделал елипсы подряд: private void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru