计算几何基础

计算几何入门笔记 众所周知,直线有很多种表示方法(具体看高中小蓝本第七本解析几何)。初中的物理的力的合成和向量非常相似。满足平行四边形法则。若点在线段上,套用点到直线距离的公式,否则计算。把向量放到直角坐标系中,向量即使由原点。即求出来投影,算点关于这个投影的对称点。开始之前,给出一些处理小数的方法。因为两条直线垂直的话斜率的乘积为。向量乘除法就是按照一个系数。二维平面的点用坐标系中的。证明可以用点积的方法证明。加法和减法的规则如上图。(懒得描述,直接放代码)等比例的缩小和放大。把线段开头和结尾看成。,直接用直线定义即可。 阅读详情

文章的绝大部分内容参(chao)考(xi)自Menci菊苣的blog,放在这主要是为了自己参考,做了一点点自己比较适应的改动(其实是C++水平太低看不懂233)
原blog链接:https://oi.men.ci/geometry-notes/

这里写图片描述

const double EPS=1e-10;
bool dcmp(double x,double y=0)
{
    return fabs(x-y)<EPS;
}

这里写图片描述
这里写图片描述
定义一个结构体Vec用于存储向量,同时在内部重载运算符方便使用;Pt则是点的名称;

typedef struct Vec{
    double x,y;
    Vec(double x=0,double y=0):x(x),y(y){}
    Vec operator+(const Vec v)const{
        return Vec(x+v.x,y+v.y);
    }
    Vec operator-(const Vec v)const{
        return Vec(x-v.x,y-v.y);
    }
    Vec operator*(double d)const{
        return Vec(x*d,y*d);
    }
    Vec operator/(double d)const{
        return Vec(x/d,y/d);
    }
    double form()const{
        return x*x+y*y;
    }
}Pt;

这里写图片描述

double dot(Vec a,Vec b)
{
    return a.x*b.x+a.y*b.y;
}//点乘
double cross(Vec a,Vec b)
{
    return a.x*b.y-a.y*b.x;
}//叉乘

直线:(用Line结构体存储,里面包含两个Pt类型的数据,用于表示直线上的两个点):
这里写图片描述

struct Line
{
    Pt a, b;

    Line() {} // 提供一个不需要参数的构造函数
    Line(const Pt &a, const Pt &b) : a(a), b(b) {}

    bool include(const Pt &p) const//判断点是否在直线上
    {
        return dcmp(cross(a - p, b - p));
    }

    // 两直线关系(交点个数)
    // 0 表示平行(无交点)
    // 1 表示相交(一个交点)
    // -1 表示重合(无数个交点)
    int relation(const Line &a, const Line &b)
    {
        if (a.include(b.a) && a.include(b.b)) return -1;
        else if (dcmp(cross(a.b - a.a, b.b - b.a))) return 0;
        else return 1;
    }

    // 求两直线交点(需要保证两直线有交点)
    Pt intersect(const Line &a, const Line &b)
    {
        double s1 = cross(b.a - a.a, b.b - a.a), s2 = cross(b.b - a.b, b.a - a.b);
        return a.a + (a.b - a.a) * s1 / (s1 + s2);
    }
};

Line中的relation函数用于判断两直线的关系:
这里写图片描述
intersact函数用于计算两直线的交点:
这里写图片描述

线段则用segment结构体存储,同样是包含两个Pt数据类型,但是在比较函数方面有一些不同:

// 线段(Segment),用两个点表示
struct Seg
{
    Pt a, b;

    Seg(const Pt &a, const Pt &b) : a(a), b(b) {}

    // 线段包含点(点在线段上)
    bool include(const Pt &p)
    {
        // PA × PB = 0:PA 与 PB 共线,即点在线段所在的直线上
        // PA · PB = 0:PA 与 PB 方向不同(A 和 B 分别在 P 的两边),如果 PA · PB = 0 则 P = A 或 P = B
        return dcmp(cross(a - p, b - p)) && dot(a - p, b - p) <= 0;
    }
};

这里写图片描述
这里写图片描述
(不过,线段所在的直线重合时需要特判,如果直线重合,需要保证两线段中至少有一个线段的一个端点包含在另一线段中;不重合时则求出两直线的交点,并且该交点必须同时在两条线段上才行);

多边形:
这里写图片描述
这里写图片描述

struct Poly
{
    std::vector<Pt> pts;

