Ещё можно сделать четыре точки (или три), которые будут ездить по контуру, вращаясь друг относительно друга, при изменении пиксела битмапы менять точку вращения, таким образом можно перемещаться по границе, всё время цепляясь за неё одной из четырёх точек (лап)

Код AS3:
package
{
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;
import flash.geom.*;
/**
* ...
* @author Lexcuk
*/
public class Doc extends Sprite
{
private var spiderArr:Vector.<Point>, spiderTrans:Vector.<Point>;
private var spiderMatrix:Matrix = new Matrix();
private var angle:Number = 0, angleStep:Number = 0.5;
private var i:int;
private var sprite:Sprite;
private var cenRotX:Number = 0, cenRotY:Number = 0, startX:int, startY:int;
private var spiralDiam:Number = 0, spiralAngle:Number = 0, spiralAnStep:Number = 0.1;
private var spiTag:Boolean = false;
private var curHand:int, contactStr:String = '';
private var bmd:BitmapData;
public function Doc()
{
var sh:Shape = new Shape();
sh.graphics.beginFill(0xFF0000);
sh.graphics.drawCircle(230, 200, 100);
sh.graphics.drawCircle(100, 150, 40)
sh.graphics.drawCircle(250, 100, 40)
addChild(new Bitmap(bmd = new BitmapData(550, 400, false)));
//фото в битмапдату
bmd.draw(sh);
addChild(sprite = new Sprite());
spiderArr = Vector.<Point>([
new Point( -5, -5), new Point(5, -5), new Point(5, 5), new Point(-5, 5)
]);
spiderTrans = new Vector.<Point>();
cenRotX = spiderArr[0].x;
cenRotY = spiderArr[0].y;
//точка сброса
startX = 50;
startY = 50;
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function showSpider():void {
sprite.graphics.clear();
sprite.graphics.lineStyle(0);
for (i = 0; i < spiderArr.length; i++)
sprite.graphics.drawCircle(spiderTrans[i].x, spiderTrans[i].y,2);
}
private function enterFrameHandler(e:Event):void {
//если не нашли, то ищем
if (!spiTag) spiderTagertLookFor();
else spiderGo();
showSpider();
}
//режим первоначального поиска цели
private function spiderTagertLookFor():void {
//крутиться по возрастающей спирали
spiderMatrix.identity();
//смещение на длину спирали
spiderMatrix.translate(spiralDiam += angleStep, 0);
//вращение на угол спирали
spiderMatrix.rotate(spiralAngle += spiralAnStep);
//смещение на точку сброса
spiderMatrix.translate(startX, startY);
//применение матрицы к лапам
for (i = 0; i < spiderArr.length; i++)
spiderTrans[i] = spiderMatrix.transformPoint(spiderArr[i]);
//тестим паука на пересечение лап
if (pixelTester()) spiTag = true;
}
//режим перемещения по цели
public function spiderGo():void {
//крутится относительно следующей законтаченной лапы
if (curHand == 3) if (contactStr.charAt(2) == '1') curHand = 2;
if (curHand == 0) if (contactStr.charAt(3) == '1') curHand = 3;
if (curHand == 1) if (contactStr.charAt(0) == '1') curHand = 0;
if (curHand == 2) if (contactStr.charAt(1) == '1') curHand = 1;
cenRotX = spiderTrans[curHand].x;
cenRotY = spiderTrans[curHand].y;
//сместить матрицу паука на текущее положение лапы
spiderMatrix.translate( -cenRotX, -cenRotY);
//трансформировать лапы, повернув их относительно текущей лапы
spiderMatrix.rotate(-angle);
spiderMatrix.rotate(angle += angleStep);
//вернуть лапы обратно
spiderMatrix.translate( cenRotX, cenRotY);
for (i = 0; i < spiderArr.length; i++)
spiderTrans[i] = spiderMatrix.transformPoint(spiderArr[i]);
//проверка лап
pixelTester();
}
private function pixelTester():Boolean {
var r:Boolean;
var c:uint;
contactStr = '';
for (i = 0; i < spiderArr.length; i++) {
c = bmd.getPixel(spiderTrans[i].x, spiderTrans[i].y);
if (spiderTrans[i].x <= 0 && spiderTrans[i].y <= 0) c = 0xFFFFFF;
if (c == 0xFFFFFF||c==0) {
contactStr += '1';
}else {
r = true;
contactStr += '0';
}
}
return r;
}
}
}