[从头学数学] 第269节 [计算几何] 点在多边形内
2016-09-21 15:59
253 查看
剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年09月21日 10:28:35, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[计算几何]]。
<span style="font-size:18px;">#
class Polygon():
#格式:path = [[-6, 9], [8, -7], [8, 3], [-6, 9]]
def __init__(self, path):
if (path[-1] != path[0]):
path.append(path[0]);
self.path = path;
#顶点数量
self.vertNum = len(self.path)-1;
self.vertex = [];
self.edge = [];
self.vertexCalc();
self.edgeCalc();
def vertexCalc(self):
for i in range(self.vertNum):
self.vertex.append(Point(self.path[i]));
def getVertex(self):
return self.vertex;
def edgeCalc(self):
for i in range(self.vertNum):
self.edge.append(SegLine(self.path[i], self.path[i+1]));
def getEdge(self):
return self.edge;
def pointInPolygon(self, point):
#测试点左右两边截多边形的各边,得到的交点数都为奇数,说明测试点在多边形内
#反之在外面
oddNodes = False;
#点在多边形的边上
if (Point(point) in self.vertex):
return oddNodes;
x, y = point[0], point[1];
j = self.vertNum - 1;
for i in range(self.vertNum):
p1 = self.vertex[i].value();
p2 = self.vertex[j].value();
px1, py1 = p1[0], p1[1];
px2, py2 = p2[0], p2[1];
if (((py1 < y and py2 >= y) or (py2 < y and py1 >= y)) and \
(px1 <= x or px2 <= x)):
if ((px1+(y-py1)/(py2-py1)*(px2-px1)) < x):
oddNodes = not oddNodes;
j = i;
return oddNodes;
def tmp13():
#主端点
mainVert = [[[-10, -9], 0], [[-2, -9], 1], [[2, -9], 2], [[2, -7], 3], [[8, -7], 4], [[-2, -5], 5], [[2, -3], 6], [[6, -3], 7], [[4, -1], 8], [[4, 1], 9], [[0, 3], 10], [[2, 3], 11], [[6, 3], 12], [[8, 3], 13], [[-4, 5], 14], [[0, 5], 15], [[-6, 9], 16], [[6, 9], 17]];
len_vert = len(mainVert);
poly = Polygon([[-2, -9], [6, -3], [6, 3], [2, -3], [0, 3], [-2, -9]]);
answer = None;
for i in range(len_vert):
answer = poly.pointInPolygon(mainVert[i][0]);
if answer == False:
s = '不在';
else:
s = '在';
print('点{0} {1}多边形内'.format(i, s));
#</span>
<span style="font-size:18px;">#
点0 不在多边形内
点1 不在多边形内
点2 不在多边形内
点3 不在多边形内
点4 不在多边形内
点5 不在多边形内
点6 不在多边形内
点7 不在多边形内
点8 在多边形内
点9 不在多边形内
点10 不在多边形内
点11 不在多边形内
点12 不在多边形内
点13 不在多边形内
点14 不在多边形内
点15 不在多边形内
点16 不在多边形内
点17 不在多边形内
#</span>
本节到此结束,欲知后事如何,请看下回分解。
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年09月21日 10:28:35, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[计算几何]]。
<span style="font-size:18px;">#
class Polygon():
#格式:path = [[-6, 9], [8, -7], [8, 3], [-6, 9]]
def __init__(self, path):
if (path[-1] != path[0]):
path.append(path[0]);
self.path = path;
#顶点数量
self.vertNum = len(self.path)-1;
self.vertex = [];
self.edge = [];
self.vertexCalc();
self.edgeCalc();
def vertexCalc(self):
for i in range(self.vertNum):
self.vertex.append(Point(self.path[i]));
def getVertex(self):
return self.vertex;
def edgeCalc(self):
for i in range(self.vertNum):
self.edge.append(SegLine(self.path[i], self.path[i+1]));
def getEdge(self):
return self.edge;
def pointInPolygon(self, point):
#测试点左右两边截多边形的各边,得到的交点数都为奇数,说明测试点在多边形内
#反之在外面
oddNodes = False;
#点在多边形的边上
if (Point(point) in self.vertex):
return oddNodes;
x, y = point[0], point[1];
j = self.vertNum - 1;
for i in range(self.vertNum):
p1 = self.vertex[i].value();
p2 = self.vertex[j].value();
px1, py1 = p1[0], p1[1];
px2, py2 = p2[0], p2[1];
if (((py1 < y and py2 >= y) or (py2 < y and py1 >= y)) and \
(px1 <= x or px2 <= x)):
if ((px1+(y-py1)/(py2-py1)*(px2-px1)) < x):
oddNodes = not oddNodes;
j = i;
return oddNodes;
def tmp13():
#主端点
mainVert = [[[-10, -9], 0], [[-2, -9], 1], [[2, -9], 2], [[2, -7], 3], [[8, -7], 4], [[-2, -5], 5], [[2, -3], 6], [[6, -3], 7], [[4, -1], 8], [[4, 1], 9], [[0, 3], 10], [[2, 3], 11], [[6, 3], 12], [[8, 3], 13], [[-4, 5], 14], [[0, 5], 15], [[-6, 9], 16], [[6, 9], 17]];
len_vert = len(mainVert);
poly = Polygon([[-2, -9], [6, -3], [6, 3], [2, -3], [0, 3], [-2, -9]]);
answer = None;
for i in range(len_vert):
answer = poly.pointInPolygon(mainVert[i][0]);
if answer == False:
s = '不在';
else:
s = '在';
print('点{0} {1}多边形内'.format(i, s));
#</span>
<span style="font-size:18px;">#
点0 不在多边形内
点1 不在多边形内
点2 不在多边形内
点3 不在多边形内
点4 不在多边形内
点5 不在多边形内
点6 不在多边形内
点7 不在多边形内
点8 在多边形内
点9 不在多边形内
点10 不在多边形内
点11 不在多边形内
点12 不在多边形内
点13 不在多边形内
点14 不在多边形内
点15 不在多边形内
点16 不在多边形内
点17 不在多边形内
#</span>
本节到此结束,欲知后事如何,请看下回分解。
相关文章推荐
- [从头学数学] 第275节 [计算几何] 多边形顶点的五种类型
- [从头学数学] 第283节 [计算几何] 多边形的单调块划分
- [从头学数学] 第286节 [计算几何] 多边形的布尔运算(上)
- [从头学数学] 第287节 [计算几何] 多边形的布尔运算(中)
- [从头学数学] 第278节 [计算几何] 多边形周长和面积
- [从头学数学] 第288节 [计算几何] 多边形的布尔运算(下)
- [从头学数学] 第273节 [计算几何] 多边形求交集
- [从头学数学] 第284节 [计算几何] 生成随机多边形
- [从头学数学] 第277节 [计算几何] 任意多边形的内角
- [从头学数学] 第264节 [计算几何] 点和线段
- [从头学数学] 第280节 [计算几何] 路径合并
- [从头学数学] 第281节 [计算几何] 路径分解
- [从头学数学] 第282节 [计算几何] 相邻边和相邻点
- [从头学数学] 第265节 [计算几何] 多线段求交点(扫描线法)
- [从头学数学] 第241节 计算几何 导言 凸包的例子
- [从头学数学] 第266节 [计算几何] 多线段求交点
- [从头学数学] 第267节 [计算几何] 路径规划
- [从头学数学] 第240节 计算几何 整装待发
- [从头学数学] 第270节 [计算几何] 例题数据生成
- [从头学数学] 第272节 [计算几何] 从线段集连通区域