    bool include(const Pt &p) const//判断点是否在多边形内
    {
        int cnt = 0;
        // 判断与每条边有没有交点
        for (size_t i = 0; i < pts.size(); i++)
        {
            // 枚举相邻的每两个点
            const Pt &a = pts[i], &b = pts[(i + 1) % pts.size()];

            // 如果点 P 在边 AB 上
            if (Seg(a, b).include(p)) return true;

            // 详见图
            double d1 = a.y - p.y, d2 = b.y - p.y, tmp = cross(a - p, b - p);
            if ((tmp >= 0 && d1 >= 0 && d2 < 0) || (tmp <= 0 && d1 < 0 && d2 >= 0)) cnt++;
        }

        // 奇数的交点
        return cnt % 2 == 1;
    }
};

多边形面积:
这里写图片描述

// 多边形面积(有向面积)
double area() const
{
    double res = 0;
    for (size_t i = 0; i < pts.size(); i++)
    {
        // 枚举每两个点
        const Pt &a = pts[i], &b = pts[(i + 1) % pts.size()];
        res += cross(a, b);
    }
    return res / 2;
}

凸包:
这里写图片描述
注意:算凸包时将点记录在外部的Pt点集中,然后把计算出来的结果保存在Poly结构体中的vector中,再调用结构体中的函数计算凸包面积;与普通的多边形直接将点记录在结构体中的vector区分开!!

// 求凸包用的点
int n;
Pt a[MAXN + 1];

// 凸包极角排序的比较函数
inline bool compare(const Pt &a, const Pt &b)
{
    // 两个向量
    Vec va = a - ::a[1], vb = b - ::a[1];
    double t = cross(va, vb);
    if (!dcmp(t)) return t > 0; // OA -> OB 是逆时针,则 A 极角序在先
    else return va.norm() < vb.norm(); // norm 较小的长度较小
}

struct Poly
{
    std::vector<Pt> pts;

    // 求凸包(Convex),结果储存在自身 pts 中
    void convex()
    {
        // 找出最左下角的点
        int id = 1;
        for (int i = 1; i <= n; i++)
        {
            if (a[i].x < a[id].x || (a[i].x == a[id].x && a[i].y < a[id].y)) id = i;
        }
        if (id != 1) std::swap(a[1], a[id]);

        // 排序
        std::sort(a + 2, a + n + 1, &compare);

        // 极角序扫描
        pts.push_back(a[1]);
        for (int i = 2; i <= n; i++)
        {
            // 比较,如果最后一个点需要被删掉则弹出(pop_back)
            while (pts.size() >= 2 && cross(pts.back() - pts[pts.size() - 2], a[i] - pts.back()) <= 0) pts.pop_back();
            pts.push_back(a[i]);
        }
    }
};

完整代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>

const int MAXN = 100000;
const double EPS = 1e-8;

// 带误差比较
inline bool dcmp(double x, double y = 0)
{
    return fabs(x - y) <= EPS;
}

/* 
 * 向量(Vector)或点
 *
 * 使用原点到一个点 (x, y) 的有向线段表示向量
 * 从点 A 到点 B 的向量表示为 A - B
 */
typedef struct Vec
{
    double x, y;

    Vec(double x = 0, double y = 0) : x(x), y(y) {}

    // 相加
    Vec operator+(const Vec &v) const
    {
        return Vec(x + v.x, y + v.y);
    }

    // 相减
    Vec operator-(const Vec &v) const
    {
        return Vec(x - v.x, y - v.y);
    }

    // 数乘(伸长、缩短)
    Vec operator*(double d) const
    {
        return Vec(x * d, y * d);
    }

    Vec operator/(const double d) const
    {
        return Vec(x / d, y / d);
    }

    // 范数,用来比较长度,等于长度的平方
    double norm() const
    {
        return x * x + y * y;
    }
} Pt;

// 点乘
double dot(const Vec &a, const Vec &b)
{
    return a.x * b.x + a.y * b.y;
}

// 叉乘
double cross(const Vec &a, const Vec &b)
{
    return a.x * b.y - a.y * b.x;
}

// 线段(Segment),用两个点表示
struct Seg
{
    Pt a, b;

    Seg(const Pt &a, const Pt &b) : a(a), b(b) {}

