2 и 3 нормально, я вот подобное использовал -
http://flasher.ru/forum/showthread.php?t=101951&page=2. Но автор вопроса хочет, как я понимаю, даже не просто стандартный ресайз окна - двигая по-отдельности его бордеры, а ресайз буквально произвольной фигуры ("например - треугольник" - нормальный такой пример, треугольный, хватай и тащи -чего, куда, я так и не понял как он будет ресайзиться, у меня в глазах он только искажается - если двигать грань, то что остается неподвижным - противоположный угол.... не, это надо думать))))
Добавлено через 3 часа 59 минут
Вот примерно как я понял задачу.
Тут два разных варианта поведения, зависят от флага constrain - масштабирование с сохранением пропорций или без.

Код:
//// Флаг, сохранять ли пропорции
var constrain:Boolean = false;
////
var mc:MovieClip = _root.createEmptyMovieClip("mc", 20);
mc.lineStyle(0,0,0);
mc.beginFill(0x66aa66);
mc.moveTo(10,20);
mc.lineTo(200,240);
mc.lineTo(300,50);
mc._x = 100, mc._y = 80
mc.onPress = startScale;
mc.onRelease = mc.onReleaseOutside = stopScale;
////
var startX:Number;
var startY:Number;
var startXscale:Number;
var startYscale:Number;
var koefXY:Number;
////
var centerX:Number = mc._x + mc._width/2;
var centerY:Number = mc._y + mc._height/2;
////
function startScale () : Void
{
startXscale = this._xscale;
startYscale = this._yscale;
startX = _root._xmouse;
startY = _root._ymouse;
var kx = Math.sqrt(Math.pow(startX - centerX, 2) + Math.pow(startY - centerY, 2));
koefXY = startXscale/kx;
this.onMouseMove = dragScale;
}
function stopScale () : Void
{
this.onMouseMove = null;
}
function dragScale () : Void
{
//// SCALE XY
var xdir:Number = (startXscale>0 ? 1 : -1);
var ydir:Number = (startYscale>0 ? 1 : -1);
var vx:Number = (centerX > startX) ? startX - _root._xmouse : _root._xmouse - startX;
var vy:Number = (centerY > startY) ? startY - _root._ymouse : _root._ymouse - startY;
if(constrain)
{
var dirX = (_root._xmouse > centerX)&&(startX > centerX) ? 1 : (_root._xmouse < centerX)&&(startX < centerX) ? 1 : -1;
var dirY = (_root._ymouse > centerY)&&(startY > centerY) ? 1 : (_root._ymouse < centerY)&&(startY < centerY) ? 1 : -1;
var deltaXY = Math.sqrt(Math.pow(centerX - _root._xmouse, 2) + Math.pow(centerY - _root._ymouse, 2));
this._yscale=this._xscale = koefXY*deltaXY*dirX*dirY;//
}
else
{
this._xscale = startXscale + vx*xdir;
this._yscale = startYscale + vy*ydir;
}
//// XY
var _xdir:Number = (this._xscale>0 ? 1 : -1);
var _ydir:Number = (this._yscale>0 ? 1 : -1);
this._x = centerX - this._width*_xdir/2;
this._y = centerY - this._height*_ydir/2;
////
updateAfterEvent();
}