
Код AS3:
import flash.display.Graphics;
import flash.geom.Point;
import flash.events.MouseEvent;
function drawTrapezium(drawTo:Graphics, points:Array, cornerRaduis:Number = 0):void {
// top line
var angle_0_1:Number = Math.atan2(points[1].y - points[0].y,points[1].x - points[0].x);
var x1:Number = points[0].x + Math.cos(angle_0_1) * cornerRaduis;
var y1:Number = points[0].y + Math.sin(angle_0_1) * cornerRaduis;
var angle_1_0:Number = Math.atan2(points[0].y - points[1].y,points[0].x - points[1].x);
var x2:Number = points[1].x + Math.cos(angle_1_0) * cornerRaduis;
var y2:Number = points[1].y + Math.sin(angle_1_0) * cornerRaduis;
//
drawTo.moveTo(x1, y1);
drawTo.lineTo(x2, y2);
// right line
var angle_1_2:Number = Math.atan2(points[2].y - points[1].y,points[2].x - points[1].x);
var x3:Number = points[1].x + Math.cos(angle_1_2) * cornerRaduis;
var y3:Number = points[1].y + Math.sin(angle_1_2) * cornerRaduis;
var angle_2_1:Number = Math.atan2(points[1].y - points[2].y,points[1].x - points[2].x);
var x4:Number = points[2].x + Math.cos(angle_2_1) * cornerRaduis;
var y4:Number = points[2].y + Math.sin(angle_2_1) * cornerRaduis;
//
drawTo.curveTo(points[1].x, points[1].y, x3,y3);
drawTo.lineTo(x4, y4);
// bottom line
var angle_2_3:Number = Math.atan2(points[3].y - points[2].y,points[3].x - points[2].x);
var x5:Number = points[2].x + Math.cos(angle_2_3) * cornerRaduis;
var y5:Number = points[2].y + Math.sin(angle_2_3) * cornerRaduis;
var angle_3_2:Number = Math.atan2(points[2].y - points[3].y,points[2].x - points[3].x);
var x6:Number = points[3].x + Math.cos(angle_3_2) * cornerRaduis;
var y6:Number = points[3].y + Math.sin(angle_3_2) * cornerRaduis;
//
drawTo.curveTo(points[2].x, points[2].y, x5,y5);
drawTo.lineTo(x6, y6);
// left line
var angle_3_4:Number = Math.atan2(points[0].y - points[3].y,points[0].x - points[3].x);
var x7:Number = points[3].x + Math.cos(angle_3_4) * cornerRaduis;
var y7:Number = points[3].y + Math.sin(angle_3_4) * cornerRaduis;
var angle_4_3:Number = Math.atan2(points[3].y - points[0].y,points[3].x - points[0].x);
var x8:Number = points[0].x + Math.cos(angle_4_3) * cornerRaduis;
var y8:Number = points[0].y + Math.sin(angle_4_3) * cornerRaduis;
//
drawTo.curveTo(points[3].x, points[3].y, x7,y7);
drawTo.lineTo(x8, y8);
drawTo.curveTo(points[0].x, points[0].y, x1,y1);
}
var points:Array = [new Point(20,20),new Point(200,30),new Point(200,250),new Point(20,240)];
stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
function mouseMoveHandler(e:MouseEvent):void{
this.graphics.clear();
this.graphics.lineStyle(1);
points[2].x = stage.mouseX;
points[2].y = stage.mouseY;
drawTrapezium(this.graphics, points, 20);
}
mouseMoveHandler(null)
Уф разминка мозга по геометрии. Пользуйтесь.
Я не хотел выносить основные методы в отдельную вспомогательную функцию, но, в принципе, с таким же успехом можно сделать рисование n-угольника со скругленными краями.