首页 > 其他分享 >【计算几何】二维基础 (丑陋的)板子

【计算几何】二维基础 (丑陋的)板子

时间:2024-04-24 13:11:41浏览次数:16  
标签:直线 const Point int 板子 二维 operator return 丑陋

符号判断与大小比较

int sgn(int x){
	if(fabs(x)<eps)return 0;
	else if(x>=eps)return 1;
	else return -1;
}
//实数的向上取整函数
int _ceil(const double &x)
{
    long long k=ceil(x);
    while (k<x) k++;
    while (k>x+1) k--;
    return k;
}

struct Point{
	double x,y; //坐标定义 部分题目可以使用int 
	void input(){scanf("%lf%lf",&x,&y);};
	void output(){printf("%.6lf %.6lf\n",x,y);};//注意输出精度
	Point operator+(const Point &a) const {return {x+a.x,y+a.y};}//两个点相加
    Point operator-(const Point &a) const {return {x-a.x,y-a.y};}
    Point operator-() const {return {-x,-y};}
    Point operator*(const double k) const {return {k*x,k*y};}//注意k和点的先后顺序
    Point operator/(const double k) const {return {x/k,y/k};}
    double operator*(const Point &a) const {return x*a.x+y*a.y;} //Dot
    double operator^(const Point &a) const {return x*a.y-y*a.x;} //Cross
	double dis(Point a){
		return sqrt((a.x-x)*(a.x-x)+(a.y-y)*(a.y-y));
	}//两点之间距离 使用方式 b.dis(a);
};

直线

struct Line{
	Point p,v;//l=p+tv 理解的时候注意方向向量和单位方向向量的区别
};

to-left检测

//已知一点和一条直线,求点c与直线的相对位置
int to_left(Line l,Point c){
	Point a=l.p,b=l.p+l.v;
	Point X={b.x-a.x,b.y-a.y},Y={c.x-a.x,c.y-a.y};
	int ans=X.x*Y.y-X.y*Y.x;//差积
    if(abs(ans)<eps)return 0;//在直线上
    else if(ans>0)return 1;//在直线左侧
    return -1;//在直线右侧
}
//已知三个点,求点c与点AB构成的直线的相对位置
int to_left(Point a,Point b,Point c){
	Point X={b.x-a.x,b.y-a.y},Y={c.x-a.x,c.y-a.y};
	int ans=X.x*Y.y-X.y*Y.x;//差积
    if(abs(ans)<eps)return 0;//在直线上
    else if(ans>0)return 1;//在直线左侧
    return -1;//在直线右侧
}

直线交点

//判断两直线是否会有交点
bool is_intt(Line l,Point a,Point b){
	return to_left(l,a)*to_left(l,b)<=0;
}
//求两直线交点
Point getjd(Line l,Line a){
	return l.p+l.v*((a.v^(l.p-a.p))/(l.v^a.v));
}

标签:直线,const,Point,int,板子,二维,operator,return,丑陋
From: https://www.cnblogs.com/muyi-meow/p/18155058

相关文章

  • 二维矩阵、关键功能、关键质量测试
    答题纸 1、 绘制需求层次-需求方面二维矩阵。 功能质量约束业务级需求在线的房屋租赁系统,完善的房屋匹配机制。 可用性、可靠性、安全性、房源、需要移动端和网页端用户级需求用户:租赁者、管理员、房主房主:即使看到房屋的看房信息。......
  • react-native-vision-camera 扫二维码报错 [unknown/unknown] Waiting for the barcod
    1.问题:使用react-native-vision-camera库扫描解析二维码时,部分手机出现如下报错:2.解决:android/app/build.gradle文件中添加依赖:dependencies{//...implementation'com.google.mlkit:barcode-scanning:17.2.0'}3.参考:GitHub相关issues......
  • 分块(板子)
    “优雅的暴力”——分块分块是一种暴力的优化,虽然效率比线段树、树状数组等数据结构低的多\((N+Q)\sqrt{N}\),但是更加灵活。分块的思想是把整个区间分成几个部分,对于要处理的区间包括两个部分“整块”,和区间边缘的“零散块”,“零散块”直接暴力,“整块”进行整体操作即可。......
  • vue 高德地图 三维切换为二维
    在Vue中使用高德地图进行三维与二维视图的切换,可以通过操作地图实例的setMapType方法来完成。以下是一个简单的示例:首先确保安装并导入了高德地图的JavaScriptAPI。在Vue组件中,初始化高德地图,并创建地图实例。使用一个方法来切换地图的视图模式。<template><divid="map"......
  • 板子速查
    基础二分答案intfind1(intx){intl=1,r=n;while(l<r){intmid=(l+r)>>1;if(check(mid))l=mid+1;elser=mid;}returnl;}//l:第一个不满足check()性质的数。intfind2(intx){intl=1,r......
  • 【计算几何】牛客专题第二章 二维基础
    元素的表示点1.复数类·complex<int/duble>·特点:慢,自带各种运算,不怎么用2.pair·自带排序·自由度不高·基本不在几何题目中使用3.结构体(推荐,常用)自由度高,成员函数,重载运算符structPoint{ doublex,y;};向量(直接用Point)向量点积与几何意义及应用\vec{......
  • 生成小程序二维码
    publicfunctiongetCode(){$access_token=$this->getAccessToken();$width=430;//二维码宽度$page='pages/index/index';//小程序路径(pages/index/index)$scene='?type=1&user_id='.$this->auth......
  • 分块板子
    预处理voidinit(){clean();scanf("%lld",&n);for(i=1;i<=n;i++)scanf("%lld",&a[i]);sq=sqrt(n);for(i=1;i<=sq;i++){st[i]=n/sq*(i-1)+1;ed[i]=n/sq*i;}ed[sq]=n;for(i=1;i<......
  • 使用Python生成二维码
    1、背景上一次我们介绍了什么是二维码,读过这篇文章以后,相信大家对二维码已经有了一定的认识,那么有没有想过如何自己动手生成二维码呢?二维码在我们的生活与工作中,都能够做什么呢?今天我们来探讨一下用Python如何生成二维码。2、使用哪些库Python具有丰富的第三方库,能够生成二维码......
  • 数论板子
    线性筛求素数intprime[MAXN];//保存素数boolis_not_prime[MAXN]={1,1};//0和1都不是素数//筛选n以内的所有素数voidxxs(intn){for(inti=2;i<=n;++i){if(!is_not_prime[i]){//如果i是素数prime[++prime[0]]=i;......