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

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

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2017, 20:02   #11
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

pu4koff У LV1974 всегда так. По началу темы неясен предмет обсуждения, потом как-то всё само собой образумивается.

Цитата:
Сообщение от LV1974 Посмотреть сообщение
Для 2Д графики все продолжают использовать ЦП.
Не все. Microsoft Office, PhotoShop, AutoCad, видео-плейры, браузеры.

Цитата:
Сообщение от LV1974 Посмотреть сообщение
Так получается, что надо сначала делать чисто графическую подсистему и только потом можно говорить про интерактив.
Зачем делать? Для книги этого совсем не нужно, есть же AGG, Direct2D. Вот поверх вулкана сделать свою реализацию вот это я понимаю есть смысл - есть шанс получить однозначность отображения и и избавится от багов сглаживания см далее.

Цитата:
Сообщение от LV1974 Посмотреть сообщение
Туда же надо отправить функции HitTest и Update.
Вы мне тут напомнили разработчиков Blender'а, которые считают не багом, а фичей. Когда у них движок неправильное рассчитывает выделение. А вину тому сглаживание GPU на котором они считают HitTest. .


Цитата:
Сообщение от LV1974 Посмотреть сообщение
Сейчас я размышляю над форматом публикации.
Здесь есть признаки учебника, монографии, документации и ФАК.
Сложность в том, что способности объектов нельзя реализовать в изолированном виде как класс, член или функцию. Например:
Отображаемость, Селективность, Перемещаемость, Масштабируемость, Буфферезируемость и т.п.
Здесь всё очень тесно взаимосвязано.
Я тоже долго мучился с этим вопросом. А потом взял и разделил на изолированные функции/классы и нет проблем. Теперь сам не понимаю чего я мучился ведь там всё просто, главное захотеть. Вот более сложные вещи да могут потребовать.

Цитата:
Сообщение от LV1974 Посмотреть сообщение
А реализация Update() внутри GDI объектов позволяет оптимизировать множество расчётов.
Отнюдь. Оптимальнее группировать одинаковые операции в циклы. Суть в том, что основные тормоза идёт за счёт проверок внутри цикла. Если их вынести наружу, то код будет работать быстрее. Помещая Update во внутрь объекта мы выносим цикл по все объектам во вне. Тем сам решаем себя какого либо возможности в ускорении. Зато это больше соответствует стилю или духу ООП.

Цитата:
Сообщение от LV1974 Посмотреть сообщение
Однако Ваше высказывание выглядит странно. Дело в том, что графическая подсистема базируется на математическом ядре. По правилам ООП она должна его инкапсулировать.
У вас все высказывания странные. Инкапсуляция означает обрезание всех внешних связей. Что-бы объект существовал сам по себе. Поэтому графическая подсистема ну никак не может инкапсулировать математическое ядро. Инкапсуляцией занимается программист.
Базируется по другому основывается. Разве графическая подсистема основана на математическом ядре? Да она его использует и использует по полному. Но не базирется, а именно использует. Поэтому математическое ядро и геометрическое можно вынести в отдельную библиотеку.

Вот вам и решение проблемы с дублирование кода.

Теперь, что касается дублирования данных. Согласно принципам ООП объекты должны быть максимально независимые. Такое определения плохо отражает суть, так как допускает исключение из правил. Дело в том, что объекты могут и должны быть независимыми без каких либо исключений. Такие объекты ещё называют тесто-пригодными.
Так вот есть паттерн MVC.
С - контроллер. В нашем случае это обработка перемещения, масштабирования и прочее.
M - модель. В нашем случае это данные объектов. Фигуры содержат геометрические данные, а инструменты содержат параметры кисти, пера.
V - отображение. В функцию отображения передаются указания на фигуры и характеристики кисти/пера.

Одни и тежи данные мы можем отобразить по разному. К примеру с рамкой выделения или без.
Если мы-бы хранили выделение в графическом объекте, то тогда бы у нас была тесная связь между отображение геометрию и моделью.

Вывод надо разделять. Отказываемся от графического объекта. И разбиваем его на геометрию и инструменты. А способ выделения вынести в параметры функции отображения. Но это неудобно. Если параметров будем много их надо выделить в отдельный объект.
Стиль - который будет содержать данный параметр, а так же кисть и перо.

Так как объект фигуры содержит только геометрию, то его нет смысла тестировать. Зато тестируем геометрическую библиотеку, там просто набор функций без объектов. Поэтому они легко тестируются.

Отображение тоже легко тестируется так как содержит один-два последовательных цикла.

