精华内容
下载资源
问答
  • achartengine实现平滑曲线

    千次阅读 2015-05-18 22:35:42
    上一篇文章我们通过getLineChartView来实现了折线...而通过查看API我们发现achartengine还提供了一个getCubeLineChartView来获取一个显示平滑曲线的view,使用起来和获取普通折线图没有太大的区别ChartFactory.getCubeL

    上一篇文章我们通过getLineChartView来实现了折线图的显示

    ChartFactory.getLineChartView(mContext, dataset, renderer);

    而通过查看API我们发现achartengine还提供了一个getCubeLineChartView来获取一个显示平滑曲线的view,使用起来和获取普通折线图没有太大的区别

    ChartFactory.getCubeLineChartView(mContext, dataset, renderer, 0.3F);

    这里多了最后一个设置平滑度的系数,效果图如下:
    这里写图片描述
    通过观察效果图我们发现曲线并没有经过我们设置的点,怎么回事,我们的程序有BUG了?显然并不是。在解释这个情况之前,我们需要理解一个概念:贝塞尔曲线

    这里我假设你已经大概浏览了维基百科的内容,因此我们知道贝塞尔曲线必过两个端点,并且受控制点控制,achartengine在绘制平滑曲线的时候使用的三阶贝塞尔曲线(安卓在Path.java这个类中只提供了二阶quadTo和三阶cubicTo贝塞尔曲线),这里引用一下维基百科上的图片可以更加直观的展现三阶贝塞尔曲线的绘制过程
    三阶贝塞尔曲线
    通过观察上图我们发现三阶贝塞尔曲线必过P0和P3点,受P1和P2点控制,好了概念介绍完毕,我们就可以来解释一下为什么achartengine的平滑曲线没有经过数据点了。

    在achartengine的源码CubicLineChart.java中

      protected void drawPath(Canvas canvas, List<Float> points, Paint paint, boolean circular) {
        Path p = new Path();
        float x = points.get(0);
        float y = points.get(1);
        p.moveTo(x, y);
    
        int length = points.size();
        if (circular) {
          length -= 4;
        }
    
        Point p1 = new Point();
        Point p2 = new Point();
        Point p3 = new Point();
        for (int i = 0; i < length; i += 2) {
          int nextIndex = i + 2 < length ? i + 2 : i;
          int nextNextIndex = i + 4 < length ? i + 4 : nextIndex;
          calc(points, p1, i, nextIndex, mSecondMultiplier);
          p2.setX(points.get(nextIndex));
          p2.setY(points.get(nextIndex + 1));
          calc(points, p3, nextIndex, nextNextIndex, mFirstMultiplier);
          // From last point, approaching x1/y1 and x2/y2 and ends up at x3/y3
          p.cubicTo(p1.getX(), p1.getY(), p2.getX(), p2.getY(), p3.getX(), p3.getY());
        }
       ...//省略部分代码
        canvas.drawPath(p, paint);
      }

    其中P对应上图中的P0,而P1,P2,P3依次对应贝塞尔曲线的P1,P2,P3,这里需要说明一下的是,P1和P3是根据平滑度系数计算得出的点,而P2则是我们自己设置的点,根据贝塞尔曲线公式,曲线是不会经过P2的,因为我们的数据点在贝塞尔曲线中充当了控制点的角色。这就解释了为什么我们使用getCubeLineChartView的时候曲线没有经过数据点。
    有些聪明的同学可能会立即反应,如果我们将数据点设置为曲线的端点就可以让曲线经过数据点了,因为贝塞尔曲线是必过端点的,这里我不建议这样做,因为这样绘制出来的曲线会非常难看,喜欢动手的同学可以自己试一下

    展开全文
  • 通过多点平滑曲线的实现

    千次阅读 2020-07-20 11:46:26
    通过多点平滑曲线的实现通过多点平滑曲线的实现1 在连续两点之间使用三次贝塞尔曲线来绘制.2 为了保证两段贝塞尔之间的圆滑,连接点对应的两个控制点与曲线相切. 通过多点平滑曲线的实现 ​ 大家都知道使用贝塞尔曲线...

    通过多点平滑曲线的实现

    通过多点平滑曲线的实现

    ​ 大家都知道使用贝塞尔曲线算法来画曲线,但是如果想经过特定的一系列点来画曲线,只使用普通的贝塞尔算法就不够用了.

    ​ 通过参考网上文章:https://www.jianshu.com/p/64305821087a
    ​ 确定了实现方法要点:
    1 在连续两点之间使用三次贝塞尔曲线来绘制.
    2 为了保证两段贝塞尔之间的圆滑,连接点对应的两个控制点与曲线相切.

    然后剩下的问题就是确定每个点所连接点的角度,参考上面的文章实现功能,但是发现这篇文章确定控制点角度的是通过计算斜率来实现.这样连续两点X轴相等的时候,就会出现问题.它所提供的算法只适应X单向增长的环境.如果需要普遍适应,需要进一步的处理,其后虽然实现适应性,但是斜率的计算非常不清晰不利于调整绘制曲线的样式.
    ​ 计算斜率,就是确定每个点法线的角度.发现使用向量来计算法线,更加便捷和清晰.
    ​ 将连续的三点{p1 , p2 ,p3} 以p1点为原点,获得两个向量:
    ​ v1 = p1->p2
    ​ v2 = p1 ->p3
    ​ 做v1 v2的和:
    v3 = v1 + v2
    ​ v3加在v1与v2之间,完全符合p1点法线的要求.由于p1点的切线斜率受到v1向量的影响大,v2向量的影响小,最后确定p1点的切线向量公式为:
    ​ v3 = 2v1 + v2
    ​ p1点前后两个控制点,在一条直线上,那么另外一个控制点的向量就是简单的 -v3
    ​ 然后根据p1点前后两个线段长度决定两个权值l1 和 l2
    ​ 将v3单位化
    ​ 获得p1的两个控制点:
    ​ p1_forward = p1 + l1 * v3
    ​ p1_backward = p1 - l2
    v3
    ​ 按照这个方面获得所有点的控制点.
    ​ 然后使用贝塞尔方法,依次绘制曲线.
    ​ 每个三次贝塞尔曲线的序列为[p1,p1_forward ,p2_backward,p2]
    代码为python实现,csdn下载中搜"通过多点平滑曲线的python实现"

    在这里插入图片描述

    以后需要完善的有两个方面:

    1 实现曲线的闭合.现在闭合点没有圆滑过渡.并不能简单后点循环接到前点来计算斜率,需要一直循环下去直到找到斜率误差小于一定值的点停止.

    2 相邻非常近的点,在实现的时候是否给合并处理.需要在实现中加入精度参数.

    贝塞尔算法的实现来自于:

    https://github.com/TheAlgorithms/Python/blob/master/graphics/bezier_curve.py

    最后补充一下,这种方法实现三维的连续曲线也是可以的,只要找到三维的贝塞尔算法实现,然后把上面的二维的向量改为三维向量就可以了.

    展开全文
  • 详细注解代码里面有,就不一一说明了,说下需要注意的事项: renderer.setPanEnabled(true, false);// 设置横坐标可以滑动,纵坐标不可以 renderer.setZoomEnabled(false, false);...圆滑单曲线: /** * 圆滑
                


    详细注解代码里面有,就不一一说明了,说下需要注意的事项:

    <span style="font-size:24px;">renderer.setPanEnabled(true, false);// 设置横坐标可以滑动,纵坐标不可以
    renderer.setZoomEnabled(false, false);// 直接设置setZoomEnabled(false);不管用</span>

    关键代码:

    圆滑单曲线:

    	/**
    	 * 圆滑单曲线
    	 * 
    	 * @param context
    	 * @param
    	 * @param tag
    	 * @return
    	 */
    	public View getLineChartView(Context context, ArrayList<Double> temperatureLists) {
    		// 构造显示用渲染图
    		XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();
    		// 曲线图的格式,包括颜色,值的范围,点和线的形状等等
    		renderer.setBackgroundColor(Color.parseColor("#efefef"));// 背景色,灰白色
    		renderer.setApplyBackgroundColor(true);// 设置背景颜色生效
    
    		renderer.setMarginsColor(Color.parseColor("#efefef"));// // 边框外侧颜色
    		renderer.setPanEnabled(true, false);// 设置X轴和Y轴是否可以滑动
    		renderer.setXAxisMin(0);// 设置X轴起点
    		renderer.setXAxisMax(24);// 设置X轴最大点
    		renderer.setPanLimits(new double[] { 0, 30, 0, 0, });// 坐标滑动上、下限,
    		renderer.setLabelsTextSize(20f);// 图表标题字体大小:20
    		renderer.setMargins(new int[] { 20, 55, 15, 5 });// 图形4边距
    		renderer.setYAxisMin(-30);// 设置Y轴起点
    		renderer.setXLabels(0);// 设置X轴不显示数字(改用我们手动添加的文字标签)
    		renderer.setZoomEnabled(false, false);// 设置不可放大缩小
    
    		renderer.setShowGrid(true); // 设置网格显示
    		renderer.setGridColor(Color.parseColor("#eeeeee"));
    		renderer.setPointSize(5f);// 每个坐标点的大小
    		Align align = renderer.getYAxisAlign(0);
    		renderer.setYLabelsAlign(align);
    		renderer.setYLabelsColor(0, Color.BLACK);
    		renderer.setXLabelsColor(Color.BLACK);// 设置轴标签颜色
    		renderer.setYLabels(13);
    		// renderer.setYAxisMin(10);
    		renderer.setYAxisMax(40);// 设置Y轴最大点
    		renderer.setAxesColor(Color.BLACK);// 设置XY轴颜色
    		renderer.setYLabelsAlign(Align.RIGHT);
    		renderer.addYTextLabel(30, String.valueOf("30"));
    		renderer.addYTextLabel(25, String.valueOf("25"));
    		renderer.addYTextLabel(20, String.valueOf("20"));
    		renderer.addYTextLabel(15, String.valueOf("15"));
    		renderer.addYTextLabel(10, String.valueOf("10"));
    		renderer.addYTextLabel(5, String.valueOf("5"));
    		renderer.addYTextLabel(0, String.valueOf("0"));
    		renderer.addYTextLabel(-5, String.valueOf("-5"));
    		renderer.addYTextLabel(-10, String.valueOf("-10"));
    		renderer.addYTextLabel(-15, String.valueOf("-15"));
    		renderer.addYTextLabel(-20, String.valueOf("-20"));
    		renderer.addYTextLabel(-25, String.valueOf("-25"));
    		renderer.addYTextLabel(-30, String.valueOf("-30"));
    		int j = 0;
    		for (int i = 0; i < 10; i++) {
    			j++;
    			// String name = map.get("name").getName().toString();
    			renderer.addTextLabel(j, j + "");
    		}
    
    		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    		// 保存点集数据 ,包括每条曲线的X,Y坐标
    
    		XYSeries series = new XYSeries("温度");
    		for (int i = 0; i < temperatureLists.size(); i++) {
    			series.add(Double.valueOf(i + ""), Double.valueOf(temperatureLists.get(i)));
    
    		}
    		dataset.addSeries(series);
    
    		XYSeriesRenderer xyRenderer = new XYSeriesRenderer();
    		xyRenderer.setColor(Color.parseColor("#007aa4"));// 深蓝色
    		xyRenderer.setLineWidth(2f);// 设置线的宽度
    		xyRenderer.setDisplayChartValues(true);// 在柱子顶端显示数值
    		xyRenderer.setChartValuesTextSize(18f);
    		xyRenderer.setDisplayChartValuesDistance(30);
    		xyRenderer.setPointStyle(PointStyle.DIAMOND);// 设置点的样式
    		xyRenderer.setFillBelowLine(true);
    		xyRenderer.setFillBelowLineColor(Color.parseColor("#66FFB040"));
    		xyRenderer.setFillPoints(true);
    
    		renderer.addSeriesRenderer(xyRenderer);
    
    		return ChartFactory.getCubeLineChartView(context, dataset, renderer, 0.33f);
    	}

    温度柱状图:
    	public View executeMy(Context context) {
    		double[] minValues = new double[] { -24, -19, -10, -1, 7, 12, 15, 14, 9, 1, -11, -16 };
    		double[] maxValues = new double[] { 7, 12, 24, 28, 33, 35, 37, 36, 28, 19, 11, 4 };
    
    		XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
    		RangeCategorySeries series = new RangeCategorySeries("Temperature");
    		int length = minValues.length;
    		for (int k = 0; k < length; k++) {
    			series.add(minValues[k], maxValues[k]);
    		}
    		dataset.addSeries(series.toXYSeries());
    		int[] colors = new int[] { Color.CYAN };
    		XYMultipleSeriesRenderer renderer = buildBarRenderer1(colors);
    		renderer.setBackgroundColor(Color.parseColor("#efefef"));// 背景色,灰白色
    		renderer.setApplyBackgroundColor(true);// 设置背景颜色生效
    
    		renderer.setMarginsColor(Color.parseColor("#efefef"));// // 边框外侧颜色
    
    		setChartSettings1(renderer, "Monthly temperature range", "Month", "Celsius degrees", 0.5,
    				12.5, -30, 45, Color.BLACK, Color.BLACK);
    		renderer.setPanEnabled(true, false);// 设置横坐标可以滑动,纵坐标不可以
    		renderer.setZoomEnabled(false, false);// 直接设置setZoomEnabled(false);不管用
    
    		renderer.setPanLimits(new double[] { 0, 31, 0, 0, });// 坐标滑动上、下限
    		renderer.setBarWidth(30);// 柱状图的宽度
    		renderer.setBarSpacing(-3.9f);// 柱状图的间距
    		renderer.setXLabels(0);
    		renderer.setYLabels(10);
    
    		for (int i = 0; i < 32; i++) {
    			renderer.addXTextLabel(i, i + "日");
    		}
    
    		renderer.addYTextLabel(-25, "Very cold");
    		renderer.addYTextLabel(-10, "Cold");
    		renderer.addYTextLabel(5, "OK");
    		renderer.addYTextLabel(20, "Nice");
    
    		renderer.setYLabelsColor(0, Color.BLACK);
    		renderer.setXLabelsColor(Color.BLACK);// 设置轴标签颜色
    
    		renderer.setMargins(new int[] { 30, 70, 10, 0 });// 图形4边距
    		renderer.setYLabelsAlign(Align.RIGHT);
    		SimpleSeriesRenderer r = renderer.getSeriesRendererAt(0);
    		r.setDisplayChartValues(true);
    		r.setColor(Color.parseColor("#007aa4"));// 深蓝色
    		r.setChartValuesTextSize(12);
    		r.setChartValuesSpacing(-3.9f);
    		r.setGradientEnabled(true);
    		r.setGradientStart(-20, Color.BLUE);// 柱状图渐变开始颜色
    		r.setGradientStop(30, 0xffFF5809);// 柱状图渐变结束颜色
    		// r.setColor(Color.GREEN);
    		return ChartFactory.getRangeBarChartView(context, dataset, renderer, Type.DEFAULT);
    		// return ChartFactory.getRangeBarChartIntent(context, dataset,
    		// renderer, type, activityTitle)
    	}

    我们一般情况下都是在自己的界面中定义曲线图,所以在最后返回的是下面这一句返回值类型是View:
    return ChartFactory.getRangeBarChartView(context, dataset, renderer, Type.DEFAULT);
    但是官方的是,并返回Intent,直接startActivity这个Intent就可以了:
    return ChartFactory.getRangeBarChartIntent(context, dataset,renderer, type, activityTitle);
    但是主要:如果要用官方的这个要现在Manifest中定义GraphicalActivity这个activity,否则会包空指针问题
    <activity android:name="org.achartengine.GraphicalActivity" />


    最后附上Achartengine的官方demo下载地址:

    展开全文
  • C语言平滑曲线函数

    千次阅读 2019-06-12 14:00:20
    ///////线性3点拟合平滑 void linearSmooth3 ( u8 in[], u8 out[], int N ) { int i; if ( N < 3 ) { for ( i = 0; i <= N - 1; i++ ) { out[i] = in[i]; } ...

        ///线性3点拟合平滑
     void linearSmooth3 ( u8  in[], u8  out[], int N )
    {
        int i;
        if ( N < 3 )
        {
            for ( i = 0; i <= N - 1; i++ )
            {
                out[i] = in[i];
            }
        }
        else
        {
            out[0] = ( 5 * in[0] + 2 * in[1] - in[2] ) / 6;

            for ( i = 1; i <= N - 2; i++ )
            {
                out[i] = ( in[i - 1] + in[i] + in[i + 1] ) / 3;
            }

            out[N - 1] = ( 5 * in[N - 1] + 2 * in[N - 2] - in[N - 3] ) / 6;
        }
    }

    //5点平滑

    void linearSmooth5 ( u8 in[], u8 out[], int N )
    {
        int i;
        if ( N < 5 )
        {
            for ( i = 0; i <= N - 1; i++ )
            {
                out[i] = in[i];
            }
        }
        else
        {
            out[0] = ( 3 * in[0] + 2 * in[1] + in[2] - in[4] ) / 5;
            out[1] = ( 4 * in[0] + 3 * in[1] + 2 * in[2] + in[3] ) / 10;
            for ( i = 2; i <= N - 3; i++ )
            {
                out[i] = ( in[i - 2] + in[i - 1] + in[i] + in[i + 1] + in[i + 2] ) / 5;
            }
            out[N - 2] = ( 4 * in[N - 1] + 3 * in[N - 2] + 2 * in[N - 3] + in[N - 4] ) / 10;
            out[N - 1] = ( 3 * in[N - 1] + 2 * in[N - 2] + in[N - 3] - in[N - 5] ) / 5;
        }
    }

    //7点平滑

    void linearSmooth7 ( u8 in[], u8 out[], int N )
    {
        int i;
        if ( N < 7 )
        {
            for ( i = 0; i <= N - 1; i++ )
            {
                out[i] = in[i];
            }
        }
        else
        {
            out[0] = ( 13 * in[0] + 10 * in[1] + 7 * in[2] + 4 * in[3] +
                      in[4] - 2 * in[5] - 5 * in[6] ) / 28;

            out[1] = ( 5 * in[0] + 4 * in[1] + 3 * in[2] + 2 * in[3] +
                      in[4] - in[6] ) / 14;

            out[2] = ( 7 * in[0] + 6 * in [1] + 5 * in[2] + 4 * in[3] +
                      3 * in[4] + 2 * in[5] + in[6] ) / 28;

            for ( i = 3; i <= N - 4; i++ )
            {
                out[i] = ( in[i - 3] + in[i - 2] + in[i - 1] + in[i] + in[i + 1] + in[i + 2] + in[i + 3] ) / 7;
            }

            out[N - 3] = ( 7 * in[N - 1] + 6 * in [N - 2] + 5 * in[N - 3] +
                          4 * in[N - 4] + 3 * in[N - 5] + 2 * in[N - 6] + in[N - 7] ) / 28;

            out[N - 2] = ( 5 * in[N - 1] + 4 * in[N - 2] + 3 * in[N - 3] +
                          2 * in[N - 4] + in[N - 5] - in[N - 7] ) / 14;

            out[N - 1] = ( 13 * in[N - 1] + 10 * in[N - 2] + 7 * in[N - 3] +
                          4 * in[N - 4] + in[N - 5] - 2 * in[N - 6] - 5 * in[N - 7] ) / 28;
        }
    }

    /二次函数5点拟合平滑
    void quadraticSmooth5(u8 in[], u8 out[], int N)
    {
        int i;
        if ( N < 5 )
        {
            for ( i = 0; i <= N - 1; i++ )
            {
                out[i] = in[i];
            }
        }
        else
        {
            out[0] = ( 31 * in[0] + 9 * in[1] - 3 * in[2] - 5 * in[3] + 3 * in[4] ) / 35;
            out[1] = ( 9 * in[0] + 13 * in[1] + 12 * in[2] + 6 * in[3] - 5 *in[4]) / 35;
            for ( i = 2; i <= N - 3; i++ )
            {
                out[i] = ( - 3 * (in[i - 2] + in[i + 2]) +
                          12 * (in[i - 1] + in[i + 1]) + 17 * in[i] ) / 35;
            }
            out[N - 2] = ( 9 * in[N - 1] + 13 * in[N - 2] + 12 * in[N - 3] + 6 * in[N - 4] - 5 * in[N - 5] ) / 35;
            out[N - 1] = ( 31 * in[N - 1] + 9 * in[N - 2] - 3 * in[N - 3] - 5 * in[N - 4] + 3 * in[N - 5]) / 35;
        }
    }

    //7点
    void quadraticSmooth7(u8 in[], u8 out[], int N)
    {
        int i;
        if ( N < 7 )
        {
            for ( i = 0; i <= N - 1; i++ )
            {
                out[i] = in[i];
            }
        }
        else
        {
            out[0] = ( 32 * in[0] + 15 * in[1] + 3 * in[2] - 4 * in[3] -
                      6 * in[4] - 3 * in[5] + 5 * in[6] ) / 42;

            out[1] = ( 5 * in[0] + 4 * in[1] + 3 * in[2] + 2 * in[3] +
                      in[4] - in[6] ) / 14;

            out[2] = ( 1 * in[0] + 3 * in [1] + 4 * in[2] + 4 * in[3] +
                      3 * in[4] + 1 * in[5] - 2 * in[6] ) / 14;
            for ( i = 3; i <= N - 4; i++ )
            {
                out[i] = ( -2 * (in[i - 3] + in[i + 3]) + 3 * (in[i - 2] + in[i + 2]) + 6 * (in[i - 1] + in[i + 1]) + 7 * in[i] ) / 21;
            }
            out[N - 3] = ( 1 * in[N - 1] + 3 * in [N - 2] + 4 * in[N - 3] + 4 * in[N - 4] + 3 * in[N - 5] + 1 * in[N - 6] - 2 * in[N - 7] ) / 14;

            out[N - 2] = ( 5 * in[N - 1] + 4 * in[N - 2] + 3 * in[N - 3] +2 * in[N - 4] + in[N - 5] - in[N - 7] ) / 14;

            out[N - 1] = ( 32 * in[N - 1] + 15 * in[N - 2] + 3 * in[N - 3] -4 * in[N - 4] - 6 * in[N - 5] - 3 * in[N - 6] + 5 * in[N - 7] ) / 42;
        }
    }

    /**三次函数拟合平滑 */
    void cubicSmooth5 ( u8 in[], u8 out[], int N )
    {

        int i;
        if ( N < 5 )
        {
            for ( i = 0; i <= N - 1; i++ )
                out[i] = in[i];
        }

        else
        {
            out[0] = (69 * in[0] + 4 * in[1] - 6 * in[2] + 4 * in[3] - in[4]) / 70;
            out[1] = (2 * in[0] + 27 * in[1] + 12 * in[2] - 8 * in[3] + 2 * in[4]) / 35;
            for ( i = 2; i <= N - 3; i++ )
            {
                out[i] = (-3 * (in[i - 2] + in[i + 2])+ 12 * (in[i - 1] + in[i + 1]) + 17 * in[i] ) / 35;
            }
            out[N - 2] = (2 * in[N - 5] - 8 * in[N - 4] + 12 * in[N - 3] + 27 * in[N - 2] + 2 * in[N - 1]) / 35;
            out[N - 1] = (- in[N - 5] + 4 * in[N - 4] - 6 * in[N - 3] + 4 * in[N - 2] + 69 * in[N - 1]) / 70;
        }
        return;
    }

    void cubicSmooth7(u8 in[], u8 out[], int N)
    {
        int i;
        if ( N < 7 )
        {
            for ( i = 0; i <= N - 1; i++ )
            {
                out[i] = in[i];
            }
        }
        else
        {
            out[0] = ( 39 * in[0] + 8 * in[1] - 4 * in[2] - 4 * in[3] +1 * in[4] + 4 * in[5] - 2 * in[6] ) / 42;
            out[1] = ( 8 * in[0] + 19 * in[1] + 16 * in[2] + 6 * in[3] -4 * in[4] - 7* in[5] + 4 * in[6] ) / 42;
            out[2] = ( -4 * in[0] + 16 * in [1] + 19 * in[2] + 12 * in[3] + 2 * in[4] - 4 * in[5] + 1 * in[6] ) / 42;
            for ( i = 3; i <= N - 4; i++ )
            {
                out[i] = ( -2* (in[i - 3] + in[i + 3]) +3* (in[i - 2] + in[i + 2]) +6* (in[i - 1] + in[i + 1]) + 7* in[i] ) / 21;
            }
            out[N - 3] = ( -4* in[N - 1] + 16* in [N - 2] + 19* in[N - 3] +12* in[N - 4] + 2* in[N - 5] - 4* in[N - 6] + 1* in[N - 7] ) / 42;
            out[N - 2] = ( 8* in[N - 1] + 19* in[N - 2] + 16* in[N - 3] + 6* in[N - 4] - 4* in[N - 5] - 7* in[N - 6] + 4* in[N - 7] ) / 42;
            out[N - 1] = ( 39* in[N - 1] + 8* in[N - 2] - 4* in[N - 3] -4* in[N - 4] + 1* in[N - 5] + 4* in[N - 6] - 2* in[N - 7] ) / 42;
        }
    }

    展开全文
  • Qt通过鼠标或者触屏,实时绘制平滑曲线,通常有两种方式实现:矢量绘图和非矢量绘图,这两种画线方式从实现上有些不同,其原理也不太一样,稍后会详细介绍。而鼠标或者触屏画线也不大一样,通常如果只实现鼠标画线...
  • 曲线平滑算法

    万次阅读 多人点赞 2018-08-10 23:57:01
    所以研究了线条的平滑算法,经研究查阅资料,可以使用三次B样条曲线方程对线条进行平滑处理,而平滑处理可分为近似拟合和插值拟合两种,两种拟合处理各有其优缺点,以下会说明,可根据实际业务需要进行选取。...
  • 若干点连接成平滑曲线

    千次阅读 2015-07-20 16:25:00
    最近折线图,想把几个点平滑处理,以前过,但是不记得怎么搞了,在网上查一下,发现有人已经给出来代码了,具体如下:a(35293 , 61916 , 36557 , 26076 , 20800 , 52524 , 83579 ,156257, 478688 ,2218997) ...
  • 因最近需要对多个无规则的点规划出一条圆滑曲线,现找到的方法是使用贝塞尔曲线进行规划。在此,先简单了解了一下贝塞尔曲线的知识,具体知识转至:...
  • QCustomPlot 之平滑曲线(项目笔记 )

    多人点赞 热门讨论 2021-01-04 16:07:24
    一,生成平滑曲线 class SmoothCurveGenerator { protected: static QPainterPath generateSmoothCurveImp(const QVector<QPointF> &points) { QPainterPath path; int len = points.size(); if (len...
  • 绘制平滑曲线

    千次阅读 2010-05-27 21:04:00
    该函数只对点与点连线的接口入平滑处理,不能真正的实现平滑曲线。 如: 点数据: X: Y: 499.2 9.9929045 486.4 25.9922011 473.6 45.9806858 460.8 67.955146 ...
  • 从图中可以看出,只有四个点是保持不变的,分别...(1)在上四点构成的三个线段中,p0-p1上有到一个点,p1-p2上有到一个点,p2-p3上有到一个点,这三个点分别这在上三个线段差值运算。现在以上三个点分别取名为A1,...
  • 贝塞尔曲线函数 曲线平滑算法

    热门讨论 2011-02-21 14:26:28
    详细源码讲解如何计算贝塞尔曲线,可以实现曲线平滑算法
  • 直接拿三阶贝塞尔曲线为例,首先观察下图: 从图中可以看出,只有四个点是保持不变的,分别是P0,P1,P2,P3,这四个点两两相连得到三个线段 (1)在上四点构成的三个线段中,p0-p1上有到一个点,
  • 使用JFreeChart在网页上绘制平滑曲线

    千次阅读 2012-08-06 10:05:32
    用JFreeChart可以很轻松地画出很多种类常用的图形,如饼图、柱状图、折线图等,而绘制平滑曲线的功能是从版本1.0.7开始才增加的。 绘制平滑曲线的核心代码如下: XYSplineRenderer renderer = new ...
  • 关于贝塞尔曲线知识(请具体阅读...直接拿三阶贝塞尔曲线为例,首先观察下图: 从图中可以看出,只有四个点是保持不变的,分别是P0,P1,P2,P3,这四个点两两相连得到三个线段 (1)在上四点构成的三个线段中,p
  • Matlab画平滑曲线的两种方法

    千次阅读 2014-06-25 20:20:16
    自然状态下,用plot画的是折线,而不是平滑曲线。 有两种方法可以画平滑曲线,第一种是拟合的方法,第二种是用spcrv,其实原理应该都一样就是插值。下面是源程序,大家可以根据需要自行选择,更改拟合的参数。 clc...
  • 看到一篇很中意的技术文,怕作者删除,也为了方便整理查阅,遂ctrl cv到自己的博客里来,转载自这里运用贝塞尔曲线的光滑性来穿过这些点。大致思路就是 先算出相邻原始点的中点,在把相邻中点连成的线段平移到对应的...
  • 为了把一串点连成光滑的曲线,先研究贝塞尔曲线,又搞B样条插值。。。。都没有成功(数学没那么强)。 后来在 “[翻译] AGG 之贝塞尔插值 ”http://liyiwen.javaeye.com/blog/705489 。看到一种比较好的方法: ...
  • 在实际项目开发中,为了实现某种动画或者特效,策划都会要求让物体实现沿编辑的轨迹进行移动,今天...http://www.cnblogs.com/jay-dong/archive/2012/09/26/2704188.html,具体就不描述了。 这里的思路就是首先...
  • 曲线拟合(曲线平滑)

    千次阅读 2017-01-29 15:33:07
    曲线拟合 , 曲线平滑
  • 我在网上也找了许久,High-speed Charting Control,TeeChart,自定义图谱控件,cbrush,cpen······可代码量都挺大的,我刚接触MFC,学了一点C++(基本的功能会用),对于网上那些代码根本看不懂啊,照着上面了...
  • Matlab曲线平滑

    万次阅读 2019-05-14 22:19:37
    semilogy(x1,y1)%原来的折线 x2=linspace(min(x1),max(x1)); y2=interp1(x1,y1,x2,'cubic'); figure semilogy(x2,y2)%处理后的曲线 x=[1,2,3,4,5]; y=[1,4,5,8,12]; plot(x,y);...下面进行曲线平滑: x...
  • 如何用R画折线图,散点图,平滑曲线图 例子: week 1 2 3 4 5 6 x 3 8 19 24 6 1 y ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,677
精华内容 9,870
关键字:

平滑的曲线怎么做