IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 计算几何模板(C语言) -> 正文阅读

[C++知识库]计算几何模板(C语言)

最近开始学习计算几何

模板会定期更新(定期修锅

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <limits.h>
#define ll long long
#define eps 1e-8
//定义点的结构体
typedef struct point{
    double x, y;
} Point;
//判断两个浮点数是否相等
int Equals(double a, double b) {return fabs(a - b) < eps ? 1 : 0;}
//向量的长度,即原点到一个点的距离
inline double Len(Point a) {return sqrt(a.x * a.x + a.y * a.y);}
//向量加法
inline Point Add(Point a, Point b) {a.x += b.x, a.y += b.y; return a;}
//向量减法
inline Point Sub(Point a, Point b) {a.x -= b.x, a.y -= b.y; return a;}
//两个点的距离
inline double Dis(Point a, Point b) {return Len(Sub(a, b));}
//向量放缩(乘k倍)
inline Point Mul(Point a, double k) {a.x *= k, a.y *= k; return a;}
//两个向量求点积
inline double Dot(Point a, Point b) {return a.x * b.x + a.y * b.y;}
//两个向量求叉积
inline double Cro(Point a, Point b) {return a.x * b.y - a.y * b.x;}
//把一个向量顺时针旋转θ
inline Point ClockRot(Point a, Point b, double theta) {Point ans; ans.x = (a.x - b.x) * cos(theta) + (a.y - b.y) * sin(theta) + b.x, ans.y = (a.y - b.y) * cos(theta) - (a.x - b.x) * sin(theta) + b.y; return ans;}
//判断点是否在线段上
inline int j_PS(Point p, Point a, Point b) {return Dot(Sub(a, p), Sub(b, p)) <= 0.0 && Equals(Cro(Sub(a, p), Sub(b, p)), 0.0) ? 1 : 0;}
//求点到直线距离
inline double d_PL(Point p, Point a, Point b) {return fabs(Cro(Sub(a, p), Sub(b, p))) / Dis(a, b);}
//求点到线段距离
inline double d_PS(Point p, Point a, Point b) {
    if (Equals(a.x, b.x) && Equals(a.y, b.y)) return Len(Sub(p, a));
    if (Dot(Sub(b, a), Sub(p, a)) < 0.0) return Dis(a, p);
    if (Dot(Sub(p, b), Sub(a, b)) < 0.0) return Dis(a, p);
    return d_PL(p, a, b);
}
//判断点是否在直线上
inline int j_PL(Point p, Point a, Point b) {return Equals(Cro(Sub(a, p), Sub(b, p)), 0.0);}
//求点在直线上的垂足
inline Point FootPoint(point p, Point a, Point b) {double len1 = Dot(Sub(p, a), Sub(b, a)) / Dis(a, p), len2 = Dot(Sub(p, b), Sub(a, b)) / Dis(b, p); return Add(a, Mul(Sub(b, a), len1 / (len1 + len2)));}
//求点到直线的对称点
inline Point Symmetric_PL(Point p, Point a, Point b) {return Sub(Mul(FootPoint(p, a, b), 2.0), p);}
//求两条直线的交点(通过正弦定理推导公式)
inline Point cross_LL(Point a, Point b, Point c, Point d) {return Add(a, Mul(Sub(b, a), Cro(Sub(d, c), Sub(a, c)) / Cro(Sub(a, b), Sub(c, d))));}
//判断直线ab和线段cd相交(两直线的交点在线段cd上即可)
inline int j_cross_LS(Point a, Point b, Point c, Point d) {return j_PS(cross_LL(a, b, c, d), c, d);}
//判断线段ab和线段cd相交(两直线的交点分别在两条线段上即可)
inline int j_cross_SS(Point a, Point b, Point c, Point d) {Point cross = cross_LL(a, b, c, d); return j_PS(cross, a, b) && j_PS(cross, c, d);}

int main() {
    //for test

    return 0;
}

有锅评论

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-11 16:27:42  更:2021-07-11 16:29:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 15:41:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码