Created
March 10, 2017 01:29
-
-
Save sruthirameshv/74fb7f245a2de2741599c3c3c88ee240 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.android.opengl; | |
import android.graphics.Point; | |
public class Bezier { | |
private static final float AP = 0.5f; | |
private Point[] bPoints; | |
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]; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment