Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.09.2011, 17:23
botbot вне форума Посмотреть профиль Отправить личное сообщение для botbot Найти все сообщения от botbot
  № 11  
Ответить с цитированием
botbot

Регистрация: Feb 2011
Сообщений: 100
Она некорректна, потому что стена это отрезок, а не вектор. Если матеманически, то надо посчитать проекцию вектора (допустим A) на стену (получим вектор B) , и проекцию вектора на нормаль к стене (вектор C), потом умножить скалярно С на -1 и сложить B и C. Будет искомый вектор.

Старый 14.09.2011, 18:16
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 12  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
botbot, вы ошибаетесь. Стене все равно. В выше указанной книжке разбирается этот пример. Достаточно знать исходный вектор.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 14.09.2011, 18:40
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 13  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
@TanaTiX
стена не может быть вектором, ну никак. И не понятно, что Вы имеете ввиду под "исходным вектором". ИМО, botbot все правильно изложил.
__________________
...вселенская грусть

Старый 14.09.2011, 19:05
botbot вне форума Посмотреть профиль Отправить личное сообщение для botbot Найти все сообщения от botbot
  № 14  
Ответить с цитированием
botbot

Регистрация: Feb 2011
Сообщений: 100
Ещё покрутив в голове задачку, придумал немного более быстрое решение:
A - исходный вектор
B - проекция вектора на стенку
Отражённый вектор = 2*B - A.
МОжет можно ещё как-то упростить, но я думаю уже хватит. Как найти проекцию вектора на стенку надо говорить?

Старый 14.09.2011, 20:42
inozemcev вне форума Посмотреть профиль Отправить личное сообщение для inozemcev Найти все сообщения от inozemcev
  № 15  
Ответить с цитированием
inozemcev
[+ 1.0 08.10.14]
 
Аватар для inozemcev

блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
Цитата:
Сообщение от botbot Посмотреть сообщение
Ещё покрутив в голове задачку, придумал немного более быстрое решение:
Как найти проекцию вектора на стенку надо говорить?
Да будьте добры

Старый 14.09.2011, 20:49
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 16  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
gloomyBrain, ага, чуток я заработался.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 14.09.2011, 21:14
botbot вне форума Посмотреть профиль Отправить личное сообщение для botbot Найти все сообщения от botbot
  № 17  
Ответить с цитированием
botbot

Регистрация: Feb 2011
Сообщений: 100
Вон есть уже в том коде вектора, что я дал:
Код AS3:
		public function projectOnto( v:Vector2D ):Vector2D {
			var dp:Number = this.dot(v);
			var f:Number  = dp / ( v.x*v.x + v.y*v.y );
			return new Vector2D( f*v.x , f*v.y);
		}
Осталось только из стены вектор выделить
Код AS3:
var wallVec: Vector2D = new Vector2D(point1.x - point2.x, point1.y - point2.y);
По идее должно сработать.
А потом
Код AS3:
var B: Vector2D = myVector.projectOnto(wallVec);

Старый 14.09.2011, 22:45
kodo вне форума Посмотреть профиль Отправить личное сообщение для kodo Найти все сообщения от kodo
  № 18  
Ответить с цитированием
kodo

Регистрация: Mar 2011
Адрес: Минск
Сообщений: 11
если нужно получить зеркальный отскок от стены заданной вектором, то можно: найти угл между нашим вектором и вектором стены и поверунуть наш вектор на 2 таких угла.

