- 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];
- }
- }
Android中使用Bezier曲线
最新推荐文章于 2024-04-08 08:04:14 发布