Wyznaczanie wektora odbitego to podstawa przy programowaniu fizyki etc.
Najpierw funkcja
zwraca ona wektor odbity o długości 1
void vectorReflect( const double fVec[ 3 ] , const double fNormal[ 3 ] , double fOut[ 3 ] ){
double fVecCopy[ 3 ];
double fNormalCopy[ 3 ];
fVecCopy[ 0 ] = fVec[ 0 ];
fVecCopy[ 1 ] = fVec[ 1 ];
fVecCopy[ 2 ] = fVec[ 2 ];
fNormalCopy[ 0 ] = fNormal[ 0 ];
fNormalCopy[ 1 ] = fNormal[ 1 ];
fNormalCopy[ 2 ] = fNormal[ 2 ];
// wyznaczanie długości wektorów
double fVecCopyLen = sqrt( fVecCopy[ 0 ] * fVecCopy[ 0 ] + fVecCopy[ 1 ] * fVecCopy[ 1 ] + fVecCopy[ 2 ] * fVecCopy[ 2 ] );
double fNormalCopyLen = sqrt( fNormalCopy[ 0 ] * fNormalCopy[ 0 ] + fNormalCopy[ 1 ] * fNormalCopy[ 1 ] + fNormalCopy[ 2 ] * fNormalCopy[ 2 ] );
// normalizacja wektorów
fVecCopy[ 0 ] /= fVecCopyLen;
fVecCopy[ 1 ] /= fVecCopyLen;
fVecCopy[ 2 ] /= fVecCopyLen;
fNormalCopy[ 0 ] /= fNormalCopyLen;
fNormalCopy[ 1 ] /= fNormalCopyLen;
fNormalCopy[ 2 ] /= fNormalCopyLen;
double fTmp[ 3 ];
// wyznaczanie iloczynu skalarnego
double fDot = fVecCopy[ 0 ] * fNormalCopy[ 0 ] + fVecCopy[ 1 ] * fNormalCopy[ 1 ] + fVecCopy[ 2 ] * fNormalCopy[ 2 ];
fTmp[ 0 ] = fNormalCopy[ 0 ] * fDot;
fTmp[ 1 ] = fNormalCopy[ 1 ] * fDot;
fTmp[ 2 ] = fNormalCopy[ 2 ] * fDot;
fTmp[ 0 ] *= 2.0;
fTmp[ 1 ] *= 2.0;
fTmp[ 2 ] *= 2.0;
fOut[ 0 ] = fVecCopy[ 0 ] - fTmp[ 0 ];
fOut[ 1 ] = fVecCopy[ 1 ] - fTmp[ 1 ];
fOut[ 2 ] = fVecCopy[ 2 ] - fTmp[ 2 ];
}
a teraz skąd to się wzięło
1 parametr to wektor padający drugi to wektor normalny czyli wektor prostopadły do powierzchni , 3 parametr to tablica 3 elementowa w której zostanie zapisany wektor odbity
na początku normalizujemy wektory ( normalizacja to podzielnie składowych wektora przez jego długość przez co otrzymujemy wektor którego długość wynosi 1 )

U to wektor normalny V to wektor padający
zaczepiamy teraz wektor U i V w tym samym punkcie

rzutujemy teraz V na U dzięki czemu otrzymamy wektor W

jak łatwo teraz można zauważyć jeśli od wektora V odejmiemy dwa razy wektor W ( wektor W możemy po prostu pomnożyć przez 2 i odejmować tylko raz ) to otrzymamy wektor odbity