2017-04-10 100 views
0

我有要求绘制小弯箭头。我可以计算出箭头的角度,然后我将使用Beziers来定义路径段。但是,我真正想要做的是计算开始和结束之间的不可见曲线路径,并且只在开始之后和结束之前从小距离开始对路径进行笔划。如何在WPF中绘制Bezier曲线的一部分?

这会在开始点和结束点之间的任何对象之间留下适当的间隙。有什么建议么?

+1

中间有一个透明颜色的渐变怎么样? – DrRiisTab

+0

@DrRiisTab这可能会使箭头定位变得棘手。 –

+0

@DrRiisTab:谢谢你的建议。这是可能的,因为你可以调用一个方法来计算沿线的x%点的切线和x,y坐标。我只是觉得定制笔来冲击那部分是非常困难的。 – deadlyvices

回答

0

我想我可能已经碰到了一个可能的解决方案,在很多头部划伤之后。假设你有一条贝塞尔曲线A-B-C-D,其中B是控制点,A是起点和终点。而你要开始和结束从A对峙距离X和d:

  1. 生成初始贝塞尔

  2. 呼叫GetFlattenedPathGeometry将其转换成一系列小段

  3. 总结得到Bezier的长度并将其分成X,从头到尾得到分数长度F

  4. 请致电原始Bezier上的PathGeometry.GetPointAtFractionLength,传入F和1-F。这将产生一个开始/结束点和缩短的贝塞尔

  5. 各端的切向量的开始/结束点加入到切向量得到相应的控制点

  6. 使用生成一个新的贝塞尔这些点应该脱离原来的起点和终点X

查看此方法的任何问题?

+0

有趣。有任何实施的代码和/或图像来表明这一点? –

+0

是的,对于迟到的回复感到抱歉。我还没有任何代码,但是当我接近它时我会发布一些代码。 – deadlyvices

1

箭头通常没有疯狂地弄乱曲线,它们有非常平滑的曲线,靠近端点的t值表现为纯立方体(因为贝塞尔函数在起始坐标处由(1-t)³控制,并在年底t³坐标),所以附近的终点,你可以“guestimate”中的“T”的值,你需要使用立方根插上拿到附近需要一个坐标:

// let's say we want "10% away from the end" 
desiredDistance = 0.9; 

// then the guestimate for the "t" value is simply the cube root of 0.9 
probablyT = Math.pow(desiredDistance, 1/3); 

// and the point we want to cut at is at that "t" value 
cutPoint = get(probablyT, pts); 

// and we can split up the curve into two segments at that "t" value 
curves = split(probablyT, pts); 

// and then keep the segment we need for the arrow 
arrowcurve = curves[0]; 

http://jsbin.com/dovodibaze/edit?js,output这近似于接近终点的距离(以及这清楚地仅在您猜测的终点附近是如何工作的=)

使用probablyT这个值,您可以分割您的原始曲线,绘制您从该分割中获得的“第一条”曲线(覆盖原始t = 0到t =近端段),然后在原始终点。

+0

在C#中获得了一个不是JavaScript的版本?我正在使用WPF。 – deadlyvices

+1

我不这样做,但我完全希望你能够阅读这么简单的代码=)(如果你熟悉WPF API,那么WPF-i-fy应该不会太多工作,在jsbin中的特殊调用是绘制一条曲线和一些圆圈的画布,这不应该太混乱) –

+1

我没有更新jsbin,有些点充当“真正的间隔”定位点,所以你可以玩计算机'大概',并找到最适合您的需求的东西。我实际上解释了这个错误,因为它比纯粹的多维数据集根有更多的工作,然后我们再次编程,而不是数学,所以“如果你90%,使用80%的立方体根”,就编程而言,即使没有一个数学基础,这解释了为什么> _>; –