А самое сложное это контролер. Он содержит указатель на фигуру и на стиль. И кучу внутренних функций. Что-бы облегчить тестирование применяем шаблон mutable. Он будет в место нуливых указателей подставлять объекты по умолчанию.

PS. Нет сил корректировать пост, прошу за ошибки простить. Так что до завтрого.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 24.11.2017 в 20:11.
Pavia вне форума Ответить с цитированием
Старый 25.11.2017, 11:25   #12
LV1974
Заблокирован
 
Регистрация: 09.08.2017
Сообщений: 1,136
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Отнюдь. Оптимальнее группировать одинаковые операции в циклы. Суть в том, что основные тормоза идёт за счёт проверок внутри цикла. Если их вынести наружу, то код будет работать быстрее. Помещая Update во внутрь объекта мы выносим цикл по все объектам во вне. Тем сам решаем себя какого либо возможности в ускорении. Зато это больше соответствует стилю или духу ООП.
Кажется мы говорим о разных вещах.
Смотрите сюда:
Код:
    class arc
    {
    public:
        arc() : m_scale(1.0), m_initialized(false) {}
        arc(double x,  double y, 
            double rx, double ry, 
            double a1, double a2, 
            bool ccw=true);

        void init(double x,  double y, 
                  double rx, double ry, 
                  double a1, double a2, 
                  bool ccw=true);

        void approximation_scale(double s);
        double approximation_scale() const { return m_scale;  }

        void rewind(unsigned);
        unsigned vertex(double* x, double* y);

    private:
        void normalize(double a1, double a2, bool ccw);

        double   m_x;
        double   m_y;
        double   m_rx;
        double   m_ry;
        double   m_angle;
        double   m_start;
        double   m_end;
        double   m_scale;
        double   m_da;
        bool     m_ccw;
        bool     m_initialized;
        unsigned m_path_cmd;
    };
Это класс дуги из agg 2.5
Смотрите сколько членов для расчёта!
Чтобы использовать этот класс, надо дублировать основные параметры дуги у себя.
И перед каждой отрисовкой передавать их через конструктор или init(...).
Это очень не рационально.
Также и в GDI и в System.Drawing приходиться вызывать DrawArc(...).

Альтернативный путь - предоставить доступ get/set к основным параметрам класса и предоставить метод Update() для регулярного пересчёта остальных параметров.
Это не только эффективнее, но и проще.

Последний раз редактировалось LV1974; 25.11.2017 в 15:26.
LV1974 вне форума Ответить с цитированием
Старый 25.11.2017, 12:20   #13
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,508
По умолчанию

У меня есть опыт написания текстового редактора (1997 г.)
Я даже графический редактор сделал (1994 г.)

Мой практический опыт в этой теме:
http://programmersforum.ru/showpost....9&postcount=31
Скажу прямо - не получилось. Для этого надо знать линейную алгебру, а я её забыл, потому что учил в 1993-ем году. Надо брать учебник и проходить всё заново... Теперь, даже если надо просто перемножить векторы, самостоятельно это очень трудно (для решения алгебраических задач).
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...
jura_k вне форума Ответить с цитированием
Старый 25.11.2017, 13:21   #14
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
Мой практический опыт в этой теме:
Цитата:
Сообщение от jura_k Посмотреть сообщение
Программа написана под MS-DOS. Чтобы снять скриншоты, я запустил её под Windows 95. Для того, чтобы скопировать все материалы сюда (через флешку), я запустил Windows 2000.
Вот почему умные, грамотные в программировании люди так оторваны от жизни? Сейчас вот любого пацана спроси, как DOS игру-программу запустить на компьютере? Если он вообще знает, что такое DOS, то непременно ответит DOSBox. И ни каких левых систем не надо, ни каких флешек - обычный скриншот:
dosbox.png
kvitaliy вне форума Ответить с цитированием
Старый 25.11.2017, 17:23   #15
LV1974
Заблокирован
 
Регистрация: 09.08.2017
Сообщений: 1,136
По умолчанию

Цитата:
Сообщение от jura_k Посмотреть сообщение
У меня есть опыт написания текстового редактора (1997 г.)
Я даже графический редактор сделал (1994 г.)

Мой практический опыт в этой теме:
http://programmersforum.ru/showpost....9&postcount=31
Скажу прямо - не получилось. Для этого надо знать линейную алгебру, а я её забыл, потому что учил в 1993-ем году. Надо брать учебник и проходить всё заново... Теперь, даже если надо просто перемножить векторы, самостоятельно это очень трудно (для решения алгебраических задач).
Очень даже хороший опыт. Особенно если Вы осмысливали его через концепт ООП и паттерны проектирования, знакомы с архитектурой MVC.
Линейной алгебры не надо бояться. - Основы для вычисления пересечений и проецирования, вспоминаются за пару дней. Ещё день можно потратить на поиск подходящей либы.

