Pay*_*aya 12 .net c# wpf xaml curve
下图说明了我要实现的目标:
http://i53.tinypic.com/14ugfpd.png
基本上我想创建两个Path
彼此"接触"的对象(并行路径).这是用于生成此图像的XAML:
<StackPanel Orientation="Horizontal">
<StackPanel.LayoutTransform>
<ScaleTransform CenterX="0" CenterY="0" ScaleX="15" ScaleY="15" />
</StackPanel.LayoutTransform>
<Grid Margin="-5,0,0,0">
<Path Stroke="Blue">
<Path.Data>
<PathGeometry>M10,10 C20,10 10,20 20,20</PathGeometry>
</Path.Data>
</Path>
<Path Stroke="Red">
<Path.Data>
<PathGeometry>M10,11 C19,10.85 9,20.80 20,21</PathGeometry>
</Path.Data>
</Path>
</Grid>
<Grid Margin="-5,0,0,0">
<Path Stroke="Blue">
<Path.Data>
<PathGeometry>M10,10 C20,10 10,20 20,20</PathGeometry>
</Path.Data>
</Path>
<Path Stroke="Red">
<Path.Data>
<PathGeometry>M10,11 C19,11 9,21 20,21</PathGeometry>
</Path.Data>
</Path>
</Grid>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
第一条曲线具有手动优化的点位置,第二条曲线具有通过考虑行程厚度而容易计算的点位置.你可以看到第二条曲线并不完美,因为两者之间有一个空间.如何以编程方式创建两条完美的"触摸"曲线,而无需手动优化每条曲线(实际上这是不可能的,因为曲线是在代码中生成的)?
简单地说,我Path
在代码中生成一条曲线(resp.),我需要它有两种颜色.所以我认为制作第二个并行Path
可以做到这一点,但调整Geometry
第二个Path
(使它并行)已被证明是有问题的.
平行的直线和曲线由查尔斯Petzold的可能是解决这个问题的方法之一.它实际上工作得很好,但它会使曲线变平,这会在深度缩放时产生视觉效果,当然还有性能缺陷.
然而,该算法不会尝试找到与另一个贝塞尔曲线平行的贝塞尔曲线.该算法完全基于折线:输入是一条或多条折线,输出由每条输入折线的多条折线组成.因此,ParallelPath需要"展平"输入几何体 - 这意味着将整个几何体(包括圆弧和贝塞尔曲线)转换为折线近似.
所以我的一个朋友(数学博士感受器)已经分析了这个问题并且创建(三阶)Bézier曲线的平行曲线非常复杂并且计算成本很高.对于平行曲线的每个点,计算机必须计算如下内容:
(degree 3 polynomial) + (degree 2 polynomial) / sqrt(degree 4 polynomial)
Run Code Online (Sandbox Code Playgroud)
也许有一种方法可以优化这个表达式,但它仍然比标准Bézier曲线计算成本更高(因为平行曲线与原始Bézier曲线完全不同).我希望能够为曲线设置动画,因此这个解决方案可能太昂贵了.这给我们留下了几个选择:
使用Charles Petzold的折线近似,可以产生奇迹,但在深度放大时会出现视觉故障.
根据Charles Petzond的一个推导出我们自己的近似值.使用Bézier曲线而不是线(可能是弧线就足够了).这将解决深度缩放问题,但它可能很难编码(我不知道如何做到这一点).
也许有可能创建像双色画笔之类的东西.这样,我们可以只使用一个Path
来实现所需的结果(如第一张图所示).我没有在任何地方见过它,所以这可能不是一个选择.
我发现了一些非常有趣的链接:
更多信息:
也许是最终解决方案?(来源这里)
...我解决了所有关于Bezier曲线理论的知识,并将未平坦的偏移发展为正确的东西,并且(怪物)记录了Bezier曲线上的A底漆
使第二条路径更宽,并在使用Z-Index时将其滑动到第一条路径下方. http://i51.tinypic.com/2r5vwjk.png
这不起作用,Geometry
必须相应地进行转换.
而不是使用一个四度贝塞尔曲线,为什么不只使用两个二次曲线的复合?你熟悉贝齐尔曲线数学吗?它们在图形方面受到青睐,因为它们在计算上非常便宜.我最近创建了一个程序,在那里我动画细胞运动(只是为了好玩):
该程序可以在高清显示器上轻松运行,100个blob动画和移动.而这一切都是GDI +.
至于并行贝塞尔曲线,根据维基百科,它无法真正完成:http://en.wikipedia.org/wiki/B%C3%A9zier_curve
因此,您可能必须对启发式方法感到满意.
编辑1:
为避免曲线完全随机,为什么不创建每条曲线的轮廓然后填充路径?一条路径的"底部"曲线将是另一条路径的"顶部"曲线.
编辑2:
好的,按照要求,这就是我如何设想可以计算出类似"铁路轨道"的解决方案:
归档时间: |
|
查看次数: |
2901 次 |
最近记录: |