    // 线段包含点(点在线段上)
    bool include(const Pt &p)
    {
        // PA × PB = 0:PA 与 PB 共线,即点在线段所在的直线上
        // PA · PB = 0:PA 与 PB 方向不同(A 和 B 分别在 P 的两边),如果 PA · PB = 0 则 P = A 或 P = B
        return dcmp(cross(a - p, b - p)) && dot(a - p, b - p) <= 0;
    }
};

// 直线,用两个点表示
struct Line
{
    Pt a, b;

    Line() {} // 提供一个不需要参数的构造函数
    Line(const Pt &a, const Pt &b) : a(a), b(b) {}

    bool include(const Pt &p) const
    {
        return dcmp(cross(a - p, b - p));
    }

    // 两直线关系(交点个数)
    // 0 表示平行(无交点)
    // 1 表示相交(一个交点)
    // -1 表示重合(无数个交点)
    static int relation(const Line &a, const Line &b)
    {
        if (a.include(b.a) && a.include(b.b)) return -1;
        else if (dcmp(cross(a.b - a.a, b.b - b.a))) return 0;
        else return 1;
    }

    // 求两直线交点(需要保证两直线有交点)
    static Pt intersect(const Line &a, const Line &b)
    {
        double s1 = cross(b.a - a.a, b.b - a.a), s2 = cross(b.b - a.b, b.a - a.b);
        return a.a + (a.b - a.a) * s1 / (s1 + s2);
    }
};

// 求凸包用的点
int n;
Pt a[MAXN + 1];

// 凸包极角排序的比较函数
inline bool compare(const Pt &a, const Pt &b)
{
    // 两个向量
    Vec va = a - ::a[1], vb = b - ::a[1];
    double t = cross(va, vb);
    if (!dcmp(t)) return t > 0; // OA -> OB 是逆时针,则 A 极角序在先
    else return va.norm() < vb.norm(); // norm 较小的长度较小
}

struct Poly
{
    std::vector<Pt> pts;

    bool include(const Pt &p) const
    {
        int cnt = 0;
        // 判断与每条边有没有交点
        for (size_t i = 0; i < pts.size(); i++)
        {
            // 枚举相邻的每两个点
            const Pt &a = pts[i], &b = pts[(i + 1) % pts.size()];

            // 如果点 P 在边 AB 上
            if (Seg(a, b).include(p)) return true;

            // 详见图
            double d1 = a.y - p.y, d2 = b.y - p.y, tmp = cross(a - p, b - p);
            if ((tmp >= 0 && d1 >= 0 && d2 < 0) || (tmp <= 0 && d1 < 0 && d2 >= 0)) cnt++;
        }

        // 奇数的交点
        return cnt % 2 == 1;
    }

    // 多边形面积(有向面积)
    double area() const
    {
        double res = 0;
        for (size_t i = 0; i < pts.size(); i++)
        {
            // 枚举每两个点
            const Pt &a = pts[i], &b = pts[(i + 1) % pts.size()];
            res += cross(a, b);
        }
        return res / 2;
    }

    // 求凸包(Convex),结果储存在自身 pts 中
    void convex()
    {
        // 找出最左下角的点
        int id = 1;
        for (int i = 1; i <= n; i++)
        {
            if (a[i].x < a[id].x || (a[i].x == a[id].x && a[i].y < a[id].y)) id = i;
        }
        if (id != 1) std::swap(a[1], a[id]);

        // 排序
        std::sort(a + 2, a + n + 1, &compare);

        // 极角序扫描
        pts.push_back(a[1]);
        for (int i = 2; i <= n; i++)
        {
            // 比较,如果最后一个点需要被删掉则弹出(pop_back)
            while (pts.size() >= 2 && cross(a[i] - pts[pts.size() - 2], pts.back() - pts[pts.size() - 2]) >= 0) pts.pop_back();
            pts.push_back(a[i]);
        }
    }
};