Моя проблема - это интересный проект и нормальный заказчик. Вот поэтому-то я и страдаю здесь от безделья и перфекционизма.
LV1974 вне форума Ответить с цитированием
Старый 25.11.2017, 17:30   #16
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

Цитата:
Сообщение от LV1974 Посмотреть сообщение
Моя проблема - это интересный проект и нормальный заказчик. Вот поэтому-то я и страдаю здесь от безделья и перфекционизма.
забить на стартапы. уйти на зарплату в графическую компанию, где нужно работать, а не изобретать.
Alar вне форума Ответить с цитированием
Старый 25.11.2017, 17:42   #17
LV1974
Заблокирован
 
Регистрация: 09.08.2017
Сообщений: 1,136
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Я тоже долго мучился с этим вопросом. А потом взял и разделил на изолированные функции/классы и нет проблем. Теперь сам не понимаю чего я мучился ведь там всё просто, главное захотеть. Вот более сложные вещи да могут потребовать.
Ряд возможностей, такие как композиция, селективность, трансформируемость, каскадные свойства - это семантически ортогональные понятия. Когда добавляешь ещё одну такую способность, то сложность системы увеличивается полиномиально. Приходится добавлять кучу новых методов, членов и расширять старые методы.
Пока я не нашёл серебряной пули для этой проблемы.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Так вот есть паттерн MVC.
С - контроллер. В нашем случае это обработка перемещения, масштабирования и прочее.
M - модель. В нашем случае это данные объектов. Фигуры содержат геометрические данные, а инструменты содержат параметры кисти, пера.
V - отображение. В функцию отображения передаются указания на фигуры и характеристики кисти/пера.

А самое сложное это контролер. Он содержит указатель на фигуру и на стиль. И кучу внутренних функций. Что-бы облегчить тестирование применяем шаблон mutable. Он будет в место нуливых указателей подставлять объекты по умолчанию.
В принципе, для студента достаточно лекции про архитектуру MVC. Вряд ли стоит писать книгу по прочим технологическим секретам.

Однако 10 лет назад, когда я писал LikeView, то отказался от этой схемы. Мне надо было постоянно иметь всё под рукой. Поэтому я сделал контекст управления, по аналогии с классом графического контекста.
Кстати, я так слышал, что разработчики angular сделали примерно тоже самое.

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

Эту тему наверное лучше излагать через семантически ортогональные возможности и способности. Обычно, каждая такая способность даст иерархию классов. Например:
  1. иерархия классов свойств,
  2. иерархия классов компонентов,
  3. иерархия классов команд (для откатов),
  4. иерархия классов действий (для реакций на пользователя),
  5. иерархия классов стилей (кисть, перо, шрифт),
  6. иерархия классов трансформаций,
  7. иерархия классов рукояток (хэндлов), и т.д.

Последний раз редактировалось LV1974; 25.11.2017 в 18:25.
LV1974 вне форума Ответить с цитированием
Старый 25.11.2017, 17:44   #18
LV1974
Заблокирован
 
Регистрация: 09.08.2017
Сообщений: 1,136
По умолчанию

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

+
очень сложно найти хорошего заказчика или работодателя.

кроме этого у меня эргофобия. раньше терпел ВСД. а сейчас уже не молод. не хочу я снова так маяться с бессонными ночами, неврозами и паническими атаками. даже за 300 т.р. не пойду.
мне для жизни достаточно 30 т.р.
а если будет не хватать - пойду метлой махать.

https://www.youtube.com/watch?v=exoMmJhvGOo

Последний раз редактировалось LV1974; 25.11.2017 в 18:10. Причина: +
LV1974 вне форума Ответить с цитированием
Старый 25.11.2017, 18:14   #19
jura_k
gamer
Участник клуба
 
Аватар для jura_k
 
Регистрация: 09.05.2015
Сообщений: 1,508
По умолчанию

Цитата:
Сообщение от kvitaliy Посмотреть сообщение
Вот почему умные, грамотные в программировании люди так оторваны от жизни? Сейчас вот любого пацана спроси, как DOS игру-программу запустить на компьютере? Если он вообще знает, что такое DOS, то непременно ответит DOSBox. И ни каких левых систем не надо, ни каких флешек - обычный скриншот:
Потому что не стоять же "Celeron 333" без дела, а для MS-DOS запускать ТАКОЙ "летательный аппарат"... как Pentium IV со всякой начинкой - жирно.

