如何在Android图形中绘制无缝曲线?

12

我想使用Android图形绘制无缝曲线,类似于以下方式:

 canvas.quadTo(.....);

Android参考文档提到了使用贝塞尔曲线的方法。

但是该方法不支持绘制具有超过三个点的曲线。

P1,P2,P3,P4,P5

我该如何绘制以下这样的曲线?

Matlab

我听说这叫做“非线性曲线拟合”。

Android是否有可用的曲线拟合库?

1个回答

6
对于iPhone,您可以使用数据分析,对于Android,您可以使用Google Analytics SDK v2来实现您想要的功能。
这是一个查询的示例
var lineChart = getChartObj();
lineChart.setParams(barChart.getParams());
lineChart.setParam('cht', 'lc');
lineChart.setParam('chm', '');
var lineChartURL = paramsToURL(chartData.chartParams, chartData.baseURL);
drawChart('visitorDiv',lineChartURL);

您可能会发现,查看更多有关图表的详细信息,以便特别匹配您想要绘制的model,这将会很有趣。

另一个选择是考虑使用Qt Quick中的折线图来进行QML编程:

Graph.LineGraph {
    width: parent.width
    height: parent.height - legend.height - parent.spacing
    model: learningProgressModel

    dimensions: [
        Graph.Dimension {
            id: accuracyDimension
            dataColumn: 5
            color: "#ffb12d"
            maximumValue: 1.0
            label: i18n("Accuracy")
            unit: "%"
            unitFactor: 100
        },
        Graph.Dimension {
            id: charactersPerMinuteDimension
            dataColumn: 6
            color: "#38aef4"
            maximumValue: 400
            label: i18n("Characters per Minute")
        }
    ]
}

如果您想拥有广泛的绘图模型选择,Octave for Android也可能是一个有趣的选择。您可以使用drawBezierCurve命令,只需提供您数据中的点:

points = [0 0; 3 1; -2 1; 1 0];
 drawBezierCurve(points);
 hold on
 plot(points([1 4],1),points([1 4],2),'go');
 plot(points([2 3],1),points([2 3],2),'rs');
 line(points([1 2],1),points([1 2],2),'color','k');
 line(points([3 4],1),points([3 4],2),'color','k');
 h = drawBezierCurve(points, 'discretization', 6, 'color','r');
 hold off        

如果你想在Android上显示所需的非线性曲线拟合,只需使用更适合你需要的数据或模型即可。


1
谢谢Avanz,这非常有帮助 - Jindong Jung
我使用Google提供的单调三次样条插值方法找到了解决方案。https://android.googlesource.com/platform/frameworks/base/+/cd92588/core/java/android/util/Spline.java - Jindong Jung
@JindongJung - 很高兴听到这个消息。如果答案确实有助于解决您的问题,就像您提到的那样,您也可以将其标记为正确答案。 - Avanz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接