计算几何:修订间差异

来自三三百科
跳转到导航 跳转到搜索
33DAI留言 | 贡献
33DAI留言 | 贡献
批量导入三三文档
标签新重定向
 
(未显示同一用户的4个中间版本)
第1行: 第1行:
==欧几里得距离==
#REDIRECT [[06-数学相关/06-计算几何]]
 
[[Category:三三文档]]
* <math>(x_1,y_1)</math> 与 <math>(x_2,y_2)</math> 的距离为 <math>\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}</math>
* <math>(x_1,y_1,z_1)</math> 与 <math>(x_2,y_2,z_2)</math> 的距离为 <math>\sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2}</math>
 
==海伦公式==
 
三角形三边长分别为 <math>a,b,c</math>,那么定义半周长 <math>p=\frac{a+b+c}{2}</math>
 
则三角形面积为 <math>\sqrt{p(p-a)(p-b)(p-c)}</math>
 
==向量叉乘==
 
<math>
\vec{a}=(a_x,a_y),\ \vec{b}=(b_x,b_y)
\quad\Rightarrow\quad
\vec{a} \times \vec{b} = a_x b_y - a_y b_x
</math>
 
实际上有三维上的意义,但是信息学竞赛中一般只关注上面式子的值。
 
意义:
* 结果的绝对值恰好为两向量为邻边的平行四边形的面积,因此可以用来计算三角形面积。
* 可以利用正负值判断两个向量的位置关系。
{{bc|lang=cpp|code=
// 传入两个点,返回对应向量(第一个点指向第二个点)
pair<double, double> getV(pair<double, double> a, pair<double, double> b)
{
    return {b.first - a.first, b.second - a.second};
}
// 传入两个向量,返回叉乘结果
// 如果结果为正,第二个向量偏左,否则偏右
double getMul(pair<double, double> a, pair<double, double> b)
{
    return a.first * b.second - a.second * b.first;
}
}}
 
==线段相交判断==
 
对于四个点 <math>A,B,C,D</math>,判断线段 <math>AB</math> 与线段 <math>CD</math> 是否相交。
 
通过计算 <math>\vec{AB}\times \vec{AC}</math> 与  <math>\vec{AB}\times \vec{AD}</math>,如果结果一正一负,则 <math>C,D</math> 两点处于直线 <math>AB</math> 的两边。
 
同理可以判断<math>A,B</math> 两点是否处于直线 <math>CD</math> 的两边。
 
显然如果两个条件都满足,那么两线段相交。
 
{{bc|lang=cpp|code=
// 判断两个线段是否相交(ab ~ cd)
bool checkX(pair<double, double> a, pair<double, double> b,
            pair<double, double> c, pair<double, double> d)
{
    double x, y;
    // c,d 是否在直线 ab 的两边
    pair<double, double> AB = getV(a, b);
    pair<double, double> AC = getV(a, c);
    pair<double, double> AD = getV(a, d);
    x = getMul(AB, AC);
    y = getMul(AB, AD);
    if (x > 0 && y > 0 <nowiki>||</nowiki> x < 0 && y < 0) // c,d 在 ab 同一侧
        return false;
    // a,b 是否在直线 cd 的两边
    pair<double, double> CD = getV(c, d);
    pair<double, double> CA = getV(c, a);
    pair<double, double> CB = getV(c, b);
    x = getMul(CD, CA);
    y = getMul(CD, CB);
    if (x * y > 0)
        return false;
    return true;
}
}}

2026年5月20日 (三) 18:24的最新版本