阳光VIP

少壮不努力,老大徒伤悲。平日弗用功,自到临期悔。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

每天学一点flash(52) 翻页组件算法(2)

Posted on 2012-02-16 20:28  阳光VIP  阅读(144)  评论(0编辑  收藏  举报
  • 将电子书分为3个内容层,叠放顺序如图。第一层为当前页面层,是现在正在显示的页面;第二层是随鼠标拖拽时卷起的页角,第三层是当页角卷起时,露出下一页的层。
  • 设置遮罩:当页边卷起时,层1仅显示四边形FBDE内部分,层2仅显示ABCD部分,层3仅显示BGHD部分。
  • 旋转:层2内的内容要随着鼠标运动而不停变换倾斜角度,其角度始终与AC边斜度一致。
  • 翻页:当页面完全翻过时,层1的当前页数=当前页数+1

 

程序的核心在于如何获得四个点ABCD的坐标,我使用的是求垂直平分线的方法,既:点C是鼠标位置,点H是页角位置,BD既为此两点间的垂直平分线。由已知的C,H坐标求出直线BD的一次函数y=kx+b以后再求出其与FG,EH的切点,既得点B,D坐标,点A是点G于直线BD的对称点,通过求点G对BD的对称点既可得点A坐标

这里是来源于网上。

下面经过一个下午的了解,写了一个角的算法。这里只是获取了四个点的坐标,x1,y1为右下面的坐标,x4,y4为右上面的点

坐标,k为斜率,t为垂直平分线的 斜率,其他的如图上的一样,当中的是计算出的结果,特别是两个交点的位置,B和D,还有A 利用求对称点的方法来求,需要运用到很多平面几何的知识。

 

var x1:Number = 912;
var y1:Number = 684;

var x4:Number = 912;
var y4:Number = 84;

onEnterFrame = init;

function init():Void {
 clear();
 var X:Number = _root._xmouse;
 var Y:Number = _root._ymouse;
 var k:Number = (Y-y1)/(X-x1);
 var t:Number = -1/k;
 var x0:Number = (X+x1)/2;
 var y0:Number = (Y+y1)/2;
 var BposX:Number = (t*x0-y0)/t;
 var BposY:Number = y4;
 var DposX:Number = (y1+t*x0-y0)/t;
 var DposY:Number = y1;

 var AposY:Number =( -k*x4+2*k*x0+2*k*k*y0-k*k*y4+y4-k*x4)/(1+k*k);
 var AposX:Number = (AposY-y4+x4*k)/k;

 var XposA:Number = x1;
 var YposA:Number = XposA*t-t*x0+y0;

 lineStyle(2,0xFF00FF,100);
 if (YposA>84) {
  moveTo(X,Y);
  lineTo(DposX,DposY);
  lineTo(XposA,YposA);
  lineTo(X,Y);
 } else {
  moveTo(X,Y);
  lineTo(DposX,DposY);
  lineTo(BposX,BposY);
  lineTo(AposX,AposY);
  lineTo(X,Y);
 }
}