首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF/Silverlight如何计算控件中的总立方单位/像素?

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

Stack Overflow用户
提问于 2010-07-16 04:30:53
回答 1查看 478关注 0票数 0

我在我的silverlight应用程序中有一个scribbale墨水呈现器,我多次使用不同形状的墨水呈现器,我想计算墨水呈现器被涂抹了多少百分比,

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

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

代码语言:javascript
运行
复制
units = uielemnt.Actualwidth * uielement.ActualHeight

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-16 16:48:57

WPF应答

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

Silverlight Answer

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

以下是设置步骤:

  1. 将几何转换为三次贝塞尔曲线(近似圆弧,其他所有曲线都是精确的)
  2. 在x最小值和x maxima
  3. Rearrange坐标处分割所有曲线,以便每条曲线从低x到高x进行排序

在最小x坐标下按x排序,然后按y排序。

下面是主循环:

  1. 将任何开始于当前x坐标处的贝塞尔曲线添加到活动列表中
  2. 从活动列表
  3. 计算活动贝塞尔曲线的交点中移除结束于当前x坐标处的任何贝塞尔曲线。找到这样的曲线的下一个x坐标“intersection.
  4. Let x”是从当前x到"end x“的bezier曲线区域的下一个交点和下一个开始或结束坐标中最早的一个,然后将当前设置为end
  5. 重复,直到"end x”达到任意曲线

的最大x坐标。

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

  1. 以递增y的方式通过活动曲线。
  2. 每次经过曲线时,将该曲线的原始几何图形的"inside“位翻转。
  3. 每次y更改任何"inside”位时,计算前一条贝塞尔曲线与当前曲线之间的面积,并将其添加到总面积

就这样。

有关 answer的更多详细信息

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

  • BezierSegment:三次控制点是P0,P1,P2,P3 (没有三次控制点是P0,P0,P1,P0三次控制点是P0,(P0+2P1)/3,(2P1+P2)/3,Sqrt分成八个,对于每个,在指向圆弧的起点和终点计算单位切向量T0,T1,生成P0的控制点(近似值),+*4/3*(P0+2P1(2)-1)*R,RotationAngle
  • Poly...Segment:+ P1 + T1 * 4/3(Sqrt(2)-1)*R,P1,然后修改大小并将其分解为单独的线段,然后在每个

上使用上述公式

计算活动Bezier曲线的交点:

  • 由于曲线已经在其最小值/最大值处分割,每条曲线都是x的平滑连续函数,因此您可以使用these techniques来计算它们的最小值/最大值如果您在实际计算intersection

之前检查y最小值/最大值以查看是否存在任何可能的重叠,则可以节省一些计算

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3259778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档