0

我的 silverlight 应用程序中有一个涂鸦 inkpresenter,我以不同的形状多次使用它,我想计算 inkpresenter 的涂鸦百分比,

我的问题是,由于墨水呈现器的形状可以是圆形或多边形,我不知道如何获得可涂鸦表面上可用的单位/像素。

据我了解,actualWidth 和 actualHeight 属性只会通过计算帮助我获得矩形形状

units = uielemnt.Actualwidth * uielement.ActualHeight

但对于服装形状,我不确定实际宽度/高度是如何计算的。

4

1 回答 1

0

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. 从活动列表中删除任何以当前 x 坐标结束的贝塞尔曲线
  3. 计算活动贝塞尔曲线的交点。找到此类交点的下一个 x 坐标。
  4. 让“end x”是下一条线交点的最早点和贝塞尔曲线的下一个开始或停止坐标
  5. 计算从当前 x 到“end x”的区域,然后将当前设置为 end
  6. 重复直到“end x”达到任意曲线的最大 x 坐标

这是计算面积的内部循环:

  1. 通过增加 y 的活动曲线。
  2. 每次通过曲线时,翻转该曲线的原始几何图形的“内部”位。
  3. 每次 y 变化时,设置任何“内部”位,计算前一个贝塞尔曲线和当前贝塞尔曲线之间的面积,并将其添加到总面积

就是这样。

有关 Silverlight 答案的更多详细信息

将 PathGeometry 的段转换为三次贝塞尔近似的公式:

  • BezierSegment:三次控制点为P0、P1、P2、P3(不变)
  • LineSegment:三次控制点为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,然后修改大小和旋转角度
  • Poly...Segment:分成单独的段,然后在每个段上使用上述公式

计算活动贝塞尔曲线的交点:

  • 由于曲线已经在它们的最小值/最大值处分割,每条曲线都是 x 的平滑连续函数,您可以使用这些技术来计算它们的交点
  • 如果您在实际计算交点之前检查 y 最小值/最大值以查看是否有任何可能的重叠,它可以节省一些计算
于 2010-07-16T08:48:57.477 回答