Показать сообщение отдельно
Старый 14.11.2012, 11:45
Hauts вне форума Посмотреть профиль Отправить личное сообщение для Hauts Посетить домашнюю страницу Hauts Найти все сообщения от Hauts
  № 14  
Ответить с цитированием
Hauts
 
Аватар для Hauts

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Держите простой набросок рендеринга векторов. Смысл следующий: у вас есть массивы основных векторов (которые пользователем задаются) и, соответственно, массивы получившихся векторов (те, которые показывают результат операции).

При обновлении данных об основных векторах или изменении операции, собственно, когда нужно отрисовать новую картинку, вы должны очистить массив resultVectors и заполнить его данными о новых получившихся векторах. Так же и с массивом currentVectors. Ну и вызвать метод renderScene после этого.

Надеюсь примерно понятно объяснил.

Так, как я не знаю, в каком формате ты будете хранить данные о векторе, оставил пустым метод drawVector. Думаю, сами разберетесь.

Кстати для рисования стрелочек в помощь вам метод drawArrowPart. Последний параметр angle в радианах и указывает направление стрелки.

Код AS3:
var currentVectors:Array = [];
var resultVectors:Array = [];
 
var drawContainer:Sprite = new Sprite();
addChild(drawContainer);
drawContainer.x = drawContainer.y = 20;
 
var drawGraphics:Graphics = drawContainer.graphics;
 
var sceneSize:Rectangle = new Rectangle(0,0,300,300);
var sceneCenterPoint:Point = new Point(20,200);
 
function drawArrowPart(gr:Graphics,x:Number,y:Number,angle:Number = 0):void {
	var subLength:Number = 10;
	var subAngle:Number = 15;
	var subRadAngle:Number = Math.PI - (subAngle * Math.PI / 180);
	var subX:Number;
	var subY:Number;
 
	subX = x + Math.cos(angle - subRadAngle) * subLength;
	subY = y + Math.sin(angle - subRadAngle) * subLength;
	gr.moveTo(x,y);
	gr.lineTo(subX,subY);
 
	subX = x + Math.cos(angle + subRadAngle) * subLength;
	subY = y + Math.sin(angle + subRadAngle) * subLength;
	gr.moveTo(x,y);
	gr.lineTo(subX,subY);
}
function drawVector(gr:Graphics, vector:*, color:uint) {
	// Here we need to draw vector
}
function renderScene():void {
	drawGraphics.clear();
 
	// draw axis
	drawGraphics.lineStyle(1,0x0000000, 0.25);
	drawGraphics.drawRect(sceneSize.left, sceneSize.top, sceneSize.width, sceneSize.height );
	drawGraphics.lineStyle(1,0x0000000,1);
	// x
	drawGraphics.moveTo(sceneSize.left, sceneCenterPoint.y);
	drawGraphics.lineTo(sceneSize.right, sceneCenterPoint.y);
	drawArrowPart(drawGraphics, sceneSize.right, sceneCenterPoint.y, 0);
 
	// y
	drawGraphics.moveTo(sceneSize.left + sceneCenterPoint.x,  sceneSize.bottom);
	drawGraphics.lineTo(sceneSize.left + sceneCenterPoint.x, sceneSize.top);
	drawArrowPart(drawGraphics, sceneSize.left + sceneCenterPoint.x, sceneSize.top, -Math.PI / 2);
 
	// now render current vectors;
	var k:int;
	for (k = 0; k < currentVectors.length; k++) {
		drawVector(drawGraphics, currentVectors[k], 0xFF0000);
	}
	for (k = 0; k < resultVectors.length; k++) {
		drawVector(drawGraphics, resultVectors[k], 0x30A4AE);
	}
}
 
renderScene();
__________________
hauts.ru