This was my original working before Xavier pointed out the inconsistencies. (back to main page)
Alternative using Matrix representation
perpendicular component
A
B =
(A
B) * B/|B|2
A
B can be calculated as follows:
x = Ay * Bz - By * Az
y = Az * Bx - Bz * Ax
z = Ax * By - Bx * Ay
So,
(A
B)x
= ((Az * Bx - Bz * Ax) * Bz - By * (Ax * By - Bx * Ay)) / (Bx2 +
By2 + Bz2)
(A
B)y
= ((Ax * By - Bx * Ay) * Bx - Bz * (Ay * Bz - By * Az)) / (Bx2 +
By2 + Bz2)
(A
B)z
= ((Ay * Bz - By * Az) * By - Bx * (Az * Bx - Bz * Ax)) / (Bx2 +
By2 + Bz2)
grouping terms,
(A
B)x
= (Az * Bx* Bz - Bz * Ax* Bz - Ax * By* By + Bx * Ay* By) / (Bx2
+ By2 + Bz2)
(A
B)y
= (Ax * By* Bx - Bx * Ay* Bx - Ay * Bz*Bz + By * Az*Bz) / (Bx2 +
By2 + Bz2)
(A
B)z
= (Ay * Bz* By - By * Az* By - Az * Bx*Bx + Bz * Ax*Bx) / (Bx2 +
By2 + Bz2)
In matrix form,
(A
B) = 1 / (Bx2 + By2 + Bz2)* |
-Bz* Bz- By* By |
Bx * By |
Bx* Bz |
By* Bx |
-Bx*Bx- Bz*Bz |
By *Bz |
Bz *Bx |
Bz* By |
-By*By- Bx*Bx |
|
[A] |
I think the signs of all terms should be inverted, see error heading below,
can anyone help?
Alternative Form
As pointed out here, If B is normalised (unit
length) then Bx2 + By2 + Bz2 =1 so we
get:
(A
B) = |
Bx*Bx - 1 |
Bx * By |
Bx* Bz |
By* Bx |
By*By- 1 |
By *Bz |
Bz *Bx |
Bz* By |
Bz*Bz - 1 |
|
[A] |
which is:
(A
B) = ( |
|
* |
|
-[I])[A] |
which is:
(A
B) = (B * Bt - [I]) [A]
where:
- [I] = unit matrix
- Bt = transpose of B vector
As this is quite a simple equation I wonder if there is a simpler way
to derive it? perhaps the method of least squares discussed
here. |
parallel component
A || P = A P * P/|B|2
A P can be calculated as follows:
Ax * Bx + Ay * By + Az * Bz
so,
(A || P)x = (Ax * Bx + Ay * By + Az * Bz) * Bx / (Bx2 + By2
+ Bz2)
(A || P)y = (Ax * Bx + Ay * By + Az * Bz) * By/ (Bx2 + By2
+ Bz2)
(A || P)z = (Ax * Bx + Ay * By + Az * Bz) * Bz/ (Bx2 + By2
+ Bz2)
in matrix form this is:
(A || P) = 1 / (Bx2 + By2 + Bz2)* |
Bx2 |
Bx * By |
Bx * Bz |
By * Bx |
By2 |
By * Bz |
Bz * Bx |
Bz * By |
Bz2 |
|
[A] |
Alternative Form
If B is normalised (unit length) then Bx2 + By2
+ Bz2 =1 so we get:
(A || P) = |
Bx * Bx |
Bx * By |
Bx * Bz |
By * Bx |
By * By |
By * Bz |
Bz * Bx |
Bz * By |
Bz * Bz |
|
[A] |
which is:
(A
P) = ( |
|
* |
|
)[A] |
which is:
(A
P) = (B * Bt) [A]
where:
- Bt = transpose of B vector
As this is quite a simple equation I wonder if there is a simpler way
to derive it? perhaps the method of least squares discussed
here. |
Error
we have shown above that:
A = A || B + A
B
which would give:
A = (B * Bt - [I] + B * Bt)[A]
which should simplify to A = [I][A] but it does not so it looks like the sign
of (A
B) is inverted can anyone see where I went wrong?
This site may have errors. Don't use for critical systems.