我写了一个java版本的实现,在android当中效果也实现了。是一样的,你可以把代码当中提示点和辅助线的都打开,我在源码中都注释掉了
public void DrawBezier(int x[],int y[],int n,Graphics g){
int i,j;
double t;
//暂时存储传入的参数X和Y数组
double dx[] = new double[100];
double dy[] = new double[100];
double px[] = new double[100];
double py[] = new double[100];
for(i=0;i<n;i++)
{
px[i] = x[i];
py[i] = y[i];
}
for(i=0;i<100;i++)
{
dx[i] = 0;
dy[i] = 0;
}
for(i=0;i<100;i++)
{
t = (double)(((double)(i-1))/100);
for(j=0;j<n;j++)
{
dx[i]+=Math.pow(1-t,n-1-j)*Math.pow(t,j)*C(n-1,n-1-j)*px[j];
dy[i]+=Math.pow(1-t,n-1-j)*Math.pow(t,j)*C(n-1,n-1-j)*py[j];
}
}
int drawX[] = new int[100];
int drawY[] = new int[100];
drawX[0] = (int) dx[0];
drawY[0] = (int) dy[0];
for(i=1;i<100;i++){
drawX[i] = (int) dx[i];
drawY[i] = (int) dy[i];
g.drawLine(drawX[i-1],drawY[i-1], drawX[i],drawY[i]);
}
g.drawPolyline(drawX, drawY, n);
}
public double C(int a,int b){
int i,temp;
int s1 = 1,s2 = 1,s3 = 1;
if(a<b)
{
i = a;
a = b;
b = i;
}
temp = b;
while(temp>0)
{
s1*=temp;
temp--;
}
temp = a;
while(temp>0)
{
s2 *= temp;
temp--;
}
temp = a-b;
while(temp>0)
{
s3 *= temp;
temp--;
}
return s2/(s1*s3);
}
/**
* 模拟翻页函数
* @param PointX触摸点X
* @param PointY触摸点Y
* @param endX终止点,一般为书页的右下角X
* @param endY终止点Y
* @param graphics 绘图的graphics
*/
public void Turn(int PointX , int PointY ,int endX ,int endY,Graphics graphics){
Point a = new Point(PointX, PointY);
Point f = new Point(endX,endY);
Point g = new Point((a.x+f.x)/2,(a.y+f.y)/2);
Point e = new Point();
Point h = new Point();
h.x = f.x;
e.y = f.y;
double kBar = -1.0/((double)(f.y-g.y)/(double)(f.x-g.x));
double q = g.y-kBar*g.x;
h.y = (int) (h.x*kBar+q);
e.x = (int) ((e.y-q)/kBar);
Point m = new Point((a.x+e.x)/2,(a.y+e.y)/2);
Point n = new Point((a.x+h.x)/2,(a.y+h.y)/2);
kBar = (double)(m.y-n.y)/(double)(m.x-n.x);
q = m.y-kBar*m.x;
Point i = new Point();
Point j = new Point();
i.x = f.x;
j.y = f.y;
i.y = (int) (kBar*i.x+q);
j.x = (int) ((f.y-q)/kBar);
Point key1,key2;
key1 = new Point();
key2 = new Point();
key1 = MidPoint(MidPoint(j, m), e);
key2 = MidPoint(MidPoint(n, i), h);
int x[] = new int[3];
int y[] = new int[3];
x[0] = j.x;x[1] = e.x;x[2] = m.x;
y[0] = j.y;y[1] = e.y;y[2] = m.y;
DrawBezier(x, y, 3, graphics);
x[0] = i.x;x[1] = h.x;x[2] = n.x;
y[0] = i.y;y[1] = h.y;y[2] = n.y;
DrawBezier(x, y, 3, graphics);
graphics.drawLine(m.x, m.y, a.x, a.y);
graphics.drawLine(n.x, n.y, a.x, a.y);
graphics.drawLine(key1.x, key1.y, key2.x, key2.y);
String statString = "a: "+a.x+" "+a.y+"\n"+
"f: "+f.x+" "+f.y+"\n"+
"n: "+n.x+" "+n.y+"\n"+
"m: "+m.x+" "+m.y+"\n"+
"key1: "+key1.x+" "+key1.y+"\n"+
"key2: "+key2.x+" "+key2.y
;
graphics.drawString(statString, 40, 40);
graphics.drawString("a", a.x, a.y);
graphics.drawString("f", f.x, f.y);
graphics.drawString("key1", key1.x, key1.y);
graphics.drawString("key2", key2.x, key2.y);
graphics.drawString("m", m.x, m.y);
graphics.drawString("n", n.x, n.y);
graphics.drawString("g", g.x, g.y);
graphics.drawString("e", e.x, e.y);
graphics.drawString("i", i.x, i.y);
graphics.drawString("j", j.x, j.y);
graphics.drawLine(a.x, a.y, f.x, f.y);
graphics.drawLine(m.x, m.y, n.x, n.y);
graphics.drawLine(e.x, e.y, h.x, h.y);
graphics.drawLine(i.x, i.y, j.x, j.y);
}
public Point MidPoint(Point p1,Point p2){
return new Point((p1.x+p2.x)/2,(p1.y+p2.y)/2);
}
static class Line{
public double K;
public double B;
public static Line getLine(Point p1,Point p2) {
Line tLine = new Line();
tLine.K = (p1.y-p2.y)/(p1.x-p2.x);
tLine.B = p1.y-tLine.K*p1.x;
return tLine;
}
}