Нарисуйте движущуюся точку на фиксированной ничьей - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь сделать следующее:

  1. Открыть новую форму и нарисовать несколько линий и дуг (это работает хорошо).
  2. Когда происходит событие, новая координата (x1, y1) вычисляется, и по этой координате должен быть нарисован маленький круг.
  3. Когда происходит следующее событие, в (x2, y2) должен быть нарисован маленький круг, и первый круг должен исчезнуть , сохраняя линии и дуги, нарисованные на шаге 1.

Как удалить первый круг, сохранив все остальные? Спасибо

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Вы не можете так думать, потому что графика работает как MSPaint (двумерный массив пикселей, и когда он рисуется, он рисуется), а не Adobe Photoshop (слои или объекты, которые можно перемещать независимо)

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

Я знаю, что это кажется расточительным, и вы, вероятно, могли бы погрузиться в механизм сохранения пикселей, которые вы нарисовали при рисовании первого круга, и восстановить их, чтобы стереть круг, но это гораздо сложнее, чем просто бросить все это и начинать каждый раз заново

0 голосов
/ 23 февраля 2020

Как только круг нарисован, удалить его невозможно. Итак, вам нужно очистить весь холст с цветом фона и перерисовать все.

Итак, вам нужно:

  1. Придумать кучу «фигур» классы для представления каждой линии, каждого ковчега и каждого круга. Вероятно, все они будут производными от некоторого общего базового класса «Shape», который предлагает методы, общие для всех фигур, например, метод рисования фигуры на холсте.

  2. Создание объектов из этих классов, чтобы представить фигуры, которые должны быть нарисованы на экране, и сохранять эти объекты в списке на протяжении всего жизненного цикла приложения.

  3. Когда происходит событие, вы вносите любые изменения к вашим фигурам (в вашем случае удалите круг и добавьте еще один круг или, что более вероятно, измените координаты существующего круга, не удаляя его и не вставляя его снова в список), а затем необходимо сделать недействительным холст элемент управления, который вы предположительно используете для рисования (поиск «Недействительный» для документации), чтобы заставить холст перекрашиваться.

  4. Вы переопределяете метод рисования элемента управления canvas так, Что касается рисования: сначала вы очищаете элемент управления от его цвета фона, а затем выполняете итерацию Список фигур, вызывающий каждую фигуру для рисования на холсте.

Конечно, это вызовет мерцание; если это неприемлемо, то вам необходимо прочитать о том, как реализовать «двойную буферизацию» (найдите ее) для устранения мерцания.

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

...