Lesson0423
ABS计算几何科普讲座
讲个笑话,ABS又来科普简单知识了
%%% STO szO ABS Orz OTZ %%%
之前完全没有接触过计算几何啊...ABS聚聚给我们从最简单的部分讲起,听得还是很爽的,学到了不少东西虽然最后十分钟基本梦游
主要做一个笔记作用吧,梳理一下今天学的东西顺便记录下来哪些没学好的东西明天还有机会问。
本文是将ABS大佬的课件作为大纲写下的,如有雷同,纯属有意。引用了一些课件里的原话...
0. 右手定则
如何告诉外星人哪只手套是左手的?
平面镜为什么只会翻转左右?
其实感觉ABS没解释上面两个问题
主要是作为引子吧这部分。先让我们探讨平面镜中的“我”和真实的“我”是不是一样的。用了一个这样的例子解释。
假设现在镜子前面的人是灭霸,右手戴着他的无尽手套。注意,无尽手套显然不能向手的外侧翻转,所以手套是分左右的。
镜子中的灭霸也戴着手套,但是手套是戴在“他”的左手的,两个手套不一样,可以推广到人本身,镜中人不能通过简单的旋转而与真人完全相同除非他不仅有两叶肺还有两个心脏其它器官还完全对称肺也不是对称的呢
所以,我们需要为旋转定义方向论这个“所以”的逻辑?
1. 向量基础知识
走进向量的世界
The introduction of numbers as coordinates is an act of violence.
向量是一个既有量又有数的概念。方向可以是N维的,在计算几何中主要是2维向量的相关计算。
- 向量的夹角:
参照任意角的定义,注意右手定则(大拇指指向自己手指弯曲的方向为正)。 - 向量的加减:
\[\vec a=(x_a,y_a,...) \\
\vec b=(x_b,y_b,...) \\
\vec a\pm\vec b=(x_a\pm x_b,y_a\pm y_b,...)
\] - 向量点积:
\[\vec a·\vec b=x_ax_b+y_ay_b+...=|\vec a|·|\vec b|·cos<\vec a,\vec b>
\]几何意义:\(\vec a\)在\(\vec b\)上投影长度与\(\vec b\)的长度的乘积。
满足交换律,结合率,分配率 - 二维意义下的向量叉积
\[\vec a \times \vec b=x_ay_b-y_ax_b=|\vec a|·|\vec b|·sin<\vec a,\vec b>
\]几何意义:求一个与两个向量都垂直的向量(满足右手定则),在二维情况下,叉积的值为两向量所成平行四边形的有向面积。
满足交换取反,结合律,分配率 - 向量的正交分解
为了量化一个向量,我们一般在直角坐标系内表示向量。
将向量分解为若干平行于坐标轴的向量的和就是正交分解。 - 向量的模长、夹角
cos<\vec a,\vec b>=\frac{\vec a·\vec b}{|\vec a||\vec b|}
\]
- 向量的旋转和放缩
法一:可以利用合角公式算出原向量的夹角\(\alpha\)和旋转角度\(\theta\)之和的正切值然后反三角函数求出角度,或者直接利用正切值计算降低精度损失
法二:先将向量正交分解再分别旋转最后相加
显然法二较优秀 - 向量的投影

投影长度可以利用点积的定义求,\(\vec a\)向\(\vec b\)投影得出的向量表示为\(\vec project(a,b)=\frac{\vec b(\vec a·\vec b)}{|\vec b|^2}\)
2. 向量基础运用
用向量描述二维世界
- 直线
我们一般用直线上一点和直线的方向向量描述直线。
对于一条方程为\(Ax+By+C=0\)的直线\(l\),其点向式表示为:\[\vec p=(x_0,y_0),\vec v=(B,-A)
\]直线上任意一点可以表示为\(\vec p+t\vec v\)
- 直线相交
求交点:
法一:直接设未知数解方程
法二:求直线\(l_1:(\vec p_1,\vec v_1),l_2:(\vec p_2,\vec v_2)\)的交点。
由于交点在\(l_1\)上,设交点\(O\)表示为\(\vec O=\vec p_1+t\vec v_1\)
接下来只需要改变\(t\)并判定\(O\)是否在\(l_2\)上。当\(\vec O -\vec p_2\)与\(\vec v_2\)共线时这个点在\(l_2\)上。
平行或重合的两个向量的叉积为零
所以\((\vec p_1+t\vec v_1 -\vec p_2)\times \vec v_2=0\)时判定在\(l_2\)上
解得:\(\vec O=\frac{(\vec p_1+t\vec v_1-\vec p_2)}{\vec v_1 \times \vec v_2}\vec v_1+\vec p_1\)
显然法二优秀 - 线段求交
设两线段两端点分别为\((\vec A_1,\vec B_1),(\vec A_2,\vec B_2)\)
求出\(\vec B_1-\vec A_1\)和\(\vec A_2-\vec A_1\),\(\vec B_2-\vec A_1\)的叉积,如果是一正一负表示线段\((\vec A_1,\vec B_1)\)所在直线穿过了另一条线段。
此时同理再求出\(\vec B_2-\vec A_2\)和\(\vec A_1-\vec A_2\),\(\vec B_1-\vec A_2\)的叉积即可 - 垂足
过直线外一点,做该直线的垂线,求垂足
设垂足为\(\vec p+t\vec v\),点为Q其对应的向量为\(\vec q\)
解\((\vec q-(\vec p+t\vec v))·\vec v=0\)
得\(t=\frac{(\vec q-\vec p)·\vec v}{|\vec v|^2}\)
代回得垂足对应的向量 - 点到直线距离
法一:求垂足再求距离
法二:利用叉乘
设直线的方向向量\(\vec v\),该点对应向量为\(\vec p\)
在直线上任取一点p1,求\(\vec p-\vec p1\),与\(\vec v\)作叉乘,用叉积除以\(\vec v\)的模长
即为\(\frac{|(\vec p-\vec p1) \times \vec v|}{|\vec v_1|}\) - 角平分线
法一:在\(∠O\)两射线上分别取点\(p1,p2\)使得\(|\vec {Op1}|=|\vec {Op2}|\)
利用等腰三角形的性质,取中点\(p\)即可求出角平分线
由于多次舍精度,此方法在\(∠O\)弧度接近\(\pi\)时误差极大
法二:直接旋转
效果极为优秀 - 平面反射
已知平面法向量,求一条射线关于平面的反射射线
法向量:垂直于平面的向量,在二维中即为垂直于直线的向量
这个方法比较多
最好的方法还是直接求角度旋转xixi - 多边形三角剖分
有向三角形剖分:任选一个起点\(O\),将多边形剖分为若干有向三角形(想想我们是怎么求多边形面积的) - 多边形面积
将多边形三角剖分后求出各个三角形的有向面积相加就好了,容易证明正确性。 - 多边形重心
将多边形有向三角剖分,逐个求出三角形重心再合成出原多边形重心。 - 判断点是否在多边形内(任意多边形)
法一(射线法):从点引出一条射线算出其和多边形的边相交次数,奇数在内,偶数在外
这种方法需要避免射线直接经过点的情况,会带来特判的麻烦。
法二(环路法):以这个点为原点,有向三角剖分后每个三角形原点对应的角度之和。如果和为\(0\)则在三角形内,反之不在
显然这种方法得到的和只能是\(0\)或\(\pm2\pi\)
形象的说,把一个小人放在这个点上,小人盯着一个在多边形上的点遍历多边形一遍,如果小人的头扭了\(360°\)显然就在多边形内,反之不在。 - 圆点切线

偷懒了偷懒了。感觉直接看课件会比较简单易懂 - 圆线交点

- 圆圆交点

- 三点定圆
法一:求两个中垂线求交点再求半径
法二:直接暴力解方程
先就写到这里吧,以后讲了或者有新理解再来改。打了我三节半晚自习呢害
本人弱鸡一枚理解不到位欢迎挑刺
Lesson0423的更多相关文章
随机推荐
- Mac下安装安装selenium与安装chromedriver安装
开发环境:MacOS,Python3.7 1. 安装selenium 可以使用pip安装(pip install selenium)或者使用pycharm进行安装下载 2. 运行如下代码: from ...
- 11g数据库使用DBUA升级Exadata数据库至12c
DB Name: GRPSource DB: 11.2.0.3 Target DB: 12.1.0.2 11g数据库使用DBUA升级Exadata数据库至12c前提条件: 0.需要11g源数据库fu ...
- 3.Metasploit攻击流程及命令介绍
Metasploit 进阶第一讲 攻击流程及命令介绍 01.渗透测试过程环节(PTES) 1.前期交互阶段:与客户组织进行交互讨论,确定范围,目标等 2.情报搜集阶段:获取更多目标组织信 ...
- Kafka监控:主要性能指标
Kafka是什么? Kafka是一个分布式,有分区的,有副本的日志服务系统,由LinkedIn公司开发,并于2011年开源.从本质上来说,Kafka拥有一套可扩展的发布/订阅消息队列架构,并组成了一套 ...
- javascript原生 实现数字字母混合验证码
实现4位数 数字字母混合验证码(数字+大写字母+小写字母) ASCII 字符集中得到3个范围: 1. 48-57 表示数字0-9 2. 65-90 表示大写字母 3. 97-122 表示小写字母 范围 ...
- jdk1.8 新特性之Stream
--------------------- 作者:码农农码一生 来源:CSDN 原文:https://blog.csdn.net/chenhao_c_h/article/details/8069128 ...
- PTA数据结构与算法题目集(中文) 7-10
PTA数据结构与算法题目集(中文) 7-10 7-10 公路村村通 (30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低 ...
- 从JDK源码学习Hashmap
这篇文章记录一下hashmap的学习过程,文章并没有涉及hashmap整个源码,只学习一些重要部分,如有表述错误还请在评论区指出~ 1.基本概念 Hashmap采用key算hash映射到具体的valu ...
- spring08
这里主要学习的是关于spring之后中与ioc不同的aop技术:面向切面编程是spring基石之一: 解决代码混乱文体,代码分散,当部分修改时,要逐个修改当更多的日志以及验证介入之后会使代码变得更加的 ...
- python基本知识点if、while、等等
给予Python的相关知识点: 主要是对于基本语句的相关使用if else while for等先关的应用,以及步骤如下: 尝试编程如下:还有就是对于 import math import rando ...