弱校的奋斗之计算几何之旅(1)——向量的引入

RK3588s Camera ISP调优详解(一)ISP调试工具及环境配置(附下载途径) 本文主要介绍了rkisp tuner工具的连接与使用,并附上了工具及依赖库的下载地址 阅读详情

接触ACM大概有一年了,这一年来,学习了不少算法,但是,像我们这种弱校,教练是挂名的,算法都是师兄们一代又一代流传下来的,基本上师兄们会什么算法,就教我们什么算法了。我记得我高中的数学老师说过:“你们要超越老师,不然一代又一代传下去,会一直衰落的。”我们师兄流传下来的算法基本上都是图论,数据结构。而数论、几何这些方面存在着一个很大的缺口,每次遇到这类型的题目也只能望而生畏了。于是我决定要向这些方向进军,尝试找到新的突破。即使是弱校,也不能阻止我们热爱ACM。

计算几何

我看了算法导论和lrj的黑书,虽然黑书上有些地方暂时还没看懂,但是还算略有小成。

 

1、点、线段的表示:

点的坐标表示我么很容易想到用结构体:

typedef struct _point
{
	int x,y;
}Point;


而线段,我们可以用两个点表示。

 

2、如何判断两条直线、线段是否相交:

用高中解析几何的知识我们很容易想到判断两条直线是否相交,只需要用求出两条直线的斜率,判断斜率是否相等就行了。如果是线段,只需要求出两直线交点,判断是否在两条线段两端点之间就行。然而,实际上由于在求斜率和交点时浮点型的数值运算需要考虑精度问题,而且不能体现算法的美。

在计算几何中,我们常常将问题转化为向量的关系。

假设向量a=(x1,y1),向量b=(x2,y2),只需要判断x1*y2-x2*y1是否等于0就可以判断两直线是否相交了。

但是对于线段,我们要怎样判断是否相交呢?

我们先在这里引入“向量的左右”这一个概念。如下图1,假设我们咱在向量p0p1的起点p0,面向p0p1向量的正方向,走手边即左侧,右手边为右侧。

位于向量逆时针方向的向量,我们称之为“右手螺旋”,如上图2,反之成为“左手螺旋”,如上图3。

我们在判断两线段是否相交时,只需要判断两向量是否相互“跨越”对方。所谓跨越,即一个向量的两个端点分别位于另一个向量的左右手方向。如下图:

图4中,两向量并没有相互“跨越”,因为p0和p1同时在向量p2p3的右侧。图5中,两向量互相“跨越”了对方,所以我们就可以说线段p0p1和线段p2p3相交了。

 

3、点积和叉积:

但是,我们该如何表示点在向量的左右方向呢?

这是我们介绍一个在计算几何里很重要的运算:点积和叉积。

回忆高中所学的知识,假设p0为(0,0),我们知道p1Xp2是(0,0),p1,p2和p1+p2所形成的平行四边形的有面积,注意这里的是“有向面积”,如下图阴影部分。

p1Xp2 = x1y2 - x2y1 = |p1|*|p2|*sinθ

如果p1Xp2为正数,那么相对于(0,0),p2位于p1的右手螺旋方向,如果p1Xp2为负数,那么p2位于p1的左手螺旋方向。于是我们运用叉积,就能判断点在向量的左右方向了。

int cross (Point p0,Point p1,Point p2)
{//求p0p1和p0p2的叉积
    return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}

现在我们来考虑特殊情况:

假设向量中的一个点在另一条向量上,如上图7,此时,p0p1Xp0p2=0,此时该如何判断呢?很容易能想到只要用坐标判断p2是否在p0和p1之间就行。另外,我们还有另一种方法,用向量的点积能判断。

向量p1·p2 = |p1|*|p2|*cosθ,如下图:

只需要判断向量p2p0和p2p1的点积就能判断点是否在线段上。当点积小于0,表示p2在线段p0p1上,当点积大于0,表示不在线段上。

【点云语义分割】Ubuntu20.04下RangeNet++环境配置与实战指南 本文详细介绍了在Ubuntu20.04系统下配置和运行RangeNet++点云语义分割模型的完整实战指南。内容涵盖从Cuda、cudnn到TensorRT的深度学习环境搭建,RangeNet++源码编译的详细步骤与常见问题解决,以及如何运行首个分割Demo并可视化结果。最后,还探讨了处理自定义点云数据格式和进行性能调优的进阶技巧,旨在帮助开发者和研究者快速部署并应用这一先进的点云语义分割技术。 阅读详情

相关推荐

别再只跑Demo了!用MovieLens数据集完整复现一个电影推荐系统(Python/Pandas实战)

本文详细介绍了如何利用MovieLens数据集从零构建一个完整的电影推荐系统,涵盖数据清洗、特征工程、推荐算法实现(协同过滤和矩阵分解)以及Web服务部署的全流程。通过Python和Pandas实战,读者可以掌握推荐系统的核心技术和生产环境部署技巧,不再局限于简单的Demo运行。

weixin_29062865的博客 149

向量的创建和引用

y = logspace(a,b,n) 在 10 的幂 10^ a 和 10^b(10 的 N 次幂)之间生成 n 个点。y = linspace(x1,x2,n) 生成 n 个点。这些点的间距为 (x2-x1)/(n-1)。可用空格或者逗号生成行向量,分号生成列向量。向量进行加减乘除时,矩阵维度必须一致。

weixin_61839295的博客 408

【论文精度】生成式预训练模型——BART(Bidirectional and Auto-Regressive Transformers)

​ BART是一个预训练的seq2seq的去噪自编码(denoising autoencoder)模型,BART以下方式进行训练①用任意的噪声函数(noising function)去破坏文本;②学习一个模型来重建原始文本。它使用一个标准的基于transformer的神经机器翻译架构,可以看作是BERT(双向编码器)、GPT(left-to-right解码器)以及其他预训练方案的推广。

weixin_45828972的博客 7447

05-向量的意义_n维欧式空间

05-向量的意义_n维欧式空间

d8958的博客 2332

附录B:Standard Delay Format(SDF)(上)

本附录将介绍标准延迟标注格式,并说明了如何在仿真中执行反标。 延迟格式描述了设计网表的单元延迟和互连走线延迟,无论设计是用两种主要硬件描述语言(VHDL或Verilog HDL)中的哪一种所描述的。 本章还会介绍仿真的反标(backannotation),STA的反标其实是一个简单直接的过程,其中DUA中的时序弧将由SDF所指定的延迟进行标注。

To the beyond and infinity! 5410

雷达回波仿真

文章目录前言一、基础理解1.慢时间维度和快时间维度2.脉冲压缩3.MTI4. 脉冲多普勒处理5.cacfar检测二、具体流程1.产生回波信息加入目标时延以及噪声2.解调回波得到基带信号3.脉冲压缩 MTI MTD cafar检测 前言 雷达算法仿真学习,主要流程包括生成目标回波,将基带信号加在载波上其次是加上目标信息和干扰信号后发射,解调回波信号得到基带信号然后MTI,MTD,最后再检测。 一、基础理解 1.慢时间维度和快时间维度 连续M个脉冲回波经过相干解调之后的基带数据形成的一个二维数据矩阵,.

qq_42961235的博客 1万+

第二章 向量