POJ1127:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int par[20];
int find(int x)
{
    return x==par[x]?x:par[x]=find(par[x]);
}
bool unite(int x,int y)
{
    x=find(x),y=find(y);
    if(x==y)return false;
    par[x]=y;return true;
}
const double EPS=1e-10;
bool dcmp(double x,double y=0)
{
    return fabs(x-y)<EPS;
}
typedef struct Vec{
    double x,y;
    Vec(double x=0,double y=0):x(x),y(y){}
    Vec operator+(const Vec v)const{
        return Vec(x+v.x,y+v.y);
    }
    Vec operator-(const Vec v)const{
        return Vec(x-v.x,y-v.y);
    }
    Vec operator*(double d)const{
        return Vec(x*d,y*d);
    }
    Vec operator/(double d)const{
        return Vec(x/d,y/d);
    }
    double form()const{
        return x*x+y*y;
    }
}Pt;
double dot(Vec a,Vec b)
{
    return a.x*b.x+a.y*b.y;
}//点乘
double cross(Vec a,Vec b)
{
    return a.x*b.y-a.y*b.x;
}
struct Line{
    Pt a,b;
    bool include(const Pt p)const{//点是否在直线上
        return dcmp(cross(a-p,b-p));
    }
    bool include1(const Pt p) const//点是否在线段上
    {
        // PA × PB = 0:PA 与 PB 共线,即点在线段所在的直线上
        // PA · PB = 0:PA 与 PB 方向不同(A 和 B 分别在 P 的两边),如果 PA · PB = 0 则 P = A 或 P = B
        return dcmp(cross(a - p, b - p)) && dot(a - p, b - p) <= 0;
    }
};
int relation(Line a,Line b)
{
    if (a.include(b.a) && a.include(b.b)) return -1;//重合
    else if (dcmp(cross(a.b - a.a, b.b - b.a))) return 0;//平行
    else return 1;//相交
}
// 求两直线交点(需要保证两直线有交点)
Pt intersect(const Line &a, const Line &b)
{
    double s1 = cross(b.a - a.a, b.b - a.a), s2 = cross(b.b - a.b, b.a - a.b);
    return a.a + (a.b - a.a) * s1 / (s1 + s2);
}
bool check(Line a,Line b)
{
    int sit=relation(a,b);
    if(sit==-1){//如果直线重合,需要保证两线段中至少有一个线段的一个端点包含在另一线段中
        if(a.include1(b.a)||a.include1(b.b)||b.include1(a.a)||b.include1(a.b))
            return true;
        else return false;
    }
    else if(!sit)return false;//如果直线平行,直接不可能
    else{
        Pt p=intersect(a,b);
        if(a.include1(p)&&b.include1(p))return true;//两直线交点必须包含在两个线段中
        else return false;
    }
}
int main()
{
    int n,i,j,k;Vec a,b;
    while(cin>>n&&n){
        Line l[20];
        for(i=1;i<=n;i++){
            cin>>a.x>>a.y>>b.x>>b.y;
            l[i].a=a;l[i].b=b;
            par[i]=i;
        }
        for(i=1;i<n;i++)
            for(j=i+1;j<=n;j++){
            if(check(l[i],l[j]))
                unite(i,j);
        }
        while(cin>>i>>j&&(i+j)){
            if(find(i)==find(j))
                cout<<"CONNECTED"<<endl;
            else cout<<"NOT CONNECTED"<<endl;
        }
    }

    return 0;
}

POJ3348:
凸包模板题:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 10005;
const double EPS = 1e-8;
// 带误差比较
inline bool dcmp(double x, double y = 0)
{
    return fabs(x - y) <= EPS;
}

typedef struct Vec
{
    double x, y;

    Vec(double x = 0, double y = 0) : x(x), y(y) {}

    // 相加
    Vec operator+(const Vec &v) const
    {
        return Vec(x + v.x, y + v.y);
    }

    // 相减
    Vec operator-(const Vec &v) const
    {
        return Vec(x - v.x, y - v.y);
    }

    // 数乘(伸长、缩短)
    Vec operator*(double d) const
    {
        return Vec(x * d, y * d);
    }

    Vec operator/(const double d) const
    {
        return Vec(x / d, y / d);
    }

    // 范数,用来比较长度,等于长度的平方
    double norm() const
    {
        return x * x + y * y;
    }
} Pt;

// 点乘
double dot(const Vec &a, const Vec &b)
{
    return a.x * b.x + a.y * b.y;
}

// 叉乘
double cross(const Vec &a, const Vec &b)
{
    return a.x * b.y - a.y * b.x;
}
struct Seg
{
    Pt a, b;

    Seg(const Pt &a, const Pt &b) : a(a), b(b) {}

    // 线段包含点(点在线段上)
    bool include(const Pt &p)
    {
        // PA × PB = 0:PA 与 PB 共线,即点在线段所在的直线上
        // PA · PB = 0:PA 与 PB 方向不同(A 和 B 分别在 P 的两边),如果 PA · PB = 0 则 P = A 或 P = B
        return dcmp(cross(a - p, b - p)) && dot(a - p, b - p) <= 0;
    }
};
int n;
Pt a[MAXN + 1];

