
Код:
MovieClip.prototype.drawArc = function(x, y, radius, arc, startAngle, yRadius) {
//// ==============
//// mc.drawArc() - by Ric Ewing (ric@formequalsfunction.com) - version 1.5 - 4.7.2002
////
//// x, y = текущее положение курсора рисования
//// radius = радиус арки. Если yRadius не указан, то он равен radius
//// arc = длина арки в градусах. отрицательное значение задают арку против часовой стрелки.
//// startAngle = начальный угол в градусах.
//// yRadius = y - радиус арки
//// ==============
if (arguments.length < 5) {
return;
}
// если yRadius неопределен, yRadius = radius
if (yRadius == undefined) {
yRadius = radius;
}
var segAngle, theta, angle, angleMid, segs, ax, ay, bx, by, cx, cy;
//// рисуем только то что нужно :)
if (Math.abs (arc) > 360) {
arc = 360;
}
//// Flash использует 8 сегментов на круг, каждый максимум по 45 градусов. Сначала вычисляем количество необходимых сегментов
segs = Math.ceil (Math.abs (arc) / 45);
// теперь вычисляем длину арки для каждого сегмента
segAngle = arc / segs;
//// Конвертируем градусы в радианы
theta = -(segAngle / 180) * Math.PI;
//// Конвертируем начальный угол в радианы
angle = -(startAngle / 180) * Math.PI;
//// Находим стартовую точку (ax,ay) относительно заданных x,y
ax = x - Math.cos (angle) * radius;
ay = y - Math.sin (angle) * yRadius;
//// если арка больеше чем 45 градусов, draw as 45 degree segments so that we match Flash's native circle routines.
if (segs > 0) {
//// Зацилкиваем рисование сегментов
for (var i = 0; i < segs; i++) {
//// увеличиваем угол
angle += theta;
//// находим угол на середине пути между конечными точками арки
angleMid = angle - (theta / 2);
//// вычисляем координаты конечной точки
bx = ax + Math.cos (angle) * radius;
by = ay + Math.sin (angle) * yRadius;
//// вычисляем координаты контрольной точки
cx = ax + Math.cos (angleMid) * (radius / Math.cos (theta / 2));
cy = ay + Math.sin (angleMid) * (yRadius / Math.cos (theta / 2));
//// рисуем сегмент
this.curveTo (cx, cy, bx, by);
}
}
//// возвращяемм координаты конечной точки
return {x:bx, y:by};
};