Android中使用Bezier曲线

59 篇文章 0 订阅
55 篇文章 0 订阅

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];  
    }  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值