Показать сообщение отдельно
Старый 13.03.2008, 15:44
Iv вне форума Посмотреть профиль Отправить личное сообщение для Iv Посетить домашнюю страницу Iv Найти все сообщения от Iv
  № 17  
Iv
 
Аватар для Iv

Регистрация: 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.
- сохраняем проект, тестируем.

Вот что имеем на данный момент:
Код AS3:
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 на:
Код AS3:
return [{p1:p1, c1:p01, c2:p02, p2:p03}, {p1:p03, c1:p13, c2:p23, p2:p2}];
- в методе getQuadBez_RP изменяем тип объекта halves на Array;
- изменяем присвоение переменным b0 и b1 на доступ к 0 и 1 элементам массива соответственно;
- тестируем.

Аналогичным образом поступаем с объектами в возвращаемом методом bezierSplit массиве - также делаем из них массивы:
Код AS3:
return [[p1, p01, p02, p03], [p03, p13, p23, p2]];
- в методе getQuadBez_RP изменяем тип переменных b0 и b1 на Array;
- чтобы увидеть все вхождения b0 и b1, а также сделать код более читабельным, переименовываем эти переменные в bezier0 и bezier1 соответственно.
- дублируем строки, в которых появились ошибки, одну пару комментируем, чтобы не забыть что было изначально;
- в тех местах где подсветились ошибки заменяем имена переменных и доступ к их содержимому на оператор доступа к массиву. Замена производится соответственно: ".p1" на "[0]", ".c1" на "[1]", ".c2" на "[2]", ".p2" на "[3]".
Наример, было: b0.c1 стало: bezier0[1];

Результат должен получиться таким:
Код AS3:
// getQuadBez_RP (p1,     b0.c1, b0.c2, b0.p2, k, qcurves);
// getQuadBez_RP (b1.p1,  b1.c1, b1.c2, p2,    k, qcurves);
getQuadBez_RP (p1, bezier0[1], bezier0[2], bezier0[3], k, qcurves);
getQuadBez_RP(bezier1[0], bezier1[1], bezier1[2], p2,    k, qcurves);
Тестируем. Всё в порядке? Тогда на этом первую половину процесса можно считать законченной.
__________________
http://realaxy.com


Последний раз редактировалось iNils; 20.12.2010 в 13:23.