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

Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
Smile создаем класс CubicBezierSVG

В качестве аргументов методу bezierSplit передается четыре пары координат x и y, описывающих одну сущность - кривую Безье третьего порядка.
Чтобы описать эту сущность, создаем класс, в котором описываем базовые свойства кривой:

Код AS3:
package com.itechnica.svg {
	import flash.geom.Point;		
 
	public class CubicBezierSVG {
 
		private var startPoint : Point;
		private var startControlPoint : Point;
		private var endControlPoint : Point;
		private var endPoint : Point;
 
		public function CubicBezierSVG(start:Point, startControl:Point, endControl:Point, end:Point) {
			initInstance(start, startControl, endControl, end);
		}
 
		private function initInstance(start : Point, startControl : Point, endControl : Point, end : Point) : void {
			startPoint = start;
			startControlPoint = startControl;
			endControlPoint = endControl;
			endPoint = end;
		}
 
		public function get start() : Point {
			return startPoint;
		}
		public function set start(value : Point):void {
			startPoint = value;
		}
 
		public function get startControl() : Point {
			return startControlPoint;
		}
		public function set startControl(value : Point):void {
			startControlPoint = value;
		}
 
		public function get endControl() : Point {
			return endControlPoint;
		}
		public function set endControl(value : Point):void {
			endControlPoint = value;
		}
		public function get end() : Point {
			return endPoint;
		}
		public function set end(value : Point):void {
			endPoint = value;
		}
 
 
	}
}
И без специальных приборов видно, что если аргументы и возвращаемые значения метода bezierSplit класса Math2 заменить на объект CubicBezierSVG, то он будет завистлив к данным этого класса. В этот раз мы не будем шаг за шагом рефакторить метод, а с шашкой наголо создадим аналогичный метод в классе CubicBezierSVG.
Для этого просто скопируем метод в класс, продублируем и закомментируем верхний - на память.
Переименовываем метод в split, и делаем его публичным и не статическим. Удаляем аргументы. Редактор расцвел массой ошибок. Исправим их, заменив создание объектов Point из координат на соответствующие объекты Point текущего класса.
Для этого подглядываем в аргументы закомментированного класса: там точки идут по парам представляя контрольные точки кривой Безье.
Точки заменяем в том порядке, в котором они идут в аргументах закомментированного метода bezierSplit.
В итоге избавляемся от всех ошибок и видим, что можем удалить объявление точек p1 и p2 и заменить их непосредственно на startPoint и endPoint.
Для этого копируем startPoint в буфер обмена, удаляем строку инициализации p1, и там, где подсветилась ошибка вставляем из буфера обмена startPoint. Затем делаем то-же самое с p2.
Заменяем вложенные массивы на создание объектов CubicBezierSVG. После чего можем удалить закомментированный метод.

Затем мы можем заменить все new Point(...) на ранее полученные точки.

Полученный результат должен быть таким:

Код AS3:
public function split():Array {
	var p01:Point = new LineSVG(startPoint, startControlPoint).midpoint();
	var p12:Point = new LineSVG(startControlPoint, endControlPoint).midpoint();
	var p23:Point = new LineSVG(endControlPoint, endPoint).midpoint();
 
	var p02:Point = new LineSVG(p01, p12).midpoint();
	var p13:Point = new LineSVG(p12, p23).midpoint();
	var p03:Point = new LineSVG(p02, p13).midpoint();
 
	return [
		new CubicBezierSVG(startPoint, p01, p02, p03), 
		new CubicBezierSVG(p03, p13, p23, endPoint)
	];
}
Но на этом не остановимся и зададим читабельные имена и приведем объявления объектов в соответствие с их поведением:
Код AS3:
public function split():Array {
	const startMidpoint:Point = new LineSVG(startPoint, startControlPoint).midpoint();
	const middleMidpoint:Point = new LineSVG(startControlPoint, endControlPoint).midpoint();
	const endMidpoint:Point = new LineSVG(endControlPoint, endPoint).midpoint();
 
	const startMiddleMidpoint:Point = new LineSVG(startMidpoint, middleMidpoint).midpoint();
	const middleEndMidpoint:Point = new LineSVG(middleMidpoint, endMidpoint).midpoint();
	const centerMidpoint:Point = new LineSVG(startMiddleMidpoint, middleEndMidpoint).midpoint();
 
	return [
		new CubicBezierSVG(startPoint, startMidpoint, startMiddleMidpoint, centerMidpoint), 
		new CubicBezierSVG(centerMidpoint, middleEndMidpoint, endMidpoint, endPoint)
		];
}
Перейдем к замене использования метода Math2.bezierSplit на новый метод split класса CubicBezierSVG.
__________________
http://realaxy.com


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