计算几何

Download Report

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]月下柠檬树(不做强求)