首页 > 其他分享 >计算几何全家桶

计算几何全家桶

时间:2023-04-09 10:44:18浏览次数:43  
标签:LD return Point 全家 Vector 计算 几何 inline theta

一、准备工作

#define LD double
#define Vector Point
#define Re register int 
const LP eps=1e-8;//据说:出题的大学生基本上用的这个值
inline int dcmp(LD a){ return a<eps?-1:(a>eps?1:0); }
inline LD Abs(LD a){ return a*dcmp(a); }//绝对值
struct Point{
    LD x,y;Point(LD X=0,LD Y=0){ x=X,y=Y; }
    inline void in(){ cin>>x>>y; }
    inline void out(){ printf("%.2lf %.2lf\n",x,y); }
};

二、向量

1.模长

对于  \vec{a}=(x,y), \left | \vec{a} \right |=\sqrt{x^{2}+y^{2}}=\sqrt{\left | \vec{a} \right |^{2}}=\sqrt{\vec{a}\cdot \vec{a}}

inline LD len(Vector a){ return sqrt(Dot(a,a)); }

2.向量加减

inline Vector operator+(Vector a,Vector b){ return Vector(a.x+b.x,a.y+b.y);}
inline Vector operator- (Vector a,Vector b){ return Vector(a.x -b.x,a.y -b.y); }

3.向量数乘

对于 \vec{a}=(x,y),\lambda \vec{a}=(\lambda x,\lambda y)

除法也可以理解为数乘: \frac{\vec{a}}{\lambda }=\frac{1}{\lambda }\vec{a}=(\frac{1}{\lambda }x,\frac{1}{\lambda }y)

inline Vector operator* (Vector a,LD b){ return Vector(a.x*b,a.y*b); }

4.点积(内积)(数量积)

inline LD Dot(Vector a,Vector b){ return a.x*b.x+a.y*b.y; }

5.叉积(外积)(向量积)

inline LD Cro(Vector a,Vector b){ return a.x*b.y -a.y*b.x; }

三、点,向量的位置变换

1.点、向量的旋转

(1).对于点 P=(x,y) 或向量 \vec{a}=(x,y)​​​​​​​,将其顺时针旋转 θ 角度(点:关于原点,向量:关于起点):\begin{vmatrix} x & y \end{vmatrix} \times \begin{vmatrix} cos\theta &-sin\theta \\ sin\theta & cos\theta \end{vmatrix}=\begin{vmatrix} xcos\theta +ysin\theta & -xsin\theta +ycos\theta \end{vmatrix}

inline Point turn_P(Point a,LD theta){
    LD x=a.x*cos(theta)+a.y*sin(theta);
    LD y=-a.x*sin(theta)+a.y*cos(theta);
    return Point(x,y);
}

(2).将点A(x,y)绕点B(x0,y0)顺时针旋转θ角度:

\begin{vmatrix} (x-x_{0})cos\theta +(y-y_{0})sin\theta+x_{0} & -(x-x_{0})sin\theta +(y-y_{0})cos\theta +y_{0} \end{vmatrix}

inline Point turn_PP(Point a,Point b,LD theta){
    LD x=(a.x-b.x)*cos(theta)+(a.y-b.y)*sin(theta)+b.x;
    LD y=-(a.x-b.x)*sin(theta)+(a.y-b.y)*cos(theta)+b.y;
    return Point(x,y);
}

 

四、图形与图形之间的关系

1.点与线段

(1).判断点P是否在线段AB上:

inline int pan_PL(Point p,Point a,Point b){
    return !dcmp(Cro(p-a,b-a))&&dcmp(Dot(p-a,p-b))<=0;
}

(2).点P到线段AB的距离:

inline bool operator==(Point a,Point b){ return !dcmp(a.x-b.x)&&!dcmp(a.y-b.y); }//两点重合则坐标相等
inline LD dis_PL(Point p,Point a,Point b){
    if(a==b) return Len(p-a);
    Vector x=p-a,y=p-b,z=b-a;
    if(dcmp(Dot(x,z))<0) return Len(x);//P距离A更近
    if(dcmp(Dot(y,z))<0) return Len(y);//P距离B更近
    return Abs(Cro(x,z)/Len(z));//面积除以底边长
}

2.点与直线

(1).判断点P是否在直线AB上:

inline int pan_PL_(Point p,Point a,Point b){//判断点P是否在直线AB上
    return !dcmp(Cro(p-a,b-a));
}

(2).点P到直线AB的垂足F:

