Вернемся в класс Math2.
Здесь мы видим сиротливо приютившийся метод getQuadBez_RP и мы понимаем, что из-за его завистливости к данным других объектов и вселенского одиночества в классе, он обречен на перемещение, а класс будет удален.
Поскольку в первую очередь мы намерены избавить метод от скрытого нетипизированного доступа в аргументах, то видим, что заменяться они будут на объект CubicBezierSVG. Туда и будем перемещать.
Правда, мы видим, что метод также использует класс LineSVG и, вполне возможно, что он будет завистлив к данным этого класса. Но это не проблема. Мы впоследствии сможем переместить, если потребуется.
Итак, приступим.
Перемещаем метод вместе с комментариями в класс CubicBezierSVG, сохраняем все документы и идем исправлять образовавшиеся ошибки в окне Problems. Не буду расписывать - вы и сами знаете что делать.
Тестируем. Затем удаляем класс Math2, при этом мысленно благодарим его за труд, который он делал в течение своей короткой, но очень яркой и полезной жизни.
Возвращаемся к методу getQuadBez_RP.
Как и в предыдущем случае, нам вначале потребуется избавиться от зависимости кода от аргументов метода, которые мы будем заменять на объект CubicBezierSVG.
Для этого вначале метода создаем экземпляр класса CubicBezierSVG:

Код AS3:
const source:CubicBezierSVG = new CubicBezierSVG(point1, control1, control2, point2);
И везде в коде метода вместо обращения к аргументам используем доступ через объект source.
Чтобы гарантировать себя от невнимательности, действуем по простой схеме:
- переименовываем аргумент;
- новое имя используем только в инициализации объекта source;
- остальные обращения заменяем на доступ через объект source.
Вот что в итоге получилось:

Код AS3:
public static function getQuadBez_RP(start:Point, startControl:Point, endControl:Point, end:Point, k:Number, qcurves:Array):void {
const source:CubicBezierSVG = new CubicBezierSVG(start, startControl, endControl, end);
// find intersection between bezier arms
var startArm : LineSVG = new LineSVG(source.start, source.startControl);
var endArm : LineSVG = new LineSVG(source.endControl, source.end);
var s:Point = startArm.getLineIntersection(endArm);
// find distance between the midpoints
var dx:Number = (source.start.x + source.end.x + s.x * 4 - (source.startControl.x + source.endControl.x) * 3) * .125;
var dy:Number = (source.start.y + source.end.y + s.y * 4 - (source.startControl.y + source.endControl.y) * 3) * .125;
// split curve if the quadratic isn't close enough
if (dx*dx + dy*dy > k) {
var sourceBezier : CubicBezierSVG = new CubicBezierSVG(source.start, source.startControl, source.endControl, source.end);
var halves:Array = sourceBezier.split();
var firstHalf:CubicBezierSVG = halves[0] as CubicBezierSVG;
var secondHalf:CubicBezierSVG = halves[1] as CubicBezierSVG;
// recursive call to subdivide curve
getQuadBez_RP (source.start, firstHalf.startControl, firstHalf.endControl, firstHalf.end, k, qcurves);
getQuadBez_RP(secondHalf.start, secondHalf.startControl, secondHalf.endControl, source.end, k, qcurves);
} else {
// end recursion by saving points
qcurves.push({p1x:source.start.x, p1y:source.start.y, cx:s.x, cy:s.y, p2x:source.end.x, p2y:source.end.y});
}
}
Следующий шаг, как вы помните, переход от статичного метода к методу экземпляра класса.
Удаляем ключевое слово static, сохраняемся и идем исправлять ошибки.
Принцип, как всегда прост:
- вначале метода объявляем переменную:

Код AS3:
var source:CubicBezierSVG;
- в коде, перед ошибочной строкой создаем экземпляр класса CubicBezierSVG:

Код AS3:
source = new CubicBezierSVG();
- копируем первые четыре аргумента метода getQuadBez_RP в аргументы конструктора CubicBezierSVG.
- заменяем обращение к статическому методу на обращение через экземпляр source.
- переходим к следующей ошибке, пока они не иссякнут.
- тестируем проект.
- не забываем радоваться тому, как у нас ловко всё получается.