我写了一个java版本的实现,在android当中效果也实现了。是一样的,你可以把代码当中提示点和辅助线的都打开,我在源码中都注释掉了
public void DrawBezier(int x[],int y[],intn,Graphics g){inti,j;doublet;//暂时存储传入的参数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
{
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
{
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,intb){inti,temp;int s1 = 1,s2 = 1,s3 = 1;if(a
{
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);
}/*** 模拟翻页函数
*@paramPointX触摸点X
*@paramPointY触摸点Y
*@paramendX终止点,一般为书页的右下角X
*@paramendY终止点Y
*@paramgraphics 绘图的graphics*/
public void Turn(int PointX , int PointY ,int endX ,intendY,Graphics graphics){
Point a= newPoint(PointX, PointY);
Point f= newPoint(endX,endY);
Point g= new Point((a.x+f.x)/2,(a.y+f.y)/2);
Point e= newPoint();
Point h= newPoint();
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= newPoint();
Point j= newPoint();
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= newPoint();
key2= newPoint();
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);
}publicPoint MidPoint(Point p1,Point p2){return new Point((p1.x+p2.x)/2,(p1.y+p2.y)/2);
}static classLine{public doubleK;public doubleB;public staticLine getLine(Point p1,Point p2) {
Line tLine= newLine();
tLine.K= (p1.y-p2.y)/(p1.x-p2.x);
tLine.B= p1.y-tLine.K*p1.x;returntLine;
}
}