![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
|
Выбирая из оставшихся двух переименованием, обнаруживаем, что метод intersect2Lines используется только в этом классе и лишь в одном месте. Делаем метод приватным.
Наиболее предсказуемые последствия возникнут если сейчас изменить возвращаемый тип. Логика подсказывает, что пересечение двух линий - точка. Заменяем возвращаемый тип на Point. Редактор тут же подсвечивает ошибки: возврат NaN и Object. В первом случае заменяем на null, во втором случае на new Point(...) - в трех местах. После этого двойным кликом выделяем имя метода и используя CTRL+R открываем панель результатов поиска и там переходим на метод getgetQuadBez_RP и заменяем тип переменной s на Point. (Можно заодно удалить Math2. в вызове метода intersect2Lines) Далее приведем в порядок аргументы метода intersect2Lines, задав им тип Point. После этого в панели Problems отсортируем список по полю Description так, чтобы вверху оказались строки "You can not assign an 'Object' to an 'Point'" и приступим к исправлению этих ошибок. Здесь нужно четко понимать: наша задача в данный момент - исправить только эти ошибки, а не весь проект. Наши исправления должны носить по возможности локальный характер. Поэтому поступим следующим образом: - переименуем первый аргумент в point1; - перед вызовом intersect2Lines объявляем переменную p1 с типом Point и присваиваем ей новый объект Point, которому в качестве параметров передаем point1.x и point1.y; - поступаем аналогично со следующим аргументом, задав ему имя control1. - аналогично изменяем оставшиеся два аргумента, имеющие тип Object. - сохраняем проект, тестируем. Вот что имеем на данный момент: public static function getQuadBez_RP(point1:Object, control1:Object, control2:Object, point2:Object, k:Number, qcurves:Array):void { // find intersection between bezier arms var p1:Point = new Point(point1.x, point1.y); var c1:Point = new Point(control1.x, control1.y); var c2:Point = new Point(control2.x, control2.y); var p2:Point = new Point(point2.x, point2.y); var s:Point = intersect2Lines (p1, c1, c2, p2); // find distance between the midpoints var dx:Number = (p1.x + p2.x + s.x * 4 - (c1.x + c2.x) * 3) * .125; var dy:Number = (p1.y + p2.y + s.y * 4 - (c1.y + c2.y) * 3) * .125; // split curve if the quadratic isn't close enough if (dx*dx + dy*dy > k) { var halves:Object = Math2.bezierSplit (p1.x, p1.y, c1.x, c1.y, c2.x, c2.y, p2.x, p2.y); var b0:Object = halves.b0; var b1:Object = halves.b1; // recursive call to subdivide curve getQuadBez_RP (p1, b0.c1, b0.c2, b0.p2, k, qcurves); getQuadBez_RP (b1.p1, b1.c1, b1.c2, p2, k, qcurves); } else { // end recursion by saving points qcurves.push({p1x:p1.x, p1y:p1.y, cx:s.x, cy:s.y, p2x:p2.x, p2y:p2.y}); } } Мы имеем возможность быстро протестировать изменения и, если придется откатиться, то совсем недалеко. Это огромное преимущество маленьких шагов. Итак, в настоящий момент все ошибки типизации сконцентрировались в одном методе: getQuadBez_RP и разбиты на две группы: ошибки вызванные неверной типизацией аргументов и ошибки вызванные объектом halves. Следуя нашей стратегии вначале исправим ошибки, затрагивающие только методы текущего класса. Объект halves - это возвращаемый методом bezierSplit объект, содержащий в себе два других объекта b0 и b1, каждый из которых содержит в себе по 4 объекта типа Point. У нас есть выбор: либо создать пользовательский класс для типизации объекта halves, либо, поскольку его структура жестко задана, использовать массив и последующую типизацию. В данном случае массив предпочтительнее, поскольку это более короткий и логичный путь. Название метода (bezierSplit - разделить безье) и использованное имя переменной, которой присваивается возвращаемое значение (halves - половинки), также говорят за использование массива. Ок, пойдем этим путем. Проверим вначале на какие другие методы окажут воздействие изменения в bezierSplit. Сделать это можно либо переименовав его, либо с помощью CTRL+R. Метод используется только в getQuadBez_RP. Это заодно нам позволяет сделать его приватным. Далее: - изменяем возвращаемый методом bezierSplit тип на Array; - изменяем строку return на: - в методе getQuadBez_RP изменяем тип объекта halves на Array; - изменяем присвоение переменным b0 и b1 на доступ к 0 и 1 элементам массива соответственно; - тестируем. Аналогичным образом поступаем с объектами в возвращаемом методом bezierSplit массиве - также делаем из них массивы: - в методе getQuadBez_RP изменяем тип переменных b0 и b1 на Array; - чтобы увидеть все вхождения b0 и b1, а также сделать код более читабельным, переименовываем эти переменные в bezier0 и bezier1 соответственно. - дублируем строки, в которых появились ошибки, одну пару комментируем, чтобы не забыть что было изначально; - в тех местах где подсветились ошибки заменяем имена переменных и доступ к их содержимому на оператор доступа к массиву. Замена производится соответственно: ".p1" на "[0]", ".c1" на "[1]", ".c2" на "[2]", ".p2" на "[3]". Наример, было: b0.c1 стало: bezier0[1]; Результат должен получиться таким: Тестируем. Всё в порядке? Тогда на этом первую половину процесса можно считать законченной.
__________________
http://realaxy.com Последний раз редактировалось iNils; 20.12.2010 в 13:23. |
![]() |
Часовой пояс GMT +4, время: 10:16. |
|
|
« Предыдущая тема | Следующая тема » |
|
|