2009-09-25 7 views
0

Я заметил на других языках, таких как Java, что есть такие объекты, как Vector2d, которые имеют метод умножения. Как мне сделать то же самое с ActionScript 3? Я знаю, что классы Point или Vector3D имеют методы add/substract, но не предлагают методы multiply/divide.Умножить объекты с двумя точками

Каков наилучший способ размножения двух объектов Point? было бы что-то вроде следующего?

var p1:Point = new Point(10, 20); 
var p2:Point = new Point(30, 40); 
var p3:Point = new Point((p1.x * p2.x), (p1.y * p2.y)); 

Кроме того, почему размножение/разделение должно быть исключено из этих классов?

EDIT * Вот ссылка на класс Vector2d я видел в Java: Java Vector2d multiply

ответ

9

Что бы математический смысл new Point((p1.x * p2.x), (p1.y * p2.y))? В векторном пространстве обычно нет умножения, поскольку просто не ясно, что он должен делать.

Тем не менее, есть так называемый «скалярное умножение», определенное на векторах евклидова пространства, что дает число («скалярное», отсюда и название):

double s = p1.x * p2.x + p1.y * p2.y; 

Это полезно, Например, если вам нужно проверить, являются ли строки ортогональными. Однако результатом является номер не вектор.

Другая вещь, чтобы сделать с векторами в масштабе им:

double factor = 1.5; 
Point p3 = new Point(factor * p1.x, factor * p2.y); 

Здесь результат действительно точка, но вход является номер и вектор, а не два вектора. Итак, если вы не можете сказать, что такое интерпретация/значение вашего векторного умножения, вы не должны его определять. (Заметьте, что я не знаю, может ли ваше предложение быть полезным или нет - это просто не «стандартное» умножение, о котором я знаю).

+0

Точно, для таких вещей, которые должны быть включены в геометрическую библиотеку, они должны иметь геометрическую интерпретацию. Я не знаю такой интерпретации для умножения декартовых координат. Скалярный продукт близок к тому, что приходит на ум, но это может быть найдено в библиотеках линейных алгебр, а не в геометрических. – jbasko

+0

Также есть кросс-продукт, который очень полезен, когда вы хотите создать нормальный вектор поверхности (для затенения). –

+0

Да, забыл об этом. Перекрестное произведение определено только для векторов в R^3, хотя скалярное произведение и масштабирование определены для R^n для любого n> 0, IIRC. – Dirk

3

Я действительно сомневаюсь, что Java имеет multiply методы для точечных или векторных классов, поскольку каноническое определение понятия «умножение» для этих объектов невозможно. Существует несколько операций, обычно называемых «произведениями» - продукт, кросс-произведение, комплексное умножение (путем идентификации комплекса и евклидовой плоскости), но все они обладают свойствами, сильно отличающимися от свойств обычного вещественного умножения. Компонентное умножение, которое вы предложили, не имеет большого смысла геометрически. Таким образом, нет окончательного ответа; обычно вы просто выбираете «умножение», необходимое для решения проблемы.

2

(забыл закончить запись и теперь появились некоторые ответы, так что извините за увольнениями)

хорошо, в основном, это потому, что на самом деле не имеет смысла для перемножения двух точек в 2d ... векторное произведение не существует для 2-х измерениях ... скалярное произведение дает скаляр, как указывает название, таким образом, в Number ... единственное, что имело бы смысл бы быть complex продукт:

var p3:Point = new Point(p1.x * p2.x - p1.y * p2.y, p1.x * p2.y + p1.y * p2.x); 

когда глядя на polar coordinates, вы поймете, что угол p3 является суммой углов p1 a nd p2, а длина - это произведение ...

даже в 3D, вы редко нужно умножение векторов ... только в редких случаях, когда у вас есть 3D-физический движок, который включает в себя вещи, как angular momentum или lorentz force ...

поэтому вопрос: что вы намерены сделать в конце? какой результат должен обеспечить умножение?

Смежные вопросы