圆的切线其实在使用当中有一些应用,特别是在分布的时候,在flash 当中圆的技术使用是经常而且实用性很高,这张图片就是通过分布而来的,但是同时加入一些阴影的滤镜让其看起来更加好看。
当中的做法。
下面我们看看不同地方,和有趣对比,左边图中 和右边的图 差别在于图片的注册点相对位置,按普通说话,左边图是按左上角作为注册点,
右边图则是以中心点位置。在计算的时候,我发觉第二种会比第一种处理切线的时候容易一点。我们可以把图片看左是一条线,线角度变化了,则图会跟随转动。当这些线与圆形成切线的时候, 看起来就很像图片在于圆进行相切。也可以按这种思路和想象去想,但是对于左边的图,则用起来不怎样爽,暂时没有对其进行计算出来。相反第二种就容易了。
求切线的办法,可以参考上一篇的做法。不知道有无更加简单的做法,目前我仅仅知道这种通过坐标来计算斜率的办法。
可以试试看看效果如何!如果对其有更加好的做法,不妨提出来。
public class Main extends Sprite
{
private var pen:Shape=new Shape();
private var angle:Number=0;
private var image_num:int=0;
private var list:Array=[];
private var Image_contain:Sprite=new Sprite();//中心点容器
private var filter:DropShadowFilter;
private var Image:BitmapData=new BitmapData(200,200,true,0xffffff);
public function Main()
{
init();
}
private function init():void
{
filter=new DropShadowFilter();
filter.strength=0.3;
var list:Array=["image/1.jpg","image/2.jpg","image/3.jpg","image/4.jpg",
"image/5.jpg","image/6.jpg","image/7.jpg","image/8.jpg",
"image/9.jpg","image/10.jpg","image/11.jpg","image/12.jpg",
"image/13.jpg","image/14.jpg","image/15.jpg","image/16.jpg"
];
init_image(list);//初始化图片
addChild(Image_contain);
Image_contain.addChild(new Bitmap(Image));
Image_contain.x=340;
Image_contain.y=250;
drawBase(this,Image_contain,140,104);
}
//初始化图片
private function init_image(list:Array):void
{
var len:int=list.length;
image_num=len;
for (var i:int=0; i<len; i++)
{
var loader:Loader=new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onloadImageComplete);
loader.load(new URLRequest(list[i]));
}
}
private function onloadImageComplete(event:Event):void
{
event.currentTarget.removeEventListener(Event.COMPLETE,onloadImageComplete);
var bitmap:Bitmap=event.currentTarget.content as Bitmap;
bitmap.scaleX=bitmap.scaleY=0.5;
bitmap.x=-bitmap.width/2;
bitmap.y=-bitmap.height/2;
var bitmapContain:Sprite=new Sprite();
bitmapContain.addChild(bitmap);
mouseListener(bitmapContain);//鼠标监听
drawBase(bitmapContain,bitmap,bitmap.width,bitmap.height);//绘制底部,让图片看起来更加好看
image_num--;
list.push(bitmapContain);
if (image_num==0)
{
sortIamge(list);
drawImage(Image_contain,list[0],Image);
}
}
//图片鼠标监听
private function mouseListener(target:Sprite):void
{
target.addEventListener(MouseEvent.MOUSE_OVER,target_MouseOver);
target.addEventListener(MouseEvent.MOUSE_OUT,target_MouseOut);
target.addEventListener(MouseEvent.MOUSE_DOWN,target_MouseDown);
}
private function target_MouseOver(event:MouseEvent):void
{
event.currentTarget.alpha=0.7;
event.currentTarget.scaleX=event.currentTarget.scaleY=1.5;
}
private function target_MouseOut(event:MouseEvent):void
{
event.currentTarget.alpha=1;
event.currentTarget.scaleX=event.currentTarget.scaleY=1;
}
private function target_MouseDown(event:MouseEvent):void
{
drawImage(Image_contain,event.currentTarget,Image);
}
//绘制中心图片
private function drawImage(Image_contain:Sprite,target:*,Image:BitmapData)
{
Image=target.getChildAt(1).bitmapData;
Image_contain.graphics.clear()
Image_contain.graphics.beginBitmapFill(Image);
Image_contain.graphics.drawRect(0,0,Image.width,Image.height);
Image_contain.graphics.endFill();
}
//对图片进行重新排序
private function sortIamge(list:Array):void
{
var len:int=list.length;
var perangle:Number=2*Math.PI/len;
for (var i:int=0; i<len; i++)
{
var photo:*=list[i];
addChild(photo);
photo.x=400+(200+photo.height/2)*Math.cos(i*perangle)
photo.y=300+(200+photo.height/2)*Math.sin(i*perangle);
photo.rotation=getline_k(400,300,i*perangle,200);//根据斜率求出偏移角度
//if(photo.rotation<0)
//photo.scaleY=-1;not_set_yet.beginBitmapFill():void
//trace(photo.rotation);
}
}
//计算圆上任意一点切线的斜率角度
private function getline_k(starX:Number,starY:Number,angle:Number,R:Number):Number
{
var px:Number=starX+R*Math.cos(angle);
var py:Number=starY+R*Math.sin(angle);
var k:Number=-(starX-px)/(starY-py);
return Math.atan(k)*180/Math.PI;
}
//绘制图片底部
private function drawBase(contain:*,target:*,w:Number,h:Number):void
{
var shape:Shape=new Shape();
contain.addChildAt(shape,0);
shape.graphics.lineStyle(0,0,0);
shape.graphics.beginFill(0xffffff);
shape.graphics.drawRect(target.x-w/20,target.y-h/20,w+w/10,h+h/10);
shape.graphics.endFill();
shape.filters=[filter];
}
}
}