// 凸包极角排序的比较函数
inline bool compare(const Pt &a, const Pt &b)
{
    // 两个向量
    Vec va = a - ::a[1], vb = b - ::a[1];
    double t = cross(va, vb);
    if (!dcmp(t)) return t > 0; // OA -> OB 是逆时针,则 A 极角序在先
    else return va.norm() < vb.norm(); // norm 较小的长度较小
}
struct Poly
{
    std::vector<Pt> pts;

    bool include(const Pt &p) const
    {
        int cnt = 0;
        // 判断与每条边有没有交点
        for (size_t i = 0; i < pts.size(); i++)
        {
            // 枚举相邻的每两个点
            const Pt &a = pts[i], &b = pts[(i + 1) % pts.size()];

            // 如果点 P 在边 AB 上
            if (Seg(a, b).include(p)) return true;

            // 详见图
            double d1 = a.y - p.y, d2 = b.y - p.y, tmp = cross(a - p, b - p);
            if ((tmp >= 0 && d1 >= 0 && d2 < 0) || (tmp <= 0 && d1 < 0 && d2 >= 0)) cnt++;
        }

        // 奇数的交点
        return cnt % 2 == 1;
    }

    // 多边形面积(有向面积)
    double area() const
    {
        double res = 0;
        for (size_t i = 0; i < pts.size(); i++)
        {
            // 枚举每两个点
            const Pt &a = pts[i], &b = pts[(i + 1) % pts.size()];
            res += cross(a, b);
        }
        return res / 2;
    }

    // 求凸包(Convex),结果储存在自身 pts 中
    void convex()
    {
        // 找出最左下角的点
        int id = 1;
        for (int i = 1; i <= n; i++)
        {
            if (a[i].x < a[id].x || (a[i].x == a[id].x && a[i].y < a[id].y)) id = i;
        }
        if (id != 1) std::swap(a[1], a[id]);

        // 排序
        std::sort(a + 2, a + n + 1, &compare);

        // 极角序扫描
        pts.push_back(a[1]);
        for (int i = 2; i <= n; i++)
        {
            // 比较,如果最后一个点需要被删掉则弹出(pop_back)
            while (pts.size() >= 2 && cross(a[i] - pts[pts.size() - 2], pts.back() - pts[pts.size() - 2]) >= 0) pts.pop_back();
            pts.push_back(a[i]);
        }
    }
};
int main()
{
    int i,j;
    cin>>n;
    for(i=1;i<=n;i++){
        scanf("%lf%lf",&a[i].x,&a[i].y);
    }
    Poly p;p.convex();
    cout<<(long long)p.area()/50<<endl;

    return 0;
}
【几何专题】计算几何基础 整理的算法模板合集: ACM模板 目录AcWing 2984. 线段 / POJ3304(计算几何、常用技巧转换)AcWing 2983. 玩具 / POJ 2318.toys(计算几何基础、二分、判断点和直线的位置关系) AcWing 2984. 线段 / POJ3304(计算几何、常用技巧转换) 常用技巧转换,寻找一个直线旋转 我们发现如果可以找到一个直线与所有的线段都相交,那么我们做一个垂直这个直线的垂线,所有的线段的投影一定都交于这个直线与垂线的垂足处,我们可以很轻松地画图验证这一定理。 所 阅读详情

相关推荐

计算几何算法精要:从基础到高级应用

理解几何性质:利用向量、叉积等几何概念选择合适算法:根据问题特点选择扫描线、分治等范式处理特殊情况:考虑共线、重合等边界条件优化计算效率:利用空间索引或特殊数据结构验证正确性:通过几何直观验证算法“计算几何是连接数学理论与工程实践的桥梁!通过本文的系统学习,相信你已经掌握了计算几何的核心算法和实现技巧。记住,精通计算几何的关键在于:1) 扎实的几何直观;2) 熟练的算法实现;3) 丰富的应用经验。继续探索和实践,你将成为解决复杂几何问题的专家!

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 1699

leetcode Merge Intervals & Insert Interval