Между прочим, Celeron не шумит вентилятором, как Pentium IV, - у него его нет. Сдох. Охлаждение пассивное.
И у этого пацана нет за душой 7 системных ящиков б/у за 2000-2010 гг.

Цитата:
Сообщение от LV1974 Посмотреть сообщение
Очень даже хороший опыт. Особенно если Вы осмысливали его через концепт ООП и паттерны проектирования, знакомы с архитектурой MVC.
Нет, я его осмысливал через способы прямого проецирования на координатную плоскость... из 3D - в 2D. И то не получилось. При переходе через "полюс" пришлось "ловить" и менять ориентацию ортогональной тройки векторов. Дальше этого дело не пошло - учиться надо... мозги напрягать.

Цитата:
Сообщение от LV1974 Посмотреть сообщение
Моя проблема - это интересный проект и нормальный заказчик. Вот поэтому-то я и страдаю здесь от безделья и перфекционизма.
К сожалению, тут каждый занимается своей проблемой, которые вообще-то не пересекаются.
Вопросов для разработки куда больше, чем программистов. Я вот учебники читаю.
мой канал на Ютубе: youtube.com/@games-zz3ju/videos/
мой канал на Рутубе: rutube.ru/channel/31423139/videos/
В ожидании Кеши...

Последний раз редактировалось jura_k; 25.11.2017 в 18:30.
jura_k вне форума Ответить с цитированием
Старый 27.11.2017, 10:54   #20
LV1974
Заблокирован
 
Регистрация: 09.08.2017
Сообщений: 1,136
По умолчанию

Иерархии классов интерактивного редактора
Код:
	Иерархии классов интерактивной модели:

1.	Свойства,
 1.1.	Текст,
 1.2.	Число,
 1.3.	Стиль,
 1.4.	Цвет,

2.	Компоненты,
 2.1.	Прямоугольные,
 2.2.	Кривые,
 2.3.	Растровые,
 2.4.	Группы,

3.	Декораторы,
 3.1.	Поля,
 3.2.	Рамки,
 3.3.	Ярлыки,
 3.4.	Заголовки,

4.	Связи,
 4.1.	Стрелки,
 4.2.	Объединения,

5.	Стили,
 5.1.	Кисть,
 5.2.	Перо,
 5.3.	Шрифт,
 5.4.	Стиль текста,
 5.5.	Параметры графики,

6.	Эффекты, 
 6.1.	Буфер,
 6.2.	Размытие,
 6.3.	Тень,
 6.4.	Псевдообъём,

7.	Трансформации,
 7.1.	Аффинные,
 7.2.	Квадратичные,
 7.3.	Конформные,

8.	Рукоятки (хэндлы), 
 8.1.	Прямоугольник,
 8.2.	Углы,
 8.3.	Точки кривых,

9.	Команды (для стека откатов),
 9.1.	Композиция,
 9.2.	Свойства,
 9.3.	Связь,
 9.4.	Стиль,


	Иерархии сервисных классов:

1.	Действия (реакции на пользователя),
 1.1.	Мгновенные,
 1.2.	Трековые,
 1.3.	На выбор,
 1.4.	На вид,

2.	Окна управления,
 2.1.	Основной вид,
 2.2.	Многостраничный вид,
 2.3.	Обзорный вид,
 2.4.	Предпросмотр печати,
 2.5.	Линейки,
 2.6.	Скролбары,

3.	Тулбары,
 3.1.	Свойства,
 3.2.	Примитивы, 
 3.3.	Стили,
 3.4.	Действия,
 3.5.	Виды,

4.	Меню,
 4.1.	Правка,
 4.2.	Вид,
 4.3.	Вставка,
 4.4.	Формат,

5.	Ключевые клавиши,
 5.1.	Действия на модель,
 5.2.	Контекстные (ctrl),
 5.3.	Управление выбором,
 5.4.	Управление видом,


Состав библиотеки:

1.	Базовые классы,
2.	Классы расширения,
3.	Сервисные классы,
4.	Тестовое приложение,
5.	Демонстрационное приложение,
Примерно 80% этих возможностей было реализовано в LikeView.

Последний раз редактировалось LV1974; 27.11.2017 в 11:25.
LV1974 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Геометрия, как найти скалярное произведение? Алексей_2012 Помощь студентам 8 10.11.2014 23:29
Как откосить от информатики? Max1548 Свободное общение 5 25.10.2011 17:18
Как Программно создать раздел E:\ KWN, lnc Общие вопросы Delphi 18 27.08.2009 13:37
как добавить модули в раздел uses kate158 Общие вопросы Delphi 1 25.08.2009 09:52