.net WPF/Silverlight如何计算控件中的总立方单位/像素?

.net WPF/Silverlight如何计算控件中的总立方单位/像素?,.net,wpf,silverlight,graphics,vector-graphics,.net,Wpf,Silverlight,Graphics,Vector Graphics,我的silverlight应用程序中有一个scribbale inkpresenter,我在不同的形状中多次使用它,我想计算inkpresenter中有多少百分比被涂鸦 我的问题是,由于墨水演示器的形状可以是圆形或多边形,我不知道如何获得可涂写表面上可用的单位/像素 据我所知,actualWidth和actualHeight属性只能通过计算矩形形状来帮助我 units = uielemnt.Actualwidth * uielement.ActualHeight 但是对于肋骨形状,我不确定实际

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

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

据我所知,actualWidth和actualHeight属性只能通过计算矩形形状来帮助我

units = uielemnt.Actualwidth * uielement.ActualHeight

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

WPF答案

在WPF中,您可以只使用几何体。组合以组合笔划几何体,然后调用组合几何体上的GetArea以获得覆盖的总面积

Silverlight回答

在Silverlight中,您没有Geomerty.Combine或Geometry.GetArea,也没有RenderTargetBitmap。因此,在Silverlight中,我认为您必须自己进行计算

以下是设置步骤:

  • 将几何图形转换为三次贝塞尔曲线(近似圆弧,其他均为精确曲线)
  • 在x最小值和x最大值处拆分所有曲线
  • 重新排列坐标,使每条曲线从低x到高x
  • 按第一个坐标的x然后y排序
  • 从最小x坐标开始,无活动曲线段
  • 以下是主循环:

  • 将从当前x坐标开始的任何贝塞尔曲线添加到活动列表中
  • 从活动列表中删除以当前x坐标结束的所有贝塞尔曲线
  • 计算活动贝塞尔曲线的交点。找到该交点的下一个x坐标
  • 设“end x”为贝塞尔曲线的下一条直线交点和下一个起点或终点坐标的最早值
  • 计算从当前x到“末端x”的面积,然后将当前设置为末端
  • 重复此操作,直到“x端”达到任意曲线的macimum x坐标
  • 以下是计算面积的内部循环:

  • 以y递增的方式通过活动曲线
  • 每次通过曲线时,翻转该曲线原始几何体的“内部”位
  • 每次y改变设置的任何“内部”位时,计算上一条贝塞尔曲线和当前曲线之间的面积,并将其添加到总面积中
  • 就这样

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

    将路径几何体的线段转换为立方贝塞尔近似值的公式:

    • Bezier段:立方控制点为P0、P1、P2、P3(无变化)
    • 线段:立方控制点为P0、P0、P1、P1
    • 二次Bezier段:三次控制点为P0,(P0+2P1)/3,(2P1+P2)/3,P2
    • 弧段:分为八分之一,分别计算指向弧的起点和终点处的单位切线向量T0、T1,生成P0、P0+T0*4/3*(Sqrt(2)-1)*R、P1+T1*4/3(Sqrt(2)-1)*R、P1的控制点(近似值),然后使用大小和旋转角度进行修改
    • 多边形…分段:分成单独的分段,然后在每个分段上使用上述公式
    计算活动Bezier曲线的交点:

    • 由于曲线已在其最小值/最大值处分割,因此每个曲线都是x的平滑连续函数,您可以使用它来计算它们的交点
    • 如果在实际计算交叉点之前检查y最小值/最大值以查看是否存在任何可能的重叠,则可以节省一些计算

    “3D”?“立方”?嗯,在我看来,这确实是一个2D问题。也许你可以详细介绍一下“将几何图形转换为三次贝塞尔曲线”和“计算活动贝塞尔曲线的交点”?