Transcript 计算几何
计算几何入门
谢其哲
边的表示1
ax+by+c
class
=0
line1
{
};
double a, b, c;
边的表示2(向量)
两点确定一条直线
class point
{
double x, y;
};
class line
{
point s, t;
};
矢量(向量)
只考虑向量的方向,大小。不考虑起点。
终点坐标减起点坐标
2),终点:(3, 5)对应矢量(2, 3)
class point
{
double x, y;
};
起点:(1,
矢量加减法
P=(x1,
y1), Q=(x2, y2)
由三角形法则或平行四边形法则
P
+ Q = ( x1 + x2 , y1 + y2 )
P
- Q = ( x1 - x2 , y1 - y2 )
矢量叉积
P × Q = x1*y2 - x2*y1
double crossProduct(point a, point b)
{
return a.x * b.y - a.y * b.x;
}
double crossProduct(double ax, double ay, double bx, double by)
{
return ax * by - ay * bx;
}
矢量叉积
平行四边形的有向面积
P
× Q < 0(Q在P的顺时针)
P
× Q > 0(Q在P的逆时针)
P
×Q=-(Q×P)
折线段的拐角
A,
B, C
右拐:AB
× AC < 0
B
A
C
左拐:AB
× AC > 0
共线:AB
× AC = 0
点是否在线段上
点(x,
y)是否在线段(x1, y1)-(x2, y2)上
y)-(x1, y1)要与(x2, y2)-(x1, y1)同向,
保证在同一直线上
向量(x,
min(x1,
x2) <= x <= max(x1, x2)
Min(y1,
y2) <= y <= max(y1, y2)
保证在线段上
判断两线段相交:跨立实验
两线段相交:相互跨立对方
P1P2跨立Q1Q2:Q1P1和Q1P2位于Q1Q2两
侧。(Q1Q2×Q1P2与Q1Q2×Q1P1异号)
P1
Q1
Q2
P2
(上图Q1Q2未跨立P1P2,所以未相交)
判断点在XX中
点是否在矩形中:判断该点在左右边和上下边
之间
点是否在圆中:离圆心距离小于等于半径
点在多边形中:射线法
判断点在多边形中:射线法
从该点往一特定方向射出一射线:
与边界交奇数次:在多边形中
与边界交偶数次:不在多边形中
射线法特殊情况
射线与多边形某条边平行
射线经过了多边形某顶点
解决方法:多次随机,直到不出现特殊情况
凸包
yi),找一个面积最小的凸多边
形,包含这n个点。
给定n个点pi(xi,
准备工作:
把n个点按x第一关键字,y第二关键字从小到大
排序。
凸包算法
维护栈s, 栈顶top
for i = 1 to n
While (top > 1 && s[top – 1], s[top], pi构成的折现不往左拐)
退栈
把pi压入栈中
m:=top
for i = n – 1 downto 1
While (top > m && s[top – 1], s[top], pi构成的折现不往左拐)
退栈
把pi压入栈中
top--; (p1重复,删除)
凸包演示
poj2318
给定一个如上的长方形箱子,中间有n条线段,
将其分为n+1个区域,给定m个玩具的坐标,统
计每个区域中的玩具个数。
对每个玩具,二分线段下标,判断在线段左边
还是右边,找到之后进行统计即可
POJ 3348
题目大意:
一农场主想用牧场上的几颗树作为栏杆将
牧场围起来防止牛逃跑,用直线将最外围的栏
杆连起来可以围出一个最大面积,已知一头牛
想要存活至少需要50平方米的面积。
凸包+面积
求凸包的面积
若求出来的点集为q[1],
q[2], …, q[m](=q[1])
O为原点
则凸包面积为有向三角形面积和的绝对值
|Oq[1]
× Oq[2] + Oq[2] × Oq[3] … +
Oq[m-1]× Oq[m]|/2
POJ 1151
给你n个矩形,求他们的总面积之和。
扫描线+线段树
面积并:Simpson算法
求f(x)在[a,b]与x轴围成的面积
直线拟合f(x):
Mid
S=(f(a)+f(b)) * (b-a)/2
= (a + b) / 2
二次曲线拟合:smipson(a,
(f(a)+4*f(mid)+f(b))*(b-a)/6
b)=
自适应的simpson算法
double
rsimpson(a, b):
If (abs(simpson(a, mid) + simpson(mid, b)simpson(a,b))<1e-10)
return simpson(a,b);
Else
return rsimpson(a, mid)+rsimpson(mid,b);
POJ 1151
给你n个矩形,求他们的总面积之和。
自适应simpson算法
补充作业
POJ
2318,1269,1696,3348,1151,
[NOI2005]月下柠檬树(不做强求)