java贝塞尔曲线翻页效果

我写了一个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; } }
原文地址:https://www.cnblogs.com/greywolf/p/2829254.html