矢量基础概念
矢量是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典型应用场景
- 路径规划:判断行进方向偏转
- 多边形面积计算:通过顶点坐标累加叉积
- 线段相交检测:利用叉积符号快速判断
- 凸包算法:基于极角排序的点集处理
掌握这些基础运算将为后续学习Douglas-Peucker算法、Delaunay三角剖分等高级GIS算法奠定重要基础。建议通过绘制坐标图配合代码实验加深理解。