首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

三維向量叉積 C 語言實現與數學原理詳解

     編輯:關於C語言

數學原理回顧

向量 u = (u1, u2, u3), v = (v1, v2, v3)。叉積 (外積) 定義為行列式:

u × v = | i   j   k  |
        | u1 u2 u3 |
        | v1 v2 v3 |

展開得分量形式:


u × v = ( u2*v3 - u3*v2,
          u3*v1 - u1*v3,
          u1*v2 - u2*v1 )

結果向量垂直於 u、v 所在平面,方向遵循右手定則,模長等於平行四邊形面積。

代碼實現 (教學版)

作者採用查表法編碼係數符號,雖非最高效但直觀展開運算過程:

[c]
// vector_multiply.h
#ifndef VECTOR_MULTIPLY_H_
#define VECTOR_MULTIPLY_H_
void vector_multiply(float a[], float b[], float c[]);
#endif

// vector_multiply.c
void vector_multiply(float a[], float b[], float c[]) {
    int i, j, k, n = 0;
    // 係數表:對應展開式中的 +1/-1
    // d[k][n] 對應第 k 個分量中第 n 項的係數
    int d[3][4] = { { 0, 1, -1, 0 }, { 0, -1, 1, 0 }, { 0, 1, -1, 0 } };

    for (k = 0; k < 3; k++) {
        for (i = 0; i < 3; i++) {
            for (j = 0; j < 3; j++)
                if (k != i && k != j)
                    c[k] += a[i] * b[j] * d[k][n++];
        }
        n = 0;
    }
}

// main.c
#include 
#include "vector_multiply.h"
int main(void) {
    float a[3] = {1.0, 2.0, 3.0};
    float b[3] = {7.0, 8.0, 9.0};
    float c[3] = {0};
    vector_multiply(a, b, c);
    printf("%.1f:%.1f:%.1f\n", c[0], c[1], c[2]); // -6.0:12.0:-6.0
    return 0;
}

編譯執行

gcc main.c vector_multiply.c -o VectorOperations
./VectorOperations

優化與工程化建議

  1. 直接展開無分支版本 (編譯器常自動向量化):
    [c]
    void cross_product(const float a[3], const float b[3], float c[3]) {
        c[0] = a[1]*b[2] - a[2]*b[1];
        c[1] = a[2]*b[0] - a[0]*b[2];
        c[2] = a[0]*b[1] - a[1]*b[0];
    }
    
  2. 使用 SIMD 內建函數 (SSE/AVX/NEON) 批次處理多組向量。
  3. 封裝結構體:typedef struct { float x,y,z; } Vec3; 提升可讀性與型別安全。
  4. 增加 const 與 restrict 協助編譯器優化:void cross_product(const float *restrict a, const float *restrict b, float *restrict c);

應用場景

  • 3D 圖形:法向量計算、相機座標系構建、碰撞檢測。
  • 物理模擬:力矩、角動量、洛倫茲力。
  • 機器人學:關節軸向量運算、姿態插值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved