[从头学数学] 第269节 [计算几何] 点在多边形内

来源:互联网 发布:我的淘宝网上银行付款 编辑:程序博客网 时间:2024/05/21 09:03
剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,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>

本节到此结束,欲知后事如何,请看下回分解。

0 0
原创粉丝点击