【GIS】算法原理:基础运算(矢量加减法、矢量叉积)

矢量基础概念

矢量是GIS空间分析的核心数学工具,表示具有方向和长度的量。当有向线段的起点位于坐标原点时,可视为矢量(如矢量P = (x, y))。

矢量加减法原理

矢量加法

几何意义:将两个矢量的位移效果叠加。

代数定义

给定矢量P = (x₁, y₁),Q = (x₂, y₂),则:
P + Q = (x₁ + x₂, y₁ + y₂)

矢量减法

几何意义:获取从Q指向P的矢量。

代数定义

P - Q = (x₁ - x₂, y₁ - y₂)

矢量叉积核心原理

数学定义

对于矢量 P = (x₁, y₁)Q = (x₂, y₂),其叉积为标量值:

P × Q = x₁y₂ - x₂y₁

几何意义

  • 绝对值:表示P、Q构成的平行四边形面积
  • 符号:反映两矢量的相对方向关系

方向判断规则

叉积符号 矢量方向关系
> 0 P在Q的顺时针方向
< 0 P在Q的逆时针方向
= 0 P与Q共线(可能反向)

C++代码实现

#include <iostream>
using namespace std;

// 二维矢量结构体
struct Vector2D {
    
    
    double x, y;
    Vector2D(double x = 0, double y = 0) : x(x), y(y) {
    
    }
};

// 矢量加法
Vector2D vectorAdd(const Vector2D& a, const Vector2D& b) {
    
    
    return Vector2D(a.x + b.x, a.y + b.y);
}

// 矢量减法
Vector2D vectorSub(const Vector2D& a, const Vector2D& b) {
    
    
    return Vector2D(a.x - b.x, a.y - b.y);
}

// 矢量叉积
double crossProduct(const Vector2D& a, const Vector2D& b) {
    
    
    return a.x * b.y - b.x * a.y;
}

int main() {
    
    
    Vector2D P(2, 3);
    Vector2D Q(5, 1);

    // 矢量运算演示
    Vector2D addResult = vectorAdd(P, Q);
    Vector2D subResult = vectorSub(P, Q);
    double cross = crossProduct(P, Q);

    // 输出结果
    cout << "P + Q = (" << addResult.x << ", " << addResult.y << ")\n";
    cout << "P - Q = (" << subResult.x << ", " << subResult.y << ")\n";
    cout << "P × Q = " << cross << endl;

    // 方向判断
    if(cross > 0) {
    
    
        cout << "P在Q的顺时针方向" << endl;
    } else if(cross < 0) {
    
    
        cout << "P在Q的逆时针方向" << endl;
    } else {
    
    
        cout << "P与Q共线" << endl;
    }

    return 0;
}

GIS典型应用场景

  1. 路径规划:判断行进方向偏转
  2. 多边形面积计算:通过顶点坐标累加叉积
  3. 线段相交检测:利用叉积符号快速判断
  4. 凸包算法:基于极角排序的点集处理

掌握这些基础运算将为后续学习Douglas-Peucker算法、Delaunay三角剖分等高级GIS算法奠定重要基础。建议通过绘制坐标图配合代码实验加深理解。