Форум программистов, компьютерный форум CyberForum.ru

Произведение векторов - C++

Восстановить пароль Регистрация
 
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
14.01.2013, 22:22     Произведение векторов #1
Вот написал функцию которая должа умножать вектора(находить нормаль):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
using namespace std;
 
class TVector
{
    friend TVector ABVec(TVector, TVector);
 
    public:
 
    TVector(float _x, float _y, float _z)
    {
        x = _x;
        y = _y;
        z = _z;
    }
 
    void print(void) {std::cout << "(" << x << ", " << y << ", " << z << ")";}
 
    private:
 
    float x;
    float y;
    float z;
};
 
TVector ABVec(TVector a, TVector b) //считаем
{
    return TVector(a.z * b.y - a.y * b.z,
                   a.x * b.z - a.z * b.x,
                   a.y * b.x - a.x * b.y);
}
 
int main()
{
    TVector v1(50, 0, 0);
    TVector v2(0, 0, 50);
    ABVec(v1, v2).print();
    return 0;
}
Но один минус, вектор должен быть ЕДИНИЧНЫМ, так сказано и в википедии,
если он единичные значит его длина равна 1.
Но почему у меня в ответе вектор длиной (0,2500,0)
Вроде он должен быть длиной вверх всего 1, тоесть (0, 1, 0).
Скажите в чём моя ошибка и что я не понял?

Добавлено через 3 минуты
Меня реально подкосили знания математики, пишу программы легко, но вот математика... с пониманием проблема. Надеюсь на вашу помощь, я и так заплутал в учебниках по Стереометрии.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
14.01.2013, 22:24     Произведение векторов #2
No10, я так понимаю вектора перед умножением надо нормализовать.
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
14.01.2013, 22:32  [ТС]     Произведение векторов #3
Я работал с формулой A*B = (Az*By - Ay*Bz, Ax*Bz - Az*Bx, Ay*Bx - Ax*By)

Добавлено через 2 минуты
ВОТ!!!
gray_fox, Нормализация, это что за процесс?
В OpenGL вроде нормализация векторов glEnable(GL_NORMALIZE);
или glEnable(GL_RESCALE_NORMALS);
Но я не знаю как в частности работают эти функции.

Добавлено через 3 минуты
ага, нормализация это когда вектора превращаются в единичные?
В моём случае
(50, 0, 0) = (1, 0, 0)
(0, 0, 50) = (0, 0, 1)

gray_fox, спасибо, прям глоток свежего воздуха дал
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
14.01.2013, 22:35     Произведение векторов #4
Цитата Сообщение от No10 Посмотреть сообщение
gray_fox, Нормализация, это что за процесс?
Грубо говоря приведение к единичной длине.

Добавлено через 29 секунд
А ну ты сам уже понял)

Добавлено через 1 минуту
Что бы нормализовать - делишь каждую компоненту вектора на его длинну.
Igor3D
792 / 409 / 33
Регистрация: 01.10.2012
Сообщений: 2,066
14.01.2013, 22:38     Произведение векторов #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TVector Cross( const TVector & a, const TVector & b ) 
{
    return TVector(a.y * b.z - a.z * b.y,
                   a.z * b.x - a.х * b.z,
                   a.x * b.y - a.y * b.x);
}
 
float TVector::Length( void ) const
{
 return sqrt(x * x + y * y + z * z);
}
 
TVector TVector::Normalized( void ) const
{
 float len = Length();
 return TVector(x / len, y / len, z / len);
}
Yandex
Объявления
14.01.2013, 22:38     Произведение векторов
Ответ Создать тему
Опции темы

Текущее время: 16:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru