首页 > 其他分享 >【计算几何】牛客专题第二章 二维基础

【计算几何】牛客专题第二章 二维基础

时间:2024-04-18 21:44:46浏览次数:23  
标签:直线 多边形 struct Point 射线 牛客 二维 第二章 向量

元素的表示

1. 复数类

· complex<int/duble>
· 特点:慢,自带各种运算,不怎么用

2. pair

· 自带排序
· 自由度不高
· 基本不在几何题目中使用

3.结构体

(推荐,常用)
自由度高,成员函数,重载运算符

struct Point{
	double x,y;
};

向量

(直接用Point)

向量点积与几何意义及应用

\vec{a} \bullet \vec{b} =
image

warning:投影是有向的

向量叉积

值的大小等于以a和b为平行四边形两边的一个平行四边形的面积
利用叉积可以求角度的正弦值
两个向量的叉积还是向量(垂直于这两个向量所构成平面的一个向量)
image

to-left测试

用途:判断一个点与一个直线的位置关系

与右手螺旋定则相似

image

向量的旋转

旋转的本质是线性变换

//指路3Blue1Brown

image

线段

记录两个端点(无向无序)

struct Segment{
	Point a,b;
};

判断线段相交:

跨立实验

输入两条直线AB与CD,输出两者是否相交
点A和点B在直线CD的不同侧,点C和点D在直线的不同侧

warning:退化情况 三点/四点共线情况

直线

表示方式

  1. 斜截式/点斜式:k不存在时需要特判
  2. 截距式:过原点的直线均无法表示
  3. 一般式:Ax + By + C = 0,判断两个直线相交需要高斯消元,多个直线较难处理,一般不用
  4. 点向式:常用,使用一点和一个方向向量表示直线
    也可以表示射线或者线段(对k进行限定)
struct Line{
	Point p,v;
};

(x,y)=OP + kv;

点到直线的距离:

  1. 投影+勾股定理:误差大不建议(涉及开方),但是可以求B点坐标
  2. 利用叉积

image

求两直线交点

思路:利用正弦定理和叉积,已知两个点和两个方向向量 = 已知三个内角度数和一个边长,求另外两个边长
image

多边形

多边形的表示:

本质:点的集合

struct Polygon{
	vector<Point>p;
};
  • 注意事项:
    1.点的存储顺序要有序(一般采用顺时针顺序)
    2.不一定满足凸性(可能是凹多边形
    3.注意对于第一个点和最后一个点的处理(比如边的对应)

多边形的面积

分解成若干三角形

三角剖分的思想

取平面内的一个点O
image

  • warning
    1.注意取模的位置,先求和再取模
    2.点的位置可以在多边形内和多边形外或多边形上均可
    3.对于非凸多边形公示仍然适用

判断点是否在多边形的内部

方法一:to-left测试

即在所有边逆时针构成的直线的左侧
只对凸多边形适用

方法二:光线投射算法

从该点引出一条射线,该射线与多边形有奇数个交点则在内部,否则在外部

需要讨论特判与顶点相交的情况

方法三:回转数法

面内闭合曲线逆时针绕过该点的总次数
当回转数为零的时候该点在图形的外部

  1. 计算夹角的和—利用反三角函数
    · 有精度和效率的问题

  2. 光线投射法的推广 O(n)
    · 从该点做一条射线,如果图形的边是从下往上穿+1,从上往下穿-1,当结果为0的时候点在图形外部
    一般选择水平射线

  • warning:注意特判点在多边形上的情况,当顶点在射线上的时候认为该点在射线上侧然后对应判断上下穿

用圆心与半径进行表示

struct Circle{
	Point c;
	double r;
};

标签:直线,多边形,struct,Point,射线,牛客,二维,第二章,向量
From: https://www.cnblogs.com/muyi-meow/p/18137090

相关文章

  • 2024牛客暑假多校第四场补题
    B每个堆的石子最多操作a[i]-1次#include<iostream>#include<fstream>#include<unordered_map>#include<vector>#include<cstring>#include<string>#include<queue>#include<stack>#include<algorithm>#includ......
  • 牛客网刷题hj1-hj4
    #计算字符的长度和输出最后一个字符串的长度print("计算字符的长度和输出最后一个字符串的长度-HJ1")str1=input()str1_last=str1.split()[-1]#取最后一位last_len=len(str1_last)print(last_len)#计算某个字符出现的次数print("计算某个字符出现的次数-HJ2")str2_0=input()......
  • 生成小程序二维码
    publicfunctiongetCode(){$access_token=$this->getAccessToken();$width=430;//二维码宽度$page='pages/index/index';//小程序路径(pages/index/index)$scene='?type=1&user_id='.$this->auth......
  • 使用Python生成二维码
    1、背景上一次我们介绍了什么是二维码,读过这篇文章以后,相信大家对二维码已经有了一定的认识,那么有没有想过如何自己动手生成二维码呢?二维码在我们的生活与工作中,都能够做什么呢?今天我们来探讨一下用Python如何生成二维码。2、使用哪些库Python具有丰富的第三方库,能够生成二维码......
  • 第二章 Pytorch基础
    2.1Pytorch张量学习心得:标量是0维张量向量可以表示一维张量(轴0)形状(4,)二维矩阵表示二维张量(上到下轴0,左到右轴1)形状(4,3)三维维矩阵表示三维张量(上到下轴0,左到右轴1,外到内轴2)形状(4,3,2)初始化张量importtorchx=torch.tensor([[1,2]])y=torch.tensor([[1],[2]])print(......
  • 二维字符串数组的传参时与指针互转时的问题
    二维数组如何传参二维字符串数组,转char**会导致的问题,以及编译报错要想得到正确的结果,需要按如下方式去写传参:#include<stdio.h>#include<string.h>//intchar_arr_copy(char**dest)//这样定义传参类型将导致编译报错,在低版本的编译器下或者没有报错但是得不到正确......
  • 多文件二维码生成器在线报名功能,wps在线生成二维码在线预览在线分享
    为了方便用户进行线上活动报名,我们的二维码生成器还提供了在线报名功能。您可以在生成二维码时设置报名表单,包括姓名、联系方式、报名人数等必要信息。用户扫描二维码后,即可直接填写表单并提交,实现快速报名。这一功能不仅简化了报名流程,还提高了报名效率,适用于各类线上线下活动。......
  • 编译原理(清华大学版)第二章
    第二章文法和语言符号和符号串字母表是元素的非空有穷集合字母表中的元素称为符号字母表中的符号可以组成的任何又穷序列称为符号串符号串运算:1.符号串的头尾,固有头和固有尾​ \(z=xy,只对头感兴趣则可以写为z=x...\)2.符号串的链接​ $符号串x、y,连接之后为xy;\spac......
  • 26版SPSS操作教程(高级教程第二章)
    前言#经过20多天的坚持学习,本人也终于开启SPSS高级教程的副本了,茫茫长征路,需要我们一起共同去征服;#由于导师最近布置了学习SPSS这款软件的任务,因此想来平台和大家一起交流下学习经验,这期推送内容接上一次高级教程第一章的学习笔记,希望能得到一些指正和帮助~粉丝及官方意见说......
  • 从二维数组到一维数组——探索01背包问题的动态规划优化
    文章目录题目前知背包问题二维dp数组一、思路二、解题方法三、Code一维dp数组一、思路二、解题方法三、Code总结本文将继续上一篇博客爬楼梯之后继续讲解同样用到了动态规划的01背包问题在解决动态规划问题时,我们经常面临着空间复杂度的挑战。01背包问题是一个......