我正在尝试使用
Cubic Hermite Splines绘制图形.我抓住了这个简单的代码,从这个
interpolation methods页面开始.
这是我的代码:
private float hermiteInterpolate(float y0,float y1,float y2,float y3,float mu) { var mu2 = mu * mu; var a0 = -0.5f * y0 + 1.5f * y1 - 1.5f * y2 + 0.5f * y3; var a1 = y0 - 2.5f * y1 + 2f * y2 - 0.5f * y3; var a2 = -0.5f * y0 + 0.5f * y2; var a3 = y1; return (a0 * mu * mu2) + (a1 * mu2) + (a2 * mu) + a3; }
使用此数据(y值,从0到0,x值从0-21均匀分布):
0,0.04448819,0.1102362,0.1338583,0.1811024,0.2283465,0.34343307,0.4645669,0.480315,0.527559,0.6062992,0.6377953,0.7480315
这是结果:
问题是,在图表的某些区域,线条向下.看数据,它永远不会减少.我不知道算法是否应该这样做,但是对于我正在进行的工作,我希望线条永远不会向下(如果我手工绘制图形,我绝不会让它们向下指向) .
所以,
>图表有问题吗?
>算法应该这样做吗?如果是这样,有没有这样的事情发生?
>我尝试过余弦插值,但不喜欢它的结果.
这是实际的图形功能:
public void DrawGraph(IList<float> items) { for (var x = 0; x < Width; x++) { var percentThrough = (float)x / (float)Width; var itemIndexRaw = items.Count * percentThrough; var itemIndex = (int)Math.Floor(itemIndexRaw); var item = items[itemIndex]; var prevIoUsItem = (itemIndex - 1) < 0 ? item : items[itemIndex - 1]; var nextItem = (itemIndex + 1) >= items.Count ? item : items[itemIndex + 1]; var nextNextItem = (itemIndex + 2) >= items.Count ? nextItem : items[itemIndex + 2]; var itemmu = FractionalPart(itemIndexRaw); var pointValue = hermiteInterpolate(prevIoUsItem,item,nextItem,nextNextItem,itemmu); WritePixel(x,(int)(pointValue * Height) - 1,(1 - FractionalPart(pointValue)),false); WritePixel(x,(int)(pointValue * Height),1.0f,(int)(pointValue * Height) + 1,FractionalPart(pointValue),false); } }
解决方法
原文地址:https://www.jb51.cc/csharp/92085.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。