UPD: в общем вот мой 2D вектор:
(есть сериализация, и лишние вычисления(X Y length angle - пересчитываются все разом, кто хочет может реализовать отложенные вычисления - лично мне было лень, н

Код AS3:
package kodo_basic 
{
 
	import flash.utils.IDataInput;
	import flash.utils.IDataOutput;
	import flash.utils.IExternalizable;
 
	/**
	 * ...
	 * @author Kodo
	 * 
	 * Клас вектора.
	 * 
	 * Для удобства храняться и используются градусы а не раианы(каждый раз переводятся)!!!!
	 * Угл сохраняется в формате (-180, 180] где [0-180] - по часовой, (0,-180) - против часовой
	 */
	public class Vector2D implements IExternalizable
	{
		// Используются большие буквы!! - чтобы опреедлить get\set с маленькой
		//Длинна
		private var Length:Number;
		//угл
		private var myAngle:Number;
		private var X:Number;
		private var Y:Number;
 
		/** ДЛИННА ВОСПРИНИМАЕТСЯ ПО МОДУЛЮ!! */
		public function Vector2D( newLenght:Number = 0, newAngle:Number = 0 ) 
		{
			Length = Math.abs( newLenght );
			// Вызываем Set для угла, тамже автоматически установятся и x,y
			this.angle = newAngle;
 
 
 
		}
 
		// Методы СЕРИАЛИЗАЦИИ
		public function readExternal(input:IDataInput):void
		{
			Length = input.readDouble();
			myAngle = input.readDouble();
			X = input.readDouble();
			Y = input.readDouble();
		}
 
		public function writeExternal(output:IDataOutput):void
		{
 
			output.writeDouble(Length);
			output.writeDouble(myAngle);
			output.writeDouble(X);
			output.writeDouble(Y);
		}
 
 
		public function coppy():Vector2D
		{
			return new Vector2D( this.Length, this.myAngle );
		}
 
		public function get x():Number
		{
			return X;
		}
		public function set x(newX:Number):void
		{
			X = newX;
			Length = Math.sqrt(X * X + Y * Y);
			myAngle = Math.atan2(Y, X) * 180 / Math.PI;
		}
 
 
		public function get y():Number
		{
			return Y;
		}
		public function set y(newY:Number):void
		{
			Y = newY;
			Length = Math.sqrt(X * X + Y * Y);
			myAngle = Math.atan2(Y, X) * 180 / Math.PI;
		}
 
		public function get length():Number
		{
			return Length;
		}
		public function set length( newLength:Number ):void
		{
			if( newLength >= 0)
			{
				Length = newLength;
			}
			else
			{
				// корректируем длинну
				Length = Math.abs(newLength);
				// корректируем угл
				myAngle = (myAngle + 180) % 360;
				if (myAngle > 180) this.myAngle = myAngle - 360;
				else if (myAngle <= -180) this.myAngle = myAngle + 360;
			}
			Y = Length * Math.sin( myAngle * Math.PI/180);
			X = Length * Math.cos( myAngle * Math.PI/180);
		}
 
		public function get angle():Number
		{
			return myAngle;
		}
		public function set angle( newAngle:Number ):void
		{
			newAngle = newAngle % 360;
			if (newAngle > 180) this.myAngle = newAngle - 360;
			else if (newAngle <= -180) this.myAngle =newAngle + 360;
			else this.myAngle = newAngle;
			Y = Length * Math.sin( myAngle * Math.PI/180);
			X = Length * Math.cos( myAngle * Math.PI/180);		
		}
 
		// Складывает вектор-параметр с текущим
		public function sumVectors( newVector:Vector2D ):void
		{
			X += newVector.x;
			Y += newVector.y;
			Length = Math.sqrt(X * X + Y * Y);
			myAngle = Math.atan2(Y, X) * 180 / Math.PI;
		}
		/**
		 * Возвращает дельта-угл между данным вектором и вектором-параметром.
		 * результатом будет угл который стоит прибавить к вектору чтобы он был повёрнут втуже сторону что вектр-параметр.
		 * @param	targetVector2D	- вектор-параметр
		 * @return	угл который стоит прибавить к вектору чтобы он был повёрнут втуже сторону что вектр-параметр
		 */
		public function  deltaAngleToVector2D( targetVector2D:Vector2D ):Number
		{
			var deltaAngle:Number = (targetVector2D.angle - this.angle);
			if ( deltaAngle > 180) deltaAngle = deltaAngle - 360;
			else if (deltaAngle <= -180) deltaAngle = deltaAngle + 360;
			return deltaAngle;
		}
		// Возвращает дельта-угл между данным вектором и некоторым углом-параметром.
		// результатом будет угл который стоит прибавить к вектору чтобы он был повёрнут втуже сторону что угл-параметр.
		public function deltaAngleToAngle( targetAngle:Number ):Number
		{
			// Здесь используем остаток от деления на 360 - на случай ввода угла не из промежутка (-180,180]
			var deltaAngle:Number = (targetAngle - this.angle)%360;
			if ( deltaAngle > 180) deltaAngle = deltaAngle - 360;
			else if (deltaAngle <= -180) deltaAngle = deltaAngle + 360;
			return deltaAngle;			
		}
 
		public function toString():String
		{
			return new String( "[Vector, length: " + this.Length + " , angle:" + this.myAngle + "]" );
		}
	}
 
}


Последний раз редактировалось kodo; 14.09.2011 в 23:52.
Создать новую тему Ответ Часовой пояс GMT +4, время: 15:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 15:32.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.