平面几何常用算法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算几何基础
9、矢量的矢量积(叉乘、叉积)
③探讨一个重要问题:给定两个矢量:P0P1 和 P0P2 ,对它们 的公共端点P0来说,判断 P0P1 是否在 P0P2 的顺时针方向。
方法:如图,把P0作为原点,得出向量P1’=P1-P0和P2’=P2-P0, 因此,这两个向量的叉积为:
( p1 p0 ) ( p2 p0 ) (x1 x0 )( y2 y0 ) (x2 x0 )( y1 y0 )
如果该叉积为正,
则 P0P1 在 P0P2 的顺时针方向, 如果为负,则 P0P1 在 P0P2 的逆时针方向。
如果等于0,则P0,P1,P2三点共线。
判断两条线段是否相交 p3
p1
计算几何基础
13
显然,只要p1,p2两点在线段p3p4的两
边,并且p3,p4在线段p1p2的两边,那
么这两条线段必然相交 p2
计算几何基础
2、矢量的加减法
以点O为起点、A为端点作矢量a,以点A为起点、B为端点作矢 量b,则以点O为起点、B为端点的矢量称为a与b的和a+b,如下中 图。
若从A点作 AB',要求 AB'的模等于|b|,方向与b相反,即 AB' =-b,则以O为起点、B’为端点的矢量称为a与b的差a-b,如
下右图。
思考:
以下定义的d绝对值为向量的模长,正负为向量的方 向。
如何判断两点是否在一条线段的两边? p4
这样只要d1*d2<0 并且 d3*d4<0 则p1p2和p3p4这两条线段必然相 交 注意: 若是等于0则要判断对应的点是否在线段上。
判断线段是否相交的模板(hdu1086)
include <iostream>
平面几何常用算法
2014.8.21
1.计算几何基础 2.凸包问题 3.旋转卡壳
2020/4/17
计算几何基础
2020/4/17
计算几何基础
1、向来自百度文库(矢量)的概念
①矢量:有方向的线段,即P1和P2的顺序是有关系的,记为:P1P2 如果P1是坐标原点,则 P1P2又称为向量P2。
②矢量的斜率:既然矢量是有方向的,那么矢量的斜率k就是有正 负之分的,具体如下:
I
II
Ⅲ
Ⅳ
计算几何基础
1、向量(矢量)的概念
③设OA =a,则有向线段 OA的长度叫做向量(矢量)a的长度或 模,记作|a|。
④夹角:两个非0矢量a、b,在空间任取一点O,作 OA=a,OB =b,
则角∠AOB叫做矢量a与b的夹角,记作<a,b>。若<a,b>=π/2,则 称a与b互相垂直,记作a⊥b。
计算几何基础
5、矢量的矢量积(叉乘、叉积) ① 矢量积的一般含义:两个矢量a和b的矢量积是一个矢量,
记作a×b,其模等于由a和b作成的平行四边形的面积,方向与平 行四边形所在平面垂直,当站在这个方向观察时,a逆时针转过 一个小于π的角到达b的方向。这个方向也可以用物理上的右手 螺旋定则判断:右手四指弯向由A转到B的方向(转过的角小于π ),拇指指向的就是矢量积的方向。
计算几何基础
5、矢量的矢量积(叉乘、叉积) ②叉积的等价定义(更实用),把叉积定义为一个矩阵的行列式 :
如图,如果 p1 p2为正数,则相对原点(0,0)来说,P1在P2的顺 时针方向;如果 p1 p2 为负数,则P1在P2的逆时针方向。 如果 p1 p2 =0,则P1和P2模相等且共线,方向相同或相反。
return true; } } return false; } double direction(point pi,point pj,point pk) //计算向量pkpi和向量pjpi的叉积 { return (pi.x-pk.x)*(pi.y-pj.y)-(pi.y-pk.y)*(pi.x-pj.x); } bool judge(point p1,point p2,point p3,point p4) //判断线段p1p2和p3p4是否相交 { double d1 = direction(p3,p4,p1); double d2 = direction(p3,p4,p2); double d3 = direction(p1,p2,p3); double d4 = direction(p1,p2,p4); if(d1*d2<0&&d3*d4<0) return true; if(d1==0&&onsegment(p3,p4,p1)) return true; if(d2==0&&onsegment(p3,p4,p2)) return true; if(d3==0&&onsegment(p1,p2,p3)) return true; if(d4==0&&onsegment(p1,p2,p4)) return true; return false; }
return x>y?x:y; } bool onsegment(point pi,point pj,point pk) //判断点pk是否在线段pi pj上 {
if(min(pi.x,pj.x)<=pk.x&&pk.x<=max(pi.x,pj.x)) {
if(min(pi.y,pj.y)<=pk.y&&pk.y<=max(pi.y,pj.y)) {
计算几何基础
3、矢量的分解
定理: 如果平面两个矢量a,b,对任一矢量p,一定存在一个且仅
一个有序实数组x,y,使得:p=xa+yb。 含义与物理上的合力或力的分解一样。 形式上看,相当于长方形的对角线。
计算几何基础
4、矢量的数量积(点乘) 两个矢量的数量积是一个数,大小等于这两个矢量的模的乘
积再乘以它们夹角的余弦。即: a·b=|a||b|cos<a,b>
using namespace std; struct point {
double x,y; }; struct segment {
point begin,end; }; double min(double x,double y) {
return x<y?x:y; } double max(double x,double y) {
数量积等于两个矢量的对应支量乘积之和。即: a·b=axbx+ayby
计算几何基础
4、矢量的数量积(点乘)
数量积的性质: ① a·e=|a||e|cos<a,e>=|a|cos<a,e> ② a⊥b 等价于 a·b=0,即axbx+ayby=0 ③ 自乘:|a|2 = a·a ④ 结合律:(λ·a)·b = λ(a·b) ⑤ 交换律:a·b = b·a ⑥ 分配律:a·(b + c) = a·b + a·c