Android中使用Bezier曲线

import android.graphics.Point;
/**
 * 
 * @author http://blog.csdn.net/arui319
 *
 */
public class Bezier {
	private static final float AP = 0.5f;
	private Point[] bPoints;
	/**
	 * Creates a new Bezier curve.
	 * 
	 * @param points
	 */
	public Bezier(Point[] points) {
		int n = points.length;
		if (n < 3) {
			// Cannot create bezier with less than 3 points
			return;
		}
		bPoints = new Point[2 * (n - 2)];
		double paX, paY;
		double pbX = points[0].x;
		double pbY = points[0].y;
		double pcX = points[1].x;
		double pcY = points[1].y;
		for (int i = 0; i < n - 2; i++) {
			paX = pbX;
			paY = pbY;
			pbX = pcX;
			pbY = pcY;
			pcX = points[i + 2].x;
			pcY = points[i + 2].y;
			double abX = pbX - paX;
			double abY = pbY - paY;
			double acX = pcX - paX;
			double acY = pcY - paY;
			double lac = Math.sqrt(acX * acX + acY * acY);
			acX = acX / lac;
			acY = acY / lac;
			double proj = abX * acX + abY * acY;
			proj = proj < 0 ? -proj : proj;
			double apX = proj * acX;
			double apY = proj * acY;
			double p1X = pbX - AP * apX;
			double p1Y = pbY - AP * apY;
			bPoints[2 * i] = new Point((int) p1X, (int) p1Y);
			acX = -acX;
			acY = -acY;
			double cbX = pbX - pcX;
			double cbY = pbY - pcY;
			proj = cbX * acX + cbY * acY;
			proj = proj < 0 ? -proj : proj;
			apX = proj * acX;
			apY = proj * acY;
			double p2X = pbX - AP * apX;
			double p2Y = pbY - AP * apY;
			bPoints[2 * i + 1] = new Point((int) p2X, (int) p2Y);
		}
	}
	/**
	 * Returns the calculated bezier points.
	 * 
	 * @return the calculated bezier points
	 */
	public Point[] getPoints() {
		return bPoints;
	}
	/**
	 * Returns the number of bezier points.
	 * 
	 * @return number of bezier points
	 */
	public int getPointCount() {
		return bPoints.length;
	}
	/**
	 * Returns the bezier points at position i.
	 * 
	 * @param i
	 * @return the bezier point at position i
	 */
	public Point getPoint(int i) {
		return bPoints[i];
	}
}
 


原文链接: http://blog.csdn.net/arui319/article/details/6185561

你可能感兴趣的:(Android中使用Bezier曲线)