目录 第二章 向量 2.1什么是向量,为什么引入向量 2.2向量的更多术语和表示方法 2.3向量的基本运算 向量加法 向量乘法 2.4向量运算的基本性质 2.5零向量 第二章 向量 2.1什么是向量,为什么引入向量 a.什么是向量,为什么引入向量? 一组数的基本表示方法--向量(Vector) 向量是线性代数研究的基本元素 一个数:666 一组数:(6,66,666...

子非愚的博客 506

地磁场仿真与导航方案设计

地磁场仿真与导航方案设计 地磁场作为地球的固有资源,为航空、航天、航海提供了天然的坐标,可应用于航天器、航空飞行器和舰船等载体的定位、定向及姿态控制。本文依据地磁场的球谐模型,利用Matlab工具,设计了计算任意地点地磁场的程序,对仿真结果与实际数据进行对比分析;并选定一组卫星的数据,结合卫星的运动轨道,描绘90分钟内卫星处地磁总强度/矢量随轨道变化曲线,据此设计一种卫星地磁导航方案。 一、地磁场计算原理 1.1.球谐模型与球谐系数 地磁学的基本问题之一就是用数学表达式将地磁要素的地面分布表示成地理坐标的函

PRQKKK的博客 7408

mahout学习之聚类(1)——向量的引入与距离测度

聚类的基本概念聚类就是将一个给定的文档集中的相似项目分成不同簇的过程,可以将簇看作一组簇内相似而簇间有别的项目的集合。 对文档集的聚类涉及以下三件事: 1. 一个算法:将文档集阻止到一起的算法 2. 相似性与不相似的概念 3. 停止的条件聚类数据的表示mahout将输入数据以向量的形式保存,在机器学习领域,向量指一个有序的数列,有多个维度,每个维度都有一个值。比如在二维空间,一个坐标就是一个

kevinjqy的专栏 868

塔石DTU通过MQTT传递数据教程

塔石通过MQTT通讯上传ADL400电表用电量。

renkai721的专栏 253

外设测试 - ATAES132A 加解密芯片测试

原理 使用芯片官方提供的读写操作库,进行先写后读并校验,确认数据一致。 示例代码 int main(void) { uint8_t ret; aes132p_enable_interface(); ret = write_memory_test(); if (ret != AES132_FUNCTION_RETCODE_SUCCESS) { aes132p_disable_interface(); printf

一个软件工程师的技术笔记 858

高等数学学习笔记——第五十三讲——点与向量的坐标表示

1. 问题引入——解析几何的重要性 2. 平面解析几何——用代数关系来研究平面几何图形 3. 空间直角坐标系(符合右手法则,坐标面,卦限) 4. 空间中点的坐标 5. 空间两点的距离 6. 向量的基本概念 7. 空间向量的坐标表示(径向量、方向角、方向余弦、分量) ...

预见未来to50的专栏 5022

IPOP 使用详解 (附IPOP工具包)

IP 地址动态绑定功能;路由信息查询和配置功能;MAC 地址信息查询和修改功能;MAC 、主机信息扫描功能;本机网络报文统计功能;本机端口列表、远程端口扫描功能;端口映射功能;网卡流量统计功能;本机 IP 报文捕获和发送功能;终端控制功能(支持 telnet 、 dos、 ssh、 sftp 、ftp、com 等协议);TCL 脚本支持;多种服务功能( tcp/udp/ping/telnet/ftp/tftp/web/team/syslog/smtp );

悦分享 1万+

利用matlab把向量b插入到a中

自定义函数,函数为: function vectorA = insertBIntoA(vectorA, location, vectorB) % 把向量vectorB插入到向量vectorA中,插入位置为location之后 lenA = length(vectorA); lenB = length(vectorB); vectorA(location + lenB + 1 :

认知 行动 坚持 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

解题报告-HDOJ-1162(最小生成树——Prim)

题意: Eddy画了画像,由几个点组成,求解出能把所有点连接在一起所需要的最短线的和。 这一题所涉及的内容是最小生成树,求解最小生成树的方法可以使用普林姆和克鲁斯卡尔两种方法, 这里介绍一下普林姆算法的思想。 假设有如下图1: 点集a1 = {a,b,c,d,e},a2为空集,普林姆算法需要空集a2加入点集a1中的点,同时集合a1去 掉该点,直至a1为空集。假设我们从点a开

勤奋也是一种天赋 5574

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

解题报告-HDOJ-2063(最大二分匹配-匈牙利算法)

匈牙利算法: 找一条已经被匹配上的边和未被匹配上的边相互交替的路径,这条路径长度为奇数并且未被匹配上的边比被匹配上的边多1。通过把增广路上未被匹配上的边改为匹配上的边,而匹配上的边全部改为未被匹配上的边,就可以把匹配数加1。重复此操作直到再也找不到这样的路径。 例如: 第一步:我们从点a找到了与a有路径的点d,由于点d没有匹配到,所以直接添加a、d边。 第二步:搜索点b,通过b点找到d

勤奋也是一种天赋 1463

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

解题报告-HDU 2892 (计算几何)

http://acm.hdu.edu.cn/showproblem.php?pid=2892 感觉有点恶心的几何,搞了差不多一天才过。 题目说的是给出原始的坐标,还有飞行速度和重力加速度,然后求炮弹最后毁灭的面积。 首先是求炮弹落地的坐标,这个很好求,只要有点物理基础的人都能做出来,主要是怎么求圆和多边形的交面积。 枚举每两个相邻的顶点,判断这两个顶点和两个点构成的交线和圆的关系,主要有下

勤奋也是一种天赋 1166

解题报告-HDOJ-1251(字典树)

先给大家介绍一下什么是字典树。     字典树,顾名思义,是树的一种,哈希树的变种,优点是节省存储空间,优化查询效率。     数据结构:   typedef struct _node {     Node *child[26];    //指向下一个字母,因为英文字母只有26个     int n;   //表示前缀数目     bool flag;   //表示是否以改字母结尾(

勤奋也是一种天赋 1125

解题报告-HDOJ-1285(拓扑排序)

拓扑排序算法思想: (1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它. (2)从网中删去该顶点,并且删去从该顶点发出的全部有向边. (3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止. 注:拓扑排序得到的拓扑序列不唯一。 例如: 将下图进行一次拓扑排序,输出其中的一个拓扑序列。 第一步:搜索图中入度为0的点,我们可以找到a、e,我们选择a,删去该点,同时

勤奋也是一种天赋 1109

解题报告-HDOJ-1874(单源最短路径——SPFA)

前面说过dijkstra不能对负权边进行操作,而现在介绍的SPFA算法是对dijkstra的一种改进,它可以对负权边进行处理,而且还可以判断是否存在负环。 如果存在一个点进入队列的次数超过N次,则存在负环。 下面SPFA的代码可以代替dijkstra的代码: int SPFA(int star, int end, int n) { dis[star] = 0; Q.push(

勤奋也是一种天赋 1059

解题报告-HDOJ-1874(单源最短路径——Dijkstra)

Dijkstra算法: 使用Dijkstra算法有前提条件,所有的边为正。 讲这个算法之前首先要先定义一个无穷大的量,用INF表示,而无穷大究竟是多大呢?我们知道在实际编程中,并不存在无穷大这个定义,每种数据类型都有其表示范围,而我们这里定义的无穷大,实际上是很大的整数,这个整数并不会影响到题目的其他数据。例如,题目中给定的数据为最大不超过100,而100000这个数相对于100已经很大了那么

勤奋也是一种天赋 1035

解题报告-HDOJ-1242(广度优先搜索)

题意: 在一个N*M的地图中拯救出一个被困在迷宫中的天使,地图中的“.”表示道路,“a”表示被困的天使,“r”表示天使的朋友,“x”表示守卫,“#”表示围墙(“x”和“#”貌似在题目中没有描述出来,以至于笔者纠结了很长时间)。 假设拯救出天使相当于天使的朋友跑到天使所在的位置,每移动一格,需要消耗一个单位的时间,如果道路上有士兵则需要先把士兵消灭,消灭士兵需要一个单位的时间。输出找到天使所需要

勤奋也是一种天赋 1004

解题报告-HDOJ-1233(最小生成树——kruskal)

之前我写过一个最小生成树的prim算法,当时我说过还有另一种求最小生成树的算法,那就是今天要说的——克鲁斯卡尔,如果想学习普林姆的可以翻看我前面写的博客文章http://blog.youkuaiyun.com/monkey0le/article/details/7725547。 前面说过,prim算法的思想是把点加入到另一个集合中,而kruskal恰好相反,它的思想很简单,不断找最小的边加入进去,并且保证加

勤奋也是一种天赋 944

解题报告-HDU 4325 (树状数组+离散化)

题目大意: 给你n朵花,m个查询,对于每一朵花给出这朵花的开花期,对于每一个查询,输出该时间的开花数。 题目很简单,一看就知道线段树或者是树状数组就可以做了,但是数据范围是10的9次方,数组开不了这么大,于是离散化,把10的9次方的数离散成10的5次方,题目就可以解决了。 我这里选择的是用树状数组,因为代码量少好多,因为在查询的时候,查询的时间不一定是开花期的端点,所以我把查询的时间保存下来

勤奋也是一种天赋 918

解题报告-HDU 3662 (三维凸包)

暂时还没看懂,先把模板记下来: #include #include #include #include #include #include #include #include using namespace std; #define eps 1e-7 #define MAXV 310 struct pt { double x, y, z; pt() { } pt(doub

勤奋也是一种天赋 902

解题报告-HDOJ-1385(最短路径——Floyd)

我前面写过单源点的最短路径dijkstra和SPFA算法,但是如果要求多对点之间的最短路径,那我们就需要循环n次调用dijkstra算法,其算法复杂度为O(n^3)。而对于这种多个点之间的最短路径,我们还有另一种算法:Floyd弗洛伊德算法,它的算法复杂度也为O(n^3),但是它的代码量比dijkstra简单了不少。 算法过程: 1、从任意一条单边路径开始,所有两点之间的距离是边的权,或者是无

勤奋也是一种天赋 816
上一篇: 为自己而转,弱校,加油!!——弱校ACM奋斗史
下一篇: 百度之星——2012年12月23号竞赛题目一
WellerZhao
博客等级 码龄15年 11粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值