「Note」计算几何

计算几何基础

点积与叉积

点积

对于 \(\vec a, \vec b\),定义其点积:

\[\vec a\cdot \vec b = |\vec a| |\vec b| \cos \langle \vec a, \vec b\rangle = x_a x_b + y_a y_b \]

一般用于判断两向量夹角。

叉积

对于 \(\vec a, \vec b\),定义其叉积(此处指在二维平面内,若在三维空间内叉积应为一个向量,此处为标量):

\[\vec a\times \vec b = |\vec a| |\vec b| \sin \langle \vec a, \vec b\rangle = x_a y_b - y_a x_b \]

注意其不满足交换律

叉积的几何意义

  1. 向量叉积为两个向量围成的平行四边形面积。
  2. 判断向量顺逆时针方向。(若 \(\vec a \times \vec b > 0\),则 \(b\)\(a\) 逆时针方向(左转),其他情况类似。)

转角公式

将向量 \(\vec a = (x, y)\) 旋转角度 \(X\),得到新向量 \(\vec B = (x \cos B - y \sin B, x \sin B + y \cos B)\)

夹角(极角)及其排序

使用 atan2(x, y) 函数来表示角,再排序。

直线交点

利用叉积判断是否平行,在利用叉积算平四面积得到相似比,最后用向量乘以比值可计算交点:

struct Vec {    
    DB x, y;
    
    Vec operator + (const Vec& other) const {
        return {x + other.x, y + other.y};
    }

    Vec operator - (const Vec& other) const {
        return {x - other.x, y - other.y};
    }

    double operator * (const Vec& other) const {
        return x * other.y - y * other.x;
    }
    
    Vec operator ^ (double t) const {
        return {x * t, y * t};
    }
};

Vec Cross_P(Vec a1,Vec a2,Vec b1,Vec b2) {
	Vec a = a2 - a1, b = b2 - b1, c = b1 - a1;
    if(fabs(b * a) < 1e-12)
        return (Vec) {-1e9, -1e9};
	double t = (b * c) / (b * a);
	return a1 + (a ^ t);
}
posted @ 2025-10-28 12:17  Eon_Sky  阅读(6)  评论(0)    收藏  举报