计算几何全家桶(基础)
计算几何全家桶(基础)
其实只是记录一些可能会用到的非常基础的东西(懒得多次反复写了)。
一:【准备工作】
#include <bits/stdc++.h>
#define dd double
using namespace std;
const int N=1e5;const dd eps=1e-8,PI=acos(-1.0);
int jd(dd x){return a<-eps?-1:(a>eps?1:0);}//精度控制
dd ABS(dd x){return x*jd(x);}//求绝对值
struct d{
dd x,y;d(X=0,Y=0){x=X;y=Y;}
void in(){scanf("%lf%lf",&x,&y);}
void out(){printf("%.5lf %.5lf\n",x,y);}
};//结构体存点或向量 以及输入输出
没啥好说的,就是一些初始化。
二:【向量】
1.【模】
对于 ,,所以可以用下面的 点积 解决。
dd len(d a){return sqrt(dj(a,a);}//模
2.【向量加减】
对于 ,
对于 ,
d operator+(d a,d b){return d(a.x+b.x,a.y+b.y);}
d operator-(d a,d b){return d(a.x-b.x,a.y-b.y);}
3.【向量数乘】
对于 ,
对于 , (其实向量除就是向量乘的逆运算)
d operator*(d a,dd b){return d(a.x*b,a.y*b);}
d operator/(d a,dd b){return d(a.x/b.a.y/b);}
4.【向量点积(数量积)(内积)】
定义:
对于 ,
夹角 与点积的关系:
- ,
- ,
- ,
- ,
- ,
dd dj(d a,d b){return a.x*b.x+a.y*b.y;}//点积
5.【向量叉积(向量积)(外积)】
定义:
对于
向量 的位置与叉积的关系:
- 在 左侧,
- 在 右侧,
dd cj(d a,d b){return a.x*b.y-a.y*b.x;}//叉积
6.【向量夹角】
因为 ,所以
dd angle(d a,d b){return acos(dj(a,b)/len(a)/len(b));}//两向量夹角
三:【点、向量的位置变换】
1.【点、向量绕原点的旋转】
对于点或向量 ,将其顺时针旋转 度:
d turn(d a,dd theta){
dd x=a.x*cos(theta)+a.y*sin(theta);
dd y=-a.x*sin(theta)+a.y*cos(theta);
return d(x,y);
}//点或向量 A 绕原点顺时针旋转 theta 度
2.【点绕点的旋转】
对于点 绕点 顺时针旋转 度:
d turn_(d a,d b,dd theta){
dd x=(a.x-b.x)*cos(theta)+(a.y-b.y)*sin(theta)+b.x;
dd y=-(a.x-b.x)*sin(theta)+(a.y-b.y)*cos(theta)+b.y;
return d(x,y);
}//点 A 绕点 B 顺时针旋转 theta 度
3.【法向量】
对于向量 ,法向量就是垂直于向量 的向量。
联系上面的向量绕原点旋转可知,求一个向量的法向量就是将这个向量顺时针旋转 。
d Normal(d a){return d(-a.y,a.x);}//求法向量
计算几何全家桶(基础)综合代码
#include <bits/stdc++.h>
#define dd double
using namespace std;
/*--------------------------------------------*/
const int N=1e5;const dd eps=1e-8,PI=acos(-1.0);
int jd(dd x){return x<-eps?-1:(x>eps?1:0);}//精度控制
dd ABS(dd x){return x*jd(x);}//求绝对值
struct d{
dd x,y;d(dd X=0,dd Y=0){x=X;y=Y;}
void in(){scanf("%lf%lf",&x,&y);}
void out(){printf("%.5lf %.5lf\n",x,y);}
};//结构体存点或向量 以及输入输出
/*--------------------------------------------*/
dd dj(d a,d b){return a.x*b.x+a.y*b.y;}//点积
dd cj(d a,d b){return a.x*b.y-a.y*b.x;}//叉积
dd len(d a){return sqrt(dj(a,a));}//模
dd angle(d a,d b){return acos(dj(a,b)/len(a)/len(b));}//两向量夹角
/*向量四则运算*/
d operator+(d a,d b){return d(a.x+b.x,a.y+b.y);}
d operator-(d a,d b){return d(a.x-b.x,a.y-b.y);}
d operator*(d a,dd b){return d(a.x*b,a.y*b);}
d operator/(d a,dd b){return d(a.x/b,a.y/b);}
d Normal(d a){return d(-a.y,a.x);}//求法向量
bool operator==(d a,d b){return !jd(a.x-b.x)&&!jd(a.y-b.y);}//判相等
/*-------------------------------------------*/
d turn(d a,dd theta){
dd x=a.x*cos(theta)+a.y*sin(theta);
dd y=-a.x*sin(theta)+a.y*cos(theta);
return d(x,y);
}//点或向量 A 绕原点顺时针旋转 theta 度
d turn_(d a,d b,dd theta){
dd x=(a.x-b.x)*cos(theta)+(a.y-b.y)*sin(theta)+b.x;
dd y=-(a.x-b.x)*sin(theta)+(a.y-b.y)*cos(theta)+b.y;
return d(x,y);
}//点 A 绕点 B 顺时针旋转 theta 度
/*-------------------------------------------*/
int main(){}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)