Задумал я повторить книгу с переворачивающимися страницами их полно...

Заценяем контент с сайта page-flip.com

В общем... сраницы не должны отрываться. Тянем за (нижний так по-проще будет) уголок и она не отрывается. Условия не отрыва оч. простые: длина от нижнего разворота страницы до мыши не должна превышать ширину книги, вместе с этим длина от верхнего разворота до мыши не должна быть больше диагонали книги.
изображение ограничения по диагонали
Теперь при перемещении нижнего правого (опять же) уголка и огранижение по ширине книги
ограничение по ширине книги
Естественно если имеют место оба эти ограничения (принцип не меняется)

Ставим правильно мышь.

Такое действие провернуть на флеше очень легко. Делаем вектор из точки книги на мышь, и если длина этого вектора больше нужной нам длины, то ограничиваем эту длину (вектор) нормализируя его и масштабируем полученный нормализованный (единичный) вектор на нужную нам длину. Это может выглядеть так:
package  
{
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class TrueMouseDoc extends Sprite
	{
		private var pageW:int = 100;//ширина книги
		private var pageH:int = 120;//высота книги
		private var book:Sprite;
		private var expert:Sprite;
		private var pageP:Point;
		public function TrueMouseDoc() 
		{
			addChild(book = new Sprite());
			book.y = 100;
			book.x = book.y + pageW;
			book.addChild(expert = new Sprite());
			book.graphics.lineStyle(0);
			book.graphics.beginFill(0xC0C0C0);
			book.graphics.drawRect( -pageW, 0, pageW * 2, pageH);
			book.graphics.endFill();
			book.graphics.drawRect( -1, 0, 2, pageH);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
		}
 
		private function mouseMoveHandler(evt:MouseEvent):void {
			pageP = new Point(book.mouseX,book.mouseY);
			fixMouse();
		}
 
		private function fixMouse():void {
			var topP:Point = new Point();//координата верхнего центра разворота книги
			var bottomP:Point = new Point(0, pageH);//координата нижнего центра разворота книги
			var diagonal:Number = Math.sqrt(pageW * pageW + pageH * pageH);
			
			//проверка нижней стороны
			var vBottom:Point = pageP.subtract(bottomP);//вектор от низа середины книги на мышь
			if (vBottom.length > pageW) //если больше ширины нормализируем шириной
			vBottom.normalize(pageW);
			pageP = vBottom.add(bottomP);//пофиксили мышку шириной
			
			expert.graphics.clear();
			//рисуем правильную нижниюю часть переворачиваемой страницы зеленым
			expert.graphics.lineStyle(2,0x00FF00);
			expert.graphics.moveTo(bottomP.x,bottomP.y);
			expert.graphics.lineTo(pageP.x,pageP.y);
			
			
			//проверка диагонали
			var vUp:Point = pageP.subtract(topP);//создали вектор на мышь
			if (vUp.length > diagonal) //если больше диагонали нормализируем диагональю
			vUp.normalize(diagonal);
			pageP = vUp.add(topP);//пофиксили мышку диагонально
			//рисуем диагональ красный цвет правильную мышку и правильную диагональ
			
			expert.graphics.lineStyle(2,0xFF0000);
			expert.graphics.moveTo(topP.x,topP.y);
			expert.graphics.lineTo(pageP.x,pageP.y);
			expert.graphics.drawCircle(pageP.x, pageP.y, 4);
		}
 
	}
 
}
 


Это флешка по ней нужно водить мышкой.
Красной точкой показывается 'исправленная мышь'

Все работает как надо, не нравится пара моментов, можно исключить половину вычислений, таких как длина, создание point при помощи subtract, можно еще на фукции разбить и вообще как-то не очень, буду делать спец класс дополняющий point, но static для работы с векторами 2D. И стиль для книги, там ширина, высота и пр. для расчетов, потом, а функции для векторов P2V.
package lex.geom 
{
	import flash.geom.*;
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class P2V
	{
		
		public function P2V() 
		{
			
		}
 
		/*копирование х и y в result
		 * */
		public static function copy(result:Point, operand:Point):void {
			result.x = operand.x;
			result.y = operand.y;
		}
 
		/*сложение
		 * */
		public static function plus(result:Point, operand:Point):void {
			result.x += operand.x;
			result.y += operand.y;
		}
 
		/*вычитание
		 * */
		public static function minus(result:Point, operand:Point):void {
			result.x -= operand.x;
			result.y -= operand.y;
		}
 
	}
 
}

Теперь стиль, пока такой
package lex.book 
{
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class BookStyle
	{
		public var width:Number = 100;
		public var height:Number = 120;
		
		public function BookStyle() 
		{
			
		}
		
	}
 
}

Правим мышку
package lex.book 
{
	import flash.geom.Point;
	import lex.geom.P2V;
	import lex.book.BookStyle;
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class FixMouse
	{
		private var pageP:Point = new Point();
		private var s:BookStyle;
		private var diagonal:Number;
		private var width:Number;
		private var fP:Point = new Point();
		private var tP:Point;//верх
		private var bP:Point;//низ
		public function FixMouse(bs:BookStyle) 
		{
			s = bs;
			tP = new Point();
			bP = new Point(0, s.height);
			width = s.width;
			diagonal = Math.sqrt(s.width * s.width + s.height * s.height);
		}
 
		public function fix(p:Point):Point {
			P2V.copy(pageP, p);
			fixDistTo(bP, width);
			P2V.copy(pageP, fP);
			fixDistTo(tP, diagonal);
			return fP;
		}
 
		private function fixDistTo(start:Point, dist:Number):void {
			P2V.copy(fP, pageP);
			P2V.minus(fP, start);
			if (fP.length > dist) //если больше dist нормализируем dist-ом
			fP.normalize(dist);
			P2V.plus(fP, start);
		}
 
	}
 
}
Все документ класс, по скорости не тестил, но думаю быстрее будет работать, хотя оно тормозит за счет графики, но думаю openGl в следующем релизе плеера исправит ситуацию .
package  
{
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	import lex.book.BookStyle;
	import lex.book.FixMouse;
	
	import lex.geom.P2V;
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class TrueMouseDoc extends Sprite
	{
		private var style:BookStyle = new BookStyle();
		private var fixMouse:FixMouse = new FixMouse(style);
		private var book:Sprite;
		private var expert:Sprite;
		public function TrueMouseDoc() 
		{
			addChild(book = new Sprite());
			book.y = 100;
			book.x = book.y + style.width;
			book.addChild(expert = new Sprite());
			book.graphics.lineStyle(0);
			book.graphics.beginFill(0xC0C0C0);
			book.graphics.drawRect( -style.width, 0, style.width * 2, style.height);
			book.graphics.endFill();
			book.graphics.drawRect( -1, 0, 2, style.height);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
		}
 
		private function mouseMoveHandler(evt:MouseEvent):void {
			var pageP:Point;
			pageP = fixMouse.fix(new Point(book.mouseX, book.mouseY));
			expert.graphics.clear();
			expert.graphics.lineStyle(0);
			expert.graphics.drawCircle(pageP.x, pageP.y, 5);
		}
 
 
 
	}
 
}

и теперь буду копипастить все операции с векторами в P2V
В следующей части будем заворачивать уголок листа страницы.