查看“︁计算几何”︁的源代码
←
计算几何
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
==欧几里得距离== * <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> 实际上有三维上的意义,但是信息学竞赛中一般只关注上面式子的值。 意义: * 结果的绝对值恰好为两向量为邻边的平行四边形的面积,因此可以用来计算三角形面积。 * 可以利用正负值判断两个向量的位置关系。 <pre> // 传入两个点,返回对应向量(第一个点指向第二个点) 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; } </pre> ==线段相交判断== 对于四个点 <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> 的两边。 显然如果两个条件都满足,那么两线段相交。 <pre> // 判断两个线段是否相交(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 || 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; } </pre>
返回
计算几何
。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息