|
|
|
Простой векторный графический редактор (разбор полётов)16.11.2018, 09:22. Показов 36747. Ответов 127
Метки векторная графика (Все метки)
Всем привет! Меня зовут ashsvis и я программист...
Я пытался бороться с этим "недугом", но эта привычка затягивает меня всё глубже... (шутка) Короче, для тех кто не в теме: я пытаюсь сделать простой векторный графический редактор. Сначала я выпустил цикл статей по этому поводу (см. https://www.cyberforum.ru/blog... tegory389/) Получилась начальная версия редактора (можно забрать по ссылке в статье https://www.cyberforum.ru/blog... g5533.html) Первая версия, она известно какая и, благодаря критике моих более опытных коллег, была несколько переработана, с целью улучшить её (а с какой-же ещё?) и получилась версия вторая (можно забрать по ссылке в статье https://www.cyberforum.ru/blog... g5536.html) После второй версии мне намекнули, что я начал движение вообще не в ту сторону и предложили выложить в отдельную тему, на стол прозектора, так сказать. Что я и делаю. Подключайтесь к обсуждению, господа программисты. Давайте выведем меня на чистую воду... ![]() Добавлено через 3 часа 28 минут [для "затравки" дискуссии] У меня тут появилась мысль, как ни странно, что если попытаться перевести логику работы редактора из WinForms в WPF, то с текущей моделью это будет сделать сложновато. Там ведь (в WPF) всё другое, даже точки Point на основе double...
0
|
|
| 16.11.2018, 09:22 | |
|
Ответы с готовыми решениями:
127
Написать простой графический редактор электрических цепей Простой графический редактор, как сохранять изображение Создать простой векторный графический редактор |
|
|
||
| 17.11.2018, 14:15 [ТС] | ||
|
Обновил репозиторий до текущего состояния:
https://github.com/ashsvis/VectorGraphicsEditor
0
|
||
|
|
|||||||||||||
| 17.11.2018, 15:11 | |||||||||||||
Добавлено через 7 минут https://github.com/ashsvis/Vec... ure.cs#L35 ? Далее https://github.com/ashsvis/Vec... der.cs#L31 Не нужно передавать size или radius в геометрию. Понимаете, геометрия задает только форму. Размеры задаются через Transform. Вся геометрия создается единичного размера. EllipceGeometry, RectangleGeometry - вообще не нужны. Мы же условились, что все примитивные фигуры - через PrimitiveGeometry. Зачем вы опять лепите эти все лишние классы?
0
|
|||||||||||||
|
|
||||||||
| 17.11.2018, 15:43 [ТС] | ||||||||
|
Спасибо за операторы преобразования типа, это ускорит мою работу, сам бы рыл долго...
Потом я вышел из положения, передавая RectangleF для EllipceGeometry, RectangleGeometry, для примитивных тоже сделал... Видимо я не совсем представляю, что в конце будет происходить, то есть передача мышиного прямоугольника в размер фигуры. Видимо мне нужен ещё примерчик (базовый), как будем использовать Matrix.Кстати, я по аналогии соорудил вот что:
Добавлено через 20 минут
0
|
||||||||
|
|
||||
| 17.11.2018, 15:46 | ||||
|
Наследников класса Geometry - только три: PrimitiveGeometry, TextGeometry и PolygoneGeometry. Два из них я уже написал. Вам нужно сделать только третий. Мыслите абстрактно. Геометрия - это форма фигуры. А размеры, позиция и вращение - это Transform.
0
|
||||
|
|
||
| 17.11.2018, 16:22 [ТС] | ||
|
Но когда у меня не было радиуса, круг в тестах рисовался точкой в левом верхнем углу... А как различить между собой квадрат и прямоугольник, если размеры не задавать? Добавлено через 2 минуты Мне для тестов что-то через матрицу нужно соорудить, иначе я не увижу, правильно ли методы работают... Пошёл книжки читать... ![]() Добавлено через 10 минут Убрал размеры из геометрии, репозиторий обновил.
0
|
||
|
|
||||||||
| 17.11.2018, 16:25 | ||||||||
1
|
||||||||
|
|
|
| 17.11.2018, 18:55 [ТС] | |
|
С выводом примитивов вроде разобрался. В тестах выводятся квадрат и круг. Но это если задаёшь одинаковые числа в
Matrix.Scale, а если разные, то получаются прямоугольник и эллипс. С TextGeometry на получается ограничить область текста, чтобы переносил на другую строку. Сейчас в методе применяется Point.Empty и текст выводится в одну строку и отсекается по правому краю, а если ставишь Rectangle с настройками как у примитивов, то текст вообще не выводится. И Matrix.Scale к TextGeometry применять нельзя - текст опять куда-то исчезает...
0
|
|
|
|
|||||||||||||||||||||||||
| 17.11.2018, 21:02 | |||||||||||||||||||||||||
|
Итак, вернемся к нашей модели. Теперь сделаем чуть более сложные вещи. Во-первых, мы знаем, что геометрия определяет не только форму объекта, но и поведение. Квадрат отличается от прямоугольника тем, что его нельзя растягивать произвольным образом. Зафиксируем это в коде. Поскольку поведение зависит от геометрии, то это должно быть прописано в классе Geometry. Для этого, добавим поле AllowedOperations:
Далее, сделаем модификации в классе FigureBuilder. Он должен задавать не только GraphicsPath, но и присваивать AllowedOperations. Вот теперь квадрат будет отличаться от прямоугольника:
Идем далее. Создадим класс Selection, который сможет хранить список выделенных фигур, а также производить операции над ними. Тут внимательно следите за руками. Этот класс тоже является фигурой. И мы его будет отрисовывать также, как и остальные фигуры. Таким образом, у нас не будет каких-то особых средств для отрисовки выделенных объектов. Мы просто добавим новую фигуру, которая будет отрисовывать выделение. Кроме того, при изменении Transform это фигуры, этот Transform будет применяться к выделенным фигурам. И таким образом мы сможем реализовывать перемещение, шкалирование и вращение как одной, так и нескольких выделенных фигур. Класс Selection предлагаю сделать так:
2
|
|||||||||||||||||||||||||
|
|
||||||||
| 18.11.2018, 12:09 [ТС] | ||||||||
|
По идее, это должно происходить в методе Figure.GetTransformedPath()
![]() В матрице я как-то должен манипулировать коэффициентами m11 и m12, чтобы сохранять пропорции для квадрата. по ширине и по высоте и justify. Для этого и есть прямоугольник, который мы не применяем в TextGeometry.
0
|
||||||||
|
|
||||||||||||||
| 18.11.2018, 12:18 | ||||||||||||||
|
В любом случае, это позже. Не зацикливайтесь на этом. Итак медленно все идет. Класс Selection готов? Протестирован? Там нужно исправить:
0
|
||||||||||||||
|
|
|||
| 18.11.2018, 12:34 [ТС] | |||
|
не работают. К тестированию Selection не могу перейти, так как трансформации правильно не работают, что я увижу в тестах - ничего (то есть буду скапливать баги на потом и буду работать со следующим классом модели, не понимая до конца, как работает (и работает ли) уже сделанное. {смайл обезьяна, тыкающая на клавиши} Добавлено через 2 минуты
0
|
|||
|
|
|||
| 18.11.2018, 12:58 | |||
|
0
|
|||
|
|
|||
| 19.11.2018, 05:20 [ТС] | |||
|
то я бы хотел, чтобы ^AllowedOperations.Size уже не позволял рисовать прямоугольник, а рисовать квадрат, вот это я хочу видеть в тестах, которые формируют .bmp файлы. Работу Selection тоже надо проверять визуально (видеть эту рамку, наконец) и где? Тоже в тестах, так как интерфейсную часть пока не написали. Хорошо бы уже в интерфейсной части расставлять наши фигуры по полю редактирования, а следующим этапом работать с Selection и отлаживать его. То есть делать цикл выпуска завершённым. Или я не прав? если будем двигаться такими темпами. Тем более, что свободного времени может и не быть так много, как в предыдущие дни. Так что я предлагаю немножко сделать кода для для интерфейсной части, чтобы хотя бы вытащить фигуры на свет Божий. Добавлено через 7 часов 44 минуты Storm23, мы продолжим "вгрызаться" в эту интереснейшую тему? Я весь внимание...
0
|
|||
|
|
||||||
| 19.11.2018, 08:33 [ТС] | ||||||
|
Создал такой тест для Selection:
И результат этого теста меня не радует...
0
|
||||||
|
|
||||||||
| 19.11.2018, 09:54 | ||||||||
Вникните в смысл класса Seleсtion. Не усложняйте жизнь ненужными подробностями и техническими деталями. Если я вижу, что проблема в принципе решаема, я НЕ реализую этот функционал на данном этапе. Потому что это усложнит и затянет разработку. А первым делом нужно получить MVP (minimum valuable product). А технические (и решаемые в принципе) мелочи - это оставим на доводку продукта. Когда вникните в Seleсtion, пойдем дальше.
0
|
||||||||
|
|
||||||
| 19.11.2018, 11:49 [ТС] | ||||||
|
Storm23,
Скопировал ваш тест для Seletion, чтобы с ним поработать... Всё идет хорошо, но до того как вызываю selection.PushTransformToSelectedFigures (); После этого фигуры исчезают из поля зрения. Начал копать, почему и оказалось, что после применения fig.Transform.Multiply(Transform), когда делал m.Translate(0, 100); (только его), то координата Y получилась 10000.
Чего я такого делаю не правильно?
0
|
||||||
|
|
|
| 19.11.2018, 11:51 | |
|
ashsvis, пожалуйста, внимательно почитайте этот пост
Простой векторный графический редактор (разбор полётов)
0
|
|
|
|
|
| 19.11.2018, 12:09 [ТС] | |
|
Storm23, ой, простите меня... Сейчас же внесу исправления!
![]() Добавлено через 15 минут Да, внёс в рабочий репозиторий. И тест свой я делал всё на одной канве, поэтому и смешение рисунков. Да, времени я изрядно забрал у проекта из-за непроходимой тупости... Понял, осознал...
0
|
|
|
|
|||||||||||
| 19.11.2018, 13:26 | |||||||||||
|
Ок, продолжаем.
Добавим немного вспомогательных методов в Selection. Это такие методы:
В принципе все эти операции можно сделать и через Transform, но мы сделаем эти преобразования более удобными для внешнего кода. Код добавляемых методов:
Также я добавил операцию Skew, которая делает искривление. Также часть операций поддерживает AllowOperations. И если, например Size не разрешено, то метод Scale сделает масштабирование с сохранением аспекта. Обратите внимание на то, что если выделено несколько фигур, то для них разрешены все операции. Это более логично, так делают Paint.NET и Photoshop. Если часть фигур шкалировать, а часть - нет, то это нарушает взаимоотношения между фигурами, по сути портит рисунок. Поэтому, если мы выделяем только квадрат, то он может шкалироваться только с сохранением аспекта. Но если мы выделили несколько квадратов, то они могут шкалироваться произвольным образом. Таким образом, класс Selection предоставляет удобный API для манипулирования фигурами. В принципе ядро системы близко к завершению, и мы будем потихоньку переходить к интерфейсной части. Тесты:
0
|
|||||||||||
|
|
|
| 19.11.2018, 14:06 [ТС] | |
|
Storm23,
наконец, моё любопытство по поводу AllowOperations удовлетворено. ![]() Внёс всё в рабочий репозиторий.
0
|
|
| 19.11.2018, 14:06 | |
|
Помогаю со студенческими работами здесь
40
Векторный редактор карт Как создать векторный редактор? Графический редактор Графический редактор Графический редактор на С# Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности
Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано.
. . .
|
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
|
|
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива
Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
|
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так?
Да, всё верно. Я — искусственный интеллект.
Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
|
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает.
В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше.
Перед запуском проверяем. . .
|
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов.
В Main создаём четыре события. . . .
|