inline Point FootPoint(Point p,Point a,Point b){//点P到直线AB的垂足
    Vector x=p-a,y=p-b,z=b-a;
    LD len1=Dot(x,z)/Len(z),len2=-1.0*Dot(y,z)/Len(z);//分别计算AP,BP在AB,BA上的投影
    return a+z*(len1/(len1+len2));//点A加上向量AF
}

(3).点P关于直线AB的对称点:

inline Point Symmetry_PL(Point p,Point a,Point b){//点P关于直线AB的对称点
    return p+(FootPoint(p,a,b)-p)*2;//将PF延迟一倍即可
}

 

标签:LD,return,Point,全家,Vector,计算,几何,inline,theta
From: https://www.cnblogs.com/buleeyes/p/17299959.html

相关文章

  • 基于蛙跳算法的最优值计算matlab仿真
    1.算法描述            蛙跳算法是基于种群进化的元启发式算法之一,通过模拟自然界中青蛙觅食过程中种群所体现出的交流与合作行为,以实现对问题的求解。在一片湿地中,分布着一群青蛙,每只青蛙有自己的想法,每只青蛙的想法则被定义为一个解。每只青蛙找到食物时,都会......
  • 【转载】深入剖析三维几何内核(1)--基础
    转载深入剖析三维几何内核(1)--基础本文将对几何内核涉及的专业术语,设计理念,应用领域,以及现状做进一步的介绍。-------------------------------------------计算机中表示三维形体的模型,按照几何特点进行分类,大体上可以分为三种:线框模型、表面模型和实体模型。如果按照表示物......
  • INM379计算机游戏结构
    INM379ComputerGamesArchitecture:CourseworkSpecificationSynopsisTheaimofthecourseworkistogiveyouexperienceofusingadeployment-readyproductionframeworktoproduceafullyfunctionalgamedemonstratingsoundarchitecturalprinciplesins......
  • 计算机408考研攻略及总结
    复习资料王道单科书数据结构严蔚敏计算机组成原理白中英计算机组成原理唐朔飞计算机网络谢希仁操作系统汤子瀛真题王道真题讲解模拟题王道模拟题五轮复习法第一轮学习王道四门单科书第一轮只需要做选择题一两天搞不懂的内容直接跳过例子:组成原理的二......
  • HJ52_计算字符串的编辑距离_动态规划_动态规划可视化
    思路:该题目符合最优解拥有最优子解,符合动态规划算法要求.2思路:操作方法有3种,替换、插入、删除。把a字符串编辑成b字符串的距离。3假设空字符串开始编辑作为bottom边界。4a字符串作为深度,b作为宽度。5沿宽度遍历为add,沿深度遍历为delete,斜角为change6判断是否相......
  • 云计算技术:为什么越来越多企业选择云端存储和处理
    随着互联网的发展,云计算技术已经成为了企业存储和处理数据的首选方式。越来越多的企业选择将数据存储在云端,而不是传统的本地存储方式。那么,为什么云计算技术如此受欢迎呢?首先,云计算技术可以提供更高效的数据存储和处理方式。云计算技术可以通过虚拟化技术将多个物理服务器组合成......
  • 探索云计算技术:如何提高企业效率和降低成本
    云计算技术是当今企业信息化建设的重要组成部分,它可以帮助企业提高效率、降低成本。本文将从以下几个方面探讨云计算技术的应用。一、云计算技术的概念和特点云计算技术是一种基于互联网的计算模式,它将计算资源、存储资源和应用程序等服务通过互联网提供给用户。云计算技术的特......
  • 云计算技术:未来企业发展的必备利器
    随着数字化时代的到来,企业对于数据的需求越来越大,而云计算技术的出现,为企业提供了更加高效、安全、便捷的数据存储和处理方式。云计算技术已经成为了未来企业发展的必备利器,下面我们来深入探讨一下。一、云计算技术的定义和特点云计算技术是一种基于互联网的计算方式,通过将数据......
  • 计算机网络通信
    今日目标理解OSI和TCP/IP分层模型理解数据封装与解封、数据传输过程掌握数制转换方法掌握IP地址及其分类/子网掩码及其作用 1、第一台多用途电子计算机:1946.2.14美国宾夕法尼亚大学计算导弹的弹道30人占地170平方重量30吨 2、1957年苏联卫星上天3、1969年-------......
  • 【开源免费】ChatGPT-Java版SDK重磅更新至1.0.10版,支持Tokens计算,快来一键接入。
    简介ChatGPTJava版SDK开源地址:https://github.com/Grt1228/chatgpt-java,目前收获将近1000个star。有bug欢迎朋友们指出,互相学习,所有咨询全部免费。最新版:1.0.10<dependency><groupId>com.unfbx</groupId><artifactId>chatgpt-java</artifactId><version......