![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
|
Вернемся в класс Math2.
Здесь мы видим сиротливо приютившийся метод getQuadBez_RP и мы понимаем, что из-за его завистливости к данным других объектов и вселенского одиночества в классе, он обречен на перемещение, а класс будет удален. Поскольку в первую очередь мы намерены избавить метод от скрытого нетипизированного доступа в аргументах, то видим, что заменяться они будут на объект CubicBezierSVG. Туда и будем перемещать. Правда, мы видим, что метод также использует класс LineSVG и, вполне возможно, что он будет завистлив к данным этого класса. Но это не проблема. Мы впоследствии сможем переместить, если потребуется. Итак, приступим. Перемещаем метод вместе с комментариями в класс CubicBezierSVG, сохраняем все документы и идем исправлять образовавшиеся ошибки в окне Problems. Не буду расписывать - вы и сами знаете что делать. Тестируем. Затем удаляем класс Math2, при этом мысленно благодарим его за труд, который он делал в течение своей короткой, но очень яркой и полезной жизни. Возвращаемся к методу getQuadBez_RP. Как и в предыдущем случае, нам вначале потребуется избавиться от зависимости кода от аргументов метода, которые мы будем заменять на объект CubicBezierSVG. Для этого вначале метода создаем экземпляр класса CubicBezierSVG: И везде в коде метода вместо обращения к аргументам используем доступ через объект source. Чтобы гарантировать себя от невнимательности, действуем по простой схеме: - переименовываем аргумент; - новое имя используем только в инициализации объекта source; - остальные обращения заменяем на доступ через объект source. Вот что в итоге получилось: 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, сохраняемся и идем исправлять ошибки. Принцип, как всегда прост: - вначале метода объявляем переменную: - в коде, перед ошибочной строкой создаем экземпляр класса CubicBezierSVG: - копируем первые четыре аргумента метода getQuadBez_RP в аргументы конструктора CubicBezierSVG. - заменяем обращение к статическому методу на обращение через экземпляр source. - переходим к следующей ошибке, пока они не иссякнут. - тестируем проект. - не забываем радоваться тому, как у нас ловко всё получается.
__________________
http://realaxy.com Последний раз редактировалось iNils; 20.12.2010 в 13:26. |
![]() |
Часовой пояс GMT +4, время: 18:30. |
|
|
« Предыдущая тема | Следующая тема » |
|
|