【发布时间】:2014-08-29 07:56:51
【问题描述】:
简介
我在实现剪辑时发现了一个问题(请参阅this)。
看起来 UIElement.Clip 仍然渲染不可见的部分
渲染相对较小的几何体(仅填充 1920x1200 区域 ~ 2000 条垂直线的线条)需要很多时间。当使用Clip 和移动屏幕外的几何体(以便剪辑应该删除它的重要部分)时,仍然需要相同时间(大约1秒)。
好的,我发现使用 Geometry.Combine 会进行剪辑(在剪辑几何体后,渲染时间会按比例减少)。完美!
问题
Geometry.Combine 不适用于非闭合几何。它产生封闭的几何图形。而且它看起来很丑,连接第一点和最后一点:
问题
如何对非封闭图形执行裁剪(减少要渲染的几何图形数量)?
编辑
这是之前的几何图形(图片中显示的小和平)
{M0; 50L0; 50L1; 53,1395259764657L2; 56,2666616782152L3; 59,3690657292862L4; 62,4344943582427L5; 65,4508497187474L6; 68,4062276342339L7; 71,2889645782536L8; ...
之后
{F1M54,9999923706055;34,5491371154785L53,9999885559082;37,5655174255371 53,0000114440918;40,6309471130371 52,000,30371 52,00006076293946p>4762935876p;
通知一开始的变化,是M 0;50 L ...,变成F 1 M 55;34 L ...
F1 表示NonZero 填充
确定一个点是否在路径的填充区域中的规则,方法是从该点向任意方向无限远地绘制一条射线,然后检查形状的一部分与射线相交的位置。从 0 开始,每次一条线段从左到右穿过射线时加一,每次路径段从右到左穿过射线时减一。在计算交叉点后,如果结果为零,则该点位于路径之外。否则,它在里面。
我完全不知道这意味着什么。但也许它很重要?
编辑
我应该一直在看字符串的结尾。 Path.Data末尾有z,表示图形已关闭。
奇怪的是,尝试删除 z(通过使用 Geometry.ToString()/Geometry.Parse() 组合)不起作用。经过一番调查,我发现Combine 产生的物理封闭数字(命令L x;y,其中x;y 是最左边的点)。最糟糕的是它并不总是最后一点,因此在解析之前简单地删除最后一个L x;y 也不起作用。 =(
编辑
演示问题的示例:
Xaml:
<Path x:Name="path" Stroke="Red"/>
代码:
var geometry1 = new RectangleGeometry(new Rect(100, 100, 100, 100));
var geometry2 = new PathGeometry(new[] { new PathFigure(new Point(0,0), new[] {
new LineSegment(new Point(300, 300), true),
new LineSegment(new Point(300, 0), true),
}, false) });
//path.Data = geometry1;
//path.Data = geometry2;
//path.Data = Geometry.Combine(geometry1, geometry2, GeometryCombineMode.Intersect, null);
geometry1和geometry2的图片:
结果Combine:
可以看到剪裁后2行变成3行,调试证明:
{F1M100;100L200;100 200;200 100;100z}
注意,不只是z,最后还有100;100点,连接起点。
【问题讨论】:
-
您能否分享一些针对同一问题的工作代码?
-
@pushpraj,见编辑。
-
好的,请给我一些时间。这里有点晚了,希望我明天之前回复你不会介意。
-
Geometry.Combine 创建一个形状而不是路径(据我对msdn.microsoft.com/en-us/library/… 的理解),如果不关闭它,您无法从路径中创建形状(查看您的结果)我不知道是否有是合并几何的给定方法,但我认为 geometry.Combine 是错误的开始。
-
@SebastianL 看看
Geometry.Combine方法的返回类型。它不会创建一个形状,但实际上是一个PathGeometry。但是,这并不意味着Combine不会自动关闭生成的几何图形,因此这里的方法是错误的。