- 将电子书分为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);
}
}