android 光滑曲线,Android使用Catmull_Rom插值算法画光滑曲线图

一、算法核心思想

1、每次插值需要四个基础点(暂假设为A、B、C、D)。

2、根据已知的四个基础点,插值算法每次只能实现在中间两个点间画出光滑的曲线(此处就是B点和C点)。

二、工程代码

1、“Catmull_Rom插值算法”画光滑曲线的类(Catmull_Rom.java)

package com.example.test;

import java.util.ArrayList;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.Path;

import android.util.AttributeSet;

import android.view.View;

public class Catmull_Rom extends View {

private final Paint mGesturePaint = new Paint();

private final Path mPath = new Path();

private ArrayList point = new ArrayList();

private ArrayList save = new ArrayList();

public Catmull_Rom(Context context) {

super(context);

}

public Catmull_Rom(Context context, AttributeSet attrs) {

super(context, attrs);

mGesturePaint.setAntiAlias(true);

mGesturePaint.setStyle(Style.STROKE);

mGesturePaint.setStrokeWidth(5);

mGesturePaint.setColor(Color.WHITE);

}

public Catmull_Rom(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

@Override

protected void onDraw(Canvas canvas) {

// TODO Auto-generated method stub

super.onDraw(canvas);

point.add(new Point(0, 0));

point.add(new Point(1, 1));

point.add(new Point(80, 100));

point.add(new Point(160, 60));

point.add(new Point(240, 120));

point.add(new Point(320, 30));

point.add(new Point(400, 200));

point.add(new Point(401, 201));

function_Catmull_Rom(point, 1000, save, mPath);

canvas.drawPath(mPath, mGesturePaint);

}

public void function_Catmull_Rom(ArrayList point, int cha, ArrayList save, Path path) {

if (point.size() < 4) {

return;

}

path.moveTo(point.get(0).x, point.get(0).y);

save.add(point.get(0));

for (int index = 1; index < point.size() - 2; index++) {

Point p0 = point.get(index - 1);

Point p1 = point.get(index);

Point p2 = point.get(index + 1);

Point p3 = point.get(index + 2);

for (int i = 1; i <= cha; i++) {

float t = i * (1.0f / cha);

float tt = t * t;

float ttt = tt * t;

Point pi = new Point(); // intermediate point

pi.x = (float) (0.5 * (2 * p1.x + (p2.x - p0.x) * t + (2 * p0.x - 5 * p1.x + 4 * p2.x - p3.x) * tt + (3 * p1.x - p0.x - 3 * p2.x + p3.x)

* ttt));

pi.y = (float) (0.5 * (2 * p1.y + (p2.y - p0.y) * t + (2 * p0.y - 5 * p1.y + 4 * p2.y - p3.y) * tt + (3 * p1.y - p0.y - 3 * p2.y + p3.y)

* ttt));

path.lineTo(pi.x, pi.y);

save.add(pi);

pi = null;

}

}

path.lineTo(point.get(point.size() - 1).x, point.get(point.size() - 1).y);

save.add(point.get(point.size() - 1));

}

}2、主活动(MainActivity.java)

package com.example.test;

import android.app.Activity;

import android.os.Bundle;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}3、主布局

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.test.MainActivity" >

android:id="@+id/path"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

4、坐标类(Point.java)

package com.example.test;

public class Point {

public float x;

public float y;

public Point() {

}

public Point(float x, float y) {

super();

this.x = x;

this.y = y;

}

public float getX() {

return x;

}

public void setX(float x) {

this.x = x;

}

public float getY() {

return y;

}

public void setY(float y) {

this.y = y;

}

}三、实现效果图如下:

81b931eb05e41228f6e969145851938d.png

原文:http://blog.csdn.net/ican87/article/details/46273703

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值