典型的贪心算法 bool compare(const Interval &a,const Interval &b){ return (a.start<b.start); } class Solution { public: vector merge(vector &intervals) { int len=intervals.size();

优快云orange的专栏 832

2、计算几何基础

本文全面介绍了计算几何的基础知识,包括基本概念、几何对象表示方法、常用数据结构和核心算法。内容涵盖凸包、最近邻搜索、交点检测等关键算法,并分析了其时间与空间复杂度。同时,文章还探讨了计算几何在计算机图形学、机器人技术和地理信息系统中的实际应用,并延伸至形状复形、骨架提取以及与其他学科如拓扑学和物理学的结合。适合希望深入了解计算几何理论与实践的读者参考。

linux6sysadmin的博客 72

判定一个点在平面几何体内部的方法

 判定一个点在平面几何体内部的方法作者:learun 本文给出了判断一个点在椭圆、多边形(可以是凹边形)、矩形内部的解析方法所有断定方法为: BOOL Contains(int x, int y), 代码为C++一、椭园(也适用于园)P1(x1, y1), P2(x2, y2) 定义椭园外接矩形(左上点与右下点)CEllipse::CEllipse(int x1, int y1

leehq的专栏 2558

计算几何基础算法,方便计算几何入门

需要注意的细节 向量及其运算 外积的应用 三角形的一些性质 判断点在直线上

高通平台Camera sensor bring up!

Qualcomm Camera sensor bring up!0. 准确1. Kernel 底层驱动配置1.1 dtsi1.2 pinctrl2. Chi-Cdk XML 配置2.1 sensormodule2.2 sensor3. CHECK 本文主要针对高通平台SM7250进行描述,当然高通平台可能基本都差不多【第一个项目】 —only for sensor probe sucess. 0....

Understand-image 9239

计算几何基础入门详解

我把计算几何分为了六大块 一、计算几何基础(点,线,面) 二、计算几何凸包 三、计算几何圆形 四、计算几何旋转卡壳 五、计算几何半平面交 六、三维计算几何(本博客内容不予介绍) 一、计算几何基础 1、最开始要提一下的还是精度问题,这在计算几何中可以说非常关键!!! const double eps=1e-8; //我一般都用eps表示,控制在1e-8左右,当然有些题会有它的要求 int sgn(d...

slass-mot-odet 2693

UFS Write Booster技术解析:原理、配置与故障排查实战

在存储技术领域,缓存机制是提升I/O性能的核心手段之一,其原理是通过高速存储介质暂存数据,减少对低速主存储的直接访问,从而降低延迟、提升吞吐。Write Booster正是这一原理在UFS(通用闪存存储)规范中的具体实现,它通过引入独立的易失性高速缓存区(Write Booster Buffer),将主机写入命令快速响应与后台数据持久化分离,技术价值在于显著改善随机写入性能,消除由垃圾回收等后台操作引发的写入卡顿。该技术广泛应用于智能手机应用安装、相机连拍、固件升级(OTA)等对写入流畅性要求高的场景。本文

weixin_42561143的博客 356

计算几何基础【用图来助你理解几何算法】

计算几何基础 1.基本概念 1.1计算几何的引入 ​ 计算几何是几何学的一个重要分支,也是计算机科学的一个分支,研究解决几何问题的算法。在现代工程与数学、计算机图形学、机器人学、VLSI设计、计算机辅助设计等学科领域中,计算几何都有重要应用。 计算几何问题的输入一般是关于一组几何物体(如点、线)的描述;输出常常是有关这些物体相关问题的回答,如直线是否相交、点围成的面积等问题。 1.2 浮点数造成的误差 ​ 在学习计算几何之前,我们来回顾一下高中知识,我们求直线方程,或者是交点时,经常出现根号多少多少,以至我

qq_45249273的博客 1万+

卫星动力学仿真模型开发之AI初试

以下是通过AI生成的一个简单的C语言仿真模型,用于模拟卫星的姿态、轨道动力学和运动学。该模型基于基本的物理公式,假设卫星在近地轨道上运行,并忽略了一些复杂的扰动因素(如大气阻力、太阳辐射压等)。姿态动力学描述了卫星绕其质心的旋转运动。轨道动力学描述了卫星在引力作用下的运动。姿态运动学描述了卫星姿态随时间的变化。

xspace的博客 569

告别数据丢失焦虑:用Python手把手实现Reed-Solomon码(附完整代码)

本文详细介绍了如何使用Python实现Reed-Solomon纠错码(RS码),帮助开发者有效防止数据丢失。通过基础编解码实战、文件保护方案和高级性能优化技巧,读者可以轻松掌握这一前向纠错技术,应用于物联网、文件存储和网络传输等场景,提升数据可靠性。

weixin_42527160的博客 222

ACM 计算几何基础模板

在ACM计算几何中,我们常常重复用到许多方法,例如求点距,求直线方程,等等。不妨利用模板总结之。这些模板为我从网上学习后加入自己的理解糅合得来qwq,看了很多的博客,查了很多书籍,其中印象最深的是林夕林夕关于计算几何模板的总结,大家也可以去参考他的应该比我的更详细qwq(不过大佬最近好像出没比较少了) 所以我这个主要还是留着自己参考吧,能帮到他人再好不过了 为了不产生歧义,方便理解,本模板使用笛卡尔坐标系,封装的多是数学中常见的函数。 前置知识:高中数学 文章目录基础声明点向量直线 基础声明 首先,打acm

qq_39561693的博客 1507

深度学习分类任务中,正负样本比例失衡的5种实战解决方案(附代码)

本文深入探讨了深度学习分类任务中正负样本比例失衡的5种实战解决方案,包括智能采样技术、动态数据增强、损失函数工程、模型架构创新和训练策略优化。针对信用卡欺诈检测、医疗诊断等场景,提供了详细的代码实现和评估方法,帮助开发者有效解决样本不平衡问题,提升模型在真实场景中的表现。

h9j8k7l6m5n的博客 424

算法课程笔记——计算几何基础

算法课程笔记——计算几何基础。

2302_79123319的博客 928

24年电赛H题 | 想要小车走直线,正在调角度环,但不知道怎么把角度偏航角偏差转化成电机速度输出?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1313

SAP UI5 主题设置全解析:从启动参数到运行时切换、跨域白名单与事件监听

SAP UI5主题体系深度解析:从配置到切换的完整指南 摘要:SAP UI5主题机制远不止CSS换肤,其工程化实践涵盖启动配置、运行时API切换、跨库路径映射及安全管控等关键环节。通过bootstrap标签或URL参数设置初始主题,运行时可用Theming.setTheme无刷新切换。自定义主题需配置theme-roots路径,跨域加载需声明sap-allowed-theme-origins白名单。主题切换完成后会触发applied事件,适合执行视觉同步操作。该体系支持多品牌适配、集中式主题管理,在Fior

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 326

计算几何基础知识总结

计算几何

ha 954

Lammps不同亲疏水性粗糙表面的润湿行为模拟(包含in文件)

Lammps粗糙表面的润湿行为模拟(包含in文件)前言—润湿行为模拟一、物理模型构建二、具体in文件—in文件内循环亲疏水性三、具体in文件—分子模板构建初始模型以及平衡态模拟四、全部代码(基地粗糙表面只提供data文件) 前言—润湿行为模拟 润湿现象:当液体与固体接触时,液体的附着层将沿固体表面延伸。当接触角 θ\rm \thetaθ 为锐角时,液体润湿固体,若θ为零时,液体将展延到全部固体表面上。润湿现象的产生与液体和固体的性质有关。(来自百度百科) 润湿行为的本质是固液之间的相互作用,也就是分子间的范

Rockyoung 7093

专题十三 基础计算几何

文章目录专题十三 基础计算几何POJ 2318 TOYSPOJ 2398 Toy StoragePOJ 3304 SegmentsPOJ 1269 Intersecting LinesPOJ 1556 The DoorsPOJ 2653 Pick-up sticksPOJ 1066 Treasure HuntPOJ 1410 IntersectionPOJ 1696 Space AntPOJ 3347 Kadj SquaresPOJ 2826 An Easy Problem?!POJ 1039 PipePO

m0_49959202的博客 312

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[基础]计算几何

一、引言  计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解

outer of the space 2293

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

计算几何之基础知识及例题

计算几何(1) 注:这是我在word中写的,由于是新手,不知怎么把word中的图发上来,就直接截图了,望谅解

初学者 1493

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算几何基础知识

USACO上接触到计算几何,有点闷 先巩固一下基础 /********************************** 计算几何基础知识 **********************************/ #include #define MaxX 10000 #define EP 1e-10 #define Min(a,b) a>b?b:a #

286
上一篇: Educational Codeforces Round 43 (Rated for Div. 2)
下一篇: Codeforces Round #479 (Div. 3)
HumveeA6
博客等级 码龄17年 12粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值