程序设计竞赛中的计算几何——计算几何中的几何量表示

2.1 计算几何中的几何量表示

2.1.1 点的表示

二维平面中 : 横坐标x 和 纵坐标y

struct point{
	double x , y ;
}

三维中 : x , y , z

2.1.2 向量的表示

struct vec{
	point start ; 
	point end ;
} // 起始点+终止点表示法
struct vec{
	double x , y ; 
} // 以(0,0)点为起点,(x,y)表示向量终点 
1. 向量的加减法

e g : c = a + b ∣ c = a − b eg : c = a + b | c = a - b eg:c=a+bc=ab

a : ( x 1 , y 1 ) a : (x1 , y1) a:(x1,y1)
b : ( x 2 , y 2 ) b : (x2 , y2) b:(x2,y2)

向量加法法则 : a + b = ( x 1 + x 2 , y 1 + y 2 ) a + b= (x1 + x2 , y1 + y2) a+b=(x1+x2,y1+y2)
向量减法法则 : a − b = ( x 1 − x 2 , y 1 − y 2 ) a - b= (x1 - x2 , y1 - y2) ab=(x1x2,y1y2)


本文认为使用第二种方式进行向量表示将会更加简单,故本文将以第二种方法为例。

向量的加减法如下:

struct vec{
	double x , y ; 
	friend vec operator+(vec A ,vec B){
		vec C ; 
		C.x = A.x + B.x ; C.y = A.y + B.y ; 
		return C ; 
	}
	friend vec operator-(vec A , vec B){
		vec C ; 
		C.x = A.x - B.x ; C.y = A.y - B.y ; 
		return C ; 
	}
};
2. 向量的点乘

向量点乘的几何意义主要体现在以下几个方面:

  1. 计算两向量的夹角:向量点乘的结果可以用来表征或计算两个向量之间的夹角并且判断两个向量之间的夹角。

    如果两个向量a和b的点乘结果大于0,表示这两个向量的方向基本相同,夹角在0°到90°之间;

    如果点乘结果等于0,表示这两个向量正交(即垂直),夹角为90°;

    如果点乘结果小于0,表示这两个向量的方向基本相反,夹角在90°到180°之间。

  2. 投影:向量点乘还可以表示一个向量在另一个向量方向上的投影长度。

这是通过计算一个向量在另一个向量上的分量大小来实现的,该分量大小等于第一个向量的模长乘以第二个向量在第一个向量上的投影系数(即夹角的余弦值)。

a ⋅ b = ∣ a ∣ ∣ b ∣ c o s θ a · b = |a||b| cos \theta ab=a∣∣bcosθ

a : ( x 1 , y 1 ) , b : ( x 2 , y 2 ) , a ⋅ b = x 1 x 2 + y 1 y 2 a :(x1,y1) , b : (x2,y2) , a · b = x1x2 + y1y2 a:(x1,y1),b:(x2,y2),ab=x1x2+y1y2


friend long long operator*(vec A , vec B){
		long long  C ; 
		C = A.x * B.x ; C += A.y * B.y ; 
		return C ; 
} // 放在 struct vec 下 
3. 向量的叉乘

A ⃗ : ( x 1 , y 1 ) , B ⃗ : ( x 2 , y 2 ) A ⃗ × B ⃗ = x 1 ∗ y 2 − x 2 ∗ y 1 \vec A : (x1 , y1 ) , \vec B : (x2 , y2) \quad \quad \vec A × \vec B = x1 * y2 - x2 * y1 A :(x1,y1),B :(x2,y2)A ×B =x1y2x2y1

叉乘有一个非常重要性质,叉乘可以判断两个点的共线情况,

  • 叉乘为0的时候 , A ⃗ , B ⃗ 共线 \vec A , \vec B 共线 A ,B 共线
  • 叉乘 > 0 的时候 , A ⃗ , B ⃗ 的夹角在 0 − 90 度 \vec A , \vec B 的夹角在0 - 90度 A ,B 的夹角在090
  • 叉乘 < 0 的时候 , A ⃗ , B ⃗ 的夹角在 90 − 180 度 \vec A , \vec B 的夹角在90 - 180度 A ,B 的夹角在90180

在算法竞赛中一般只考虑叉乘的值的关系,所以crossProduct 返回一个 long long


long long Crossproduct(vec A , vec B ){
		long long C ; 
		C = A.x * B.y - A.y * B.x ; 
		return C ; 
}

4.向量模板

#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std ;
struct vec{
	double x , y ; 
	friend vec operator+(vec A ,vec B){
		vec C ; 
		C.x = A.x + B.x ; C.y = A.y + B.y ; 
		return C ; 
	}// vec1 + vec2 
	friend vec operator-(vec A , vec B){
		vec C ; 
		C.x = A.x - B.x ; C.y = A.y - B.y ; 
		return C ; 
	}// vec1 - vec2 
	friend long long operator*(vec A , vec B){
		long long  C ; 
		C = A.x * B.x ; C += A.y * B.y ; 
		return C ; 
	}// vec1 * vec2 点乘 
	long long Crossproduct(vec A , vec B ){
		long long C ; 
		C = A.x * B.y - A.y * B.x ; 
		return C ; 
	}// 叉乘
	double val(){
		return sqrt( x * x + y * y ) ; 
	}// vec1.val 
};
int main (){
	return 0 ; 
}
  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值