WPF / Silverlight Как рассчитать общее количество кубических единиц / пикселей в элементе управления? - PullRequest
0 голосов
/ 16 июля 2010

В приложении Silverlight, которое я использую несколько раз в разных формах, есть чернильница с надписью, я хочу подсчитать, сколько процентов чернил было написано,

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

Насколько я понимаю, что свойства actualWidth и actualHeight будут толькопомогите мне с прямоугольной формой, вычислив

units = uielemnt.Actualwidth * uielement.ActualHeight

, но для фигурной фигуры я не уверен, как рассчитывается фактическая ширина / высота.

1 Ответ

0 голосов
/ 16 июля 2010

Ответ WPF

В WPF вы можете просто использовать Geometry.Combine, чтобы объединить геометрию обводки, а затем вызвать GetArea для объединенной геометрии, чтобы покрыть общую площадь.

Ответ Silverlight

В Silverlight у вас нет Geomerty.Combine или Geometry.GetArea, а также отсутствует RenderTargetBitmap.Поэтому в Silverlight я думаю, что вы должны выполнить вычисления самостоятельно.

Вот шаги настройки:

  1. Преобразование геометрии в кубические кривые Безье (приблизительные дуги, все остальное является точным)
  2. Разделить все кривые по их минимумам x и максимумам x
  3. Переставить координаты, чтобы каждая кривая перешла от низкого x к высокому x
  4. Сортировать по x, затем по y первой координаты
  5. Начало с минимальной координаты x без активных сегментов кривой

Вот основной цикл:

  1. Добавьте любые кривые Безье, начинающиеся с текущей координаты x, вактивный список
  2. Удаление из активного списка любых кривых Безье, заканчивающихся на текущей координате х
  3. Вычисление пересечений активных кривых Безье.Найти следующую координату x такого пересечения.
  4. Пусть "конец x" будет самым ранним из пересечения следующей линии и следующей координаты начала или остановки кривой Безье
  5. Вычислить площадь от текущего x до "конца x""затем установите ток на конец
  6. Повторяйте до тех пор, пока" конец х "не достигнет максимальной координаты х любой кривой

Вот внутренний цикл, который вычисляет площадь:

  1. Пройдите активные кривые при увеличении y.
  2. Каждый раз, когда кривая пропускается, переворачивайте бит "inside" для исходной геометрии этой кривой.
  3. Каждый раз, когда y меняет любое "внутри"бит установлен, вычислите область между предыдущей кривой Безье и текущей и добавьте ее в общую общую площадь

Вот и все.

Подробнее о Silverlightответ

Формулы для преобразования сегментов PathGeometry в кубическое приближение Безье:

  • BezierSegment: кубическими контрольными точками являются P0, P1, P2, P3 (без изменений)
  • LineSegment: Cubic контрольные точки: P0, P0, P1, P1
  • QuadraticBezierSegment: Кубические контрольные точки: P0, (P0 + 2P1) / 3, (2P1 + P2) / 3, P2
  • ArcSegment:Разделите на октанты и для каждого вычислите единичные касательные векторы T0, T1 в начале и конце, указывающие на дугу, сгенерируйте контрольные точки (приближение) P0, P0 + T0 * 4/3 * (Sqrt (2) -1) * R,P1 + T1 * 4/3 (Sqrt (2) -1) * R, P1, затем изменить с размером и RotationAngle
  • Поли ... Сегмент: разбить на отдельные сегменты, а затем использовать вышеуказанные формулы для каждого

Вычисление пересечений активных кривых Безье:

  • Поскольку кривые уже разбиты по минимумам / максимумам, каждая из них является гладкой непрерывной функцией x, вы можете использовать эти методы для вычисления их пересечения
  • Можно сэкономить некоторые вычисления, если вы проверите y минимумы / максимумы, чтобы увидеть, есть ли возможное перекрытие перед фактическим вычислением пересечения
...