计算几何讲义——叉积(一)

这篇文章将介绍计算几何中一个基础而重要的工具——叉积。

在这之前,我们先要解决一些基本问题。

点、线段的代码表示

结合结构体或者类的知识,这里其实很好理解,但是在具体的编码过程中怎么写,这个根据个人有很大的灵活性。

比如对于点,就可以用如下的语句表达:

struct point

{

double x , y;

}

对于线段,可以用如下的语句表达:

struct line

{

point a , b ;

}

其实在这里无论是lrj的《训练指南》还是具宗万的《算法问题实战策略》都会提到,在实际问题中我们用向量作为数据结构其实更加方便,这句话是一句总结性的话语,需要编程者随着阅历的增长才会有深刻的体会。

对于向量,有如下的表述语句:

struct vector

{

double x , y ;

}

叉积概念的引入

在平面中我们为了度量一条直线的倾斜状态,为引入倾斜角这个概念。而通过在直角坐标系中建立tan α = k,我们实现了将几何关系和代数关系的衔接,这其实也是用计算机解决几何问题的一个核心,计算机做的是数值运算,因此你需要做的就是把几何关系用代数关系表达出来。而在空间中,为了表示一个平面相对空间直角坐标系的倾斜程度,我们利用一个垂直该平面的法向量来度量(因为这转化成了描述直线倾斜程度的问题)。

叉积的定义:

注意这里的θ是根据右手法则和叉乘的顺序确定的,是具有一定的方向性,这种定义直接导致了叉乘在计算几何问题上的广泛应用。

通过这个定义式,我们马上能够很容易的得到如下的运算规律。

显然这个定义式我们不怎么喜欢,因为它代数化程度还是太浅,主要就是由于角的正弦值我们不好找,但是这丝毫不影响这个定义式在应用当中的重要性,下面我们需要解决的问题就是,找到一个等价的代数化程度更高的定义式。

叉积的行列式公式(以二维为例):

其实在这里我们就能够看到,如果说是用赋予方向性的线段(line)做向量进行叉乘,那么根据定义,我们编写的cross函数中将会出现8个变量(感兴趣的同学完全可以实现一下这个过程看看有多麻烦),这对编程者来说太过繁琐,因此我们提倡将平面几何中的线段用向量vector的形式表示出来。

之所以这么详细的引出了叉乘的定义,是因为在后面它有着各类很重要的应用。

叉积的应用

一:求解三角形(平行四边形)的面积.

那么在给出三角形三个点坐标的时候,我们就可以直接利用叉乘来计算三角形的面积,相对利用海伦公式求解,结果更加精确(减少了开根号的次数)。

我们基于这个结论可以推导出任意n边形面积的计算公式。

这里需要充分理解上文给出的关于叉积定义的①式子,即严谨的来说,用叉乘算面积也是能够算出负值的。在该图中,我们这样计算多边形的面积:

二:点定位。

还是从上文给出的①式出发,我们通过代数式的胜负和夹角正弦值的对应关系来定性的描述向量之间的位置关系。

这种定性的描述,在之后计算几何杂乱的算法中会频繁出现,包括判断线段是否相交、极角排序、凸包问题等等,因此这里一定要理解透彻。

时间: 2024-10-10 13:23:01

计算几何讲义——叉积(一)的相关文章

POJ 1106 Transmitters(计算几何:叉积)

传送门 Transmitters Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5088 Accepted: 2686 Description In a wireless network with multiple transmitters sending on the same frequencies, it is often a requirement that signals don't overlap, or at

TOYS - POJ 2318(计算几何,叉积判断)

题目大意:给你一个矩形的左上角和右下角的坐标,然后这个矩形有 N 个隔板分割成 N+1 个区域,下面有 M 组坐标,求出来每个区域包含的坐标数. 分析:做的第一道计算几何题目....使用叉积判断方向,然后使用二分查询找到点所在的区域. 代码如下: ============================================================================================================================ #

poj 1106 Transmitters (计算几何,叉积||极角排序)

Transmitters Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4817   Accepted: 2576 Description In a wireless network with multiple transmitters sending on the same frequencies, it is often a requirement that signals don't overlap, or at

【改革春风吹满地 HDU - 2036 】【计算几何-----利用叉积计算多边形的面积】

利用叉积计算多边形的面积 我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的多条射线,这样就可以把该多边形变为多个三角形,然后利用叉积求面积即可. 不过要注意,对于三角形可以简单的用叉积的绝对值的一半表示,但对于多边形不可随意将它分割成的几个三角形对应的叉积的绝对值相加,要有一定顺序才可. 对于三角形,有 [该图片来源:https://www.cnblogs.com/xie

hdoj 2036 (计算几何,叉积求面积)

改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 24179    Accepted Submission(s): 12504 Problem Description “ 改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)” 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云

《入门经典》——8.4

几道基于叉积的简单数学题目: Q:参考图片,现直角坐标系第一象限的整数点视为果树,现在我们给出三角形的三个点坐标,那么请问有多少棵果树被包在这个三角形当中(包括边界上的). 分析:其实这是一道很典型的基于穷举和叉积的计算几何问题,叉积在几何问题中应用非常广,在这里就用作点定位.具体的原理笔者已经在<计算几何及其应用>的专栏或者参考“计算几何讲义”这个专栏给出,它在计算面积.推导n凸边形的面积计算公式中都起着重要的作用. 对于这道问题,基于给出三角形的三个点我们能够首先维护出一个较大的矩形,然后

Math-summary

1.Combinatorial Mathematics 1.1 Bell Number: \(B_n\)表示元素个数为n的集合划分成若干个不相交集合的方案数 \(B_{n + 1} = \sum_{k = 0}^n C(n,k)B_k\). 1.2 Catalan Number: 递推公式: \(h_1 = 1, h_n = \frac{h_{n-1}(4n-2)}{n+1}\). 组合数公式:\(h_n = \frac{C(2n,2)}{n +1} = C(2n,n) - C(2n,n+1)\

计算几何-点积/叉积

关于本篇博文 作者 北屿 http://www.cnblogs.com/beiyuoi/ 转载请保留该文字 写在前面 个人总结的点积叉积的概念和应用qwq. 更新记录 20160521-点积/叉积定义 几何意义 运算 基础应用 性质 20160609-题目简讲-Toys 点积 点积,又名点乘积.数量积,高中数学课本必修四向量提到了 定义 \[a\cdot b=\left|a\right|\times\left|b\right|cos<a,b>\] 几何意义 \(a\)在\(b\) 上的正投影乘

[ An Ac a Day ^_^ ] CodeForces 659D Bicycle Race 计算几何 叉积

问有多少个点在多边形内 求一遍叉积 小于零计数就好了~ 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string> 7 #include<map> 8 #include<set> 9 #include<vector>