java 贝塞尔_java贝塞尔曲线翻页效果

我写了一个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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值