二维计算几何的一些总结

以下均在二维平面中
∗ 与 × *与\times ×运算非向量都表示乘法
1.向量
假设 A ⃗ ( x 1 , y 1 ) , \vec A(x_1,y_1), A (x1,y1), B ⃗ ( x 2 , y 2 ) ; z \vec B(x_2,y_2);z B (x2,y2);z为任意实数
A ⃗ + B ⃗ = ( x 1 + x 2 , y 1 + y 2 ) \vec A +\vec B=(x_1+x_2,y_1+y_2) A +B =(x1+x2,y1+y2)
A ⃗ − B ⃗ = ( x 1 − x 2 , y 1 − y 2 ) \vec A-\vec B=(x_1-x_2,y_1-y_2) A B =(x1x2,y1y2)
A ⃗ ∗ x = ( x 1 ∗ z , x 2 ∗ z ) \vec A*x=(x_1*z,x_2*z) A x=(x1z,x2z)
A ⃗ / x = ( x 1 / z , x 2 / z ) \vec A / x=(x_1/z,x_2/z) A /x=(x1/z,x2/z)
A ⃗ ∗ B ⃗ = x 1 ∗ x 2 + y 1 ∗ y 2 = ∣ A ⃗ ∣ × ∣ B ⃗ ∣ × c o s ( r a d ) \vec A * \vec B=x_1*x_2+y_1*y_2=|\vec A| \times|\vec B| \times cos(rad) A B =x1x2+y1y2=A ×B ×cos(rad)
(其中rad向量A向量B的夹角)
A ⃗ × B ⃗ = x 1 × y 2 − x 2 × y 1 = ∣ A ⃗ ∣ × ∣ B ⃗ ∣ × s i n ( r a d ) \vec A \times \vec B=x_1 \times y_2-x_2\times y_1=|\vec A| \times|\vec B| \times sin(rad) A ×B =x1×y2x2×y1=A ×B ×sin(rad)
(其中rad向量A向量B的夹角)

其中点积满足交换律和结合律,但叉积只满足结合律

点积几何意义:向量在另一向量投影的长度 乘 另一向量的长度
叉积几何意义:两向量所围成的有向平行四边形面积(可以为负)

LRJ模板好

定义向量

struct Point{
	double x,y;
	Point (double xx=0,double yy=0){x=xx,y=yy;}
}typedef Point Vector;

向量的运算

inline Vector operator + (const Vector &A,const Vector &B){return Vector(A.x+B.x,A.y+B.y);}
inline Vector operator - (const Point &A,const Point &B){return Vector(A.x-B.x,A.y-B.y);} //点-点=向量
inline Vector operator * (const Vector &A,const double x){return Vector(A.x*x,A.y*x);}    //向量的数乘
inline Vector operator / (const Vector &A,const double x){return Vector(A.x/x,A.y/x);}

向量的点积与叉积

inline double Dot(const Vector &A,const Vector &B){return A.x*B.x+A.y*B.y;}//点积
inline double Cross(const Vector &A,const Vector &B){return A.x*B.y-A.y*B.x;}//叉积

向量的模长

将点积公式代入入两个相同的向量即可(或直接使用两点间距离公式)

inline double length(const Vector &X){return sqrt(Dot(X,X));}

求两直线交点

每一条直线都可以表示为 P + v ⃗ t P+\vec vt P+v t
其中 P P P为直线经过的一点, v ⃗ \vec v v 为直线方向的向量

inline Point GLI(Point P,Vector v,Point Q,Vector w){
	Vector u=P-Q;
	double t=(w^u) / (v^w);
	u=v*t;
	return u+A;
}

证明提示:根据代码画图,联系叉积几何意义,可发现两个同底的平行四边形

点到直线的距离

直线上任取两点 A , B A,B A,B,设该点为 P P P
将叉积公式变形: s i n ( r a d ) = A P → × A B → ∣ A ∣ ∗ ∣ B ∣ sin(rad)=\frac{\overrightarrow{AP} \times \overrightarrow{AB}}{|A|*|B|} sin(rad)=ABAP ×AB
则距离为: s i n ( r a d ) ∗ ∣ A ∣ sin(rad)*|A| sin(rad)A

double Disline(Point A,Point B,Point x){
	Vector v1=x-A,v2=B-A;
	 return fabs(Cross(v1,v2))/length(v2);
}

点到线段的距离

设该点为 P P P,线段两端点分别为 A , B A,B A,B

  1. 点在该线段左方,则有 A P → ∗ A B → < 0 \overrightarrow{AP} * \overrightarrow{AB}<0 AP AB <0 (点积几何意义)
  2. 点在该线段右上方类比可得
  3. 不属于上述情况则与点到直线距离相同
double Dis(Point l,Point r,Point x){
	if (l==r)	return length(x-l);
	Vector v1=x-l,v2=r-l,v3=x-r;
	if (dcmp(Dot(v1,v2))<0)	return length(v1);
	else    if (dcmp(Dot(v2,v3))>0)	length(v3);
	else    return fabs(Cross(v1,v2))/length(v2);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值