[从头学数学] 第284节 [计算几何] 生成随机多边形

来源:互联网 发布:老外看网络玄幻小说 编辑:程序博客网 时间:2024/05/18 03:18
剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。


正剧开始:
星历2016年09月29日 12:35:32, 银河系厄尔斯星球中华帝国江南行省。

[工程师阿伟]正在和[机器小伟]一起研究[计算几何]]。




<span style="font-size:18px;">#{Point([6, 9]), Point([-4, 5]), Point([2, -3]), Point([4, 1]), Point([0, 3]), Point([2, 3]), Point([8, -7]), Point([-2, -9]), Point([2, -7]), Point([-2, -5]), Point([6, 3]), Point([6, -3])}[[6, 9], [-4, 5], [2, -3], [4, 1], [0, 3], [2, 3], [8, -7], [-2, -9], [2, -7], [-2, -5], [6, 3], [6, -3]][[6, 3], [4, 1], [6, 9], [2, 3], [0, 3], [-4, 5], [-2, -5], [-2, -9], [2, -3], [2, -7], [8, -7], [6, -3]]    #把给定的坐标点阵列数组[x, y],...按照距离它们的中心点的角度进行排列    #是为了把无序排列的闭合曲线上的点进行有序排列,后续可再经过连线形成    #可填充的闭合曲线    def angularSort(self, array):        len0 = len(array);        len1 = len(array[0]);        if (len0 <= 0 or len1 != 2):            return array;        xTotal = yTotal = xCenter = yCenter = 0;        for i in range(len0):            xTotal += array[i][0];            yTotal += array[i][1];        xCenter = xTotal/len0;        yCenter = yTotal/len0;        x = y = xdiff = ydiff = 0;        arrayB = [];                for i in range(len0):            x = array[i][0];            y = array[i][1];            xdiff = x - xCenter;            ydiff = y - yCenter;            if (abs(xdiff) < 1e-4):                if (ydiff > 0):                    arrayB.append([x, y, math.pi/2]);                else:                    arrayB.append([x, y, math.pi/2*3]);            elif (xdiff >= 0 and ydiff > 0):                #第一象限                arrayB.append([x, y, math.atan(abs(ydiff/xdiff))]);            elif (xdiff < 0 and ydiff >= 0):                #第二象限                arrayB.append([x, y, math.pi-math.atan(abs(ydiff/xdiff))]);            elif (xdiff <= 0 and ydiff < 0):                #第三象限                arrayB.append([x, y, math.pi+math.atan(abs(ydiff/xdiff))]);            else:                #第四象限                arrayB.append([x, y, math.pi*2-math.atan(abs(ydiff/xdiff))]);        arrayB = sorted(arrayB, key = lambda a:(a[2], (a[0]-xCenter)**2+(a[1]-yCenter)**2));        retArray = [];        for i in range(len(arrayB)):            retArray.append(arrayB[i][:-1]);        return retArray;def tmp7():    vertex = [[[-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]];    vertNum = len(vertex);    pSet = set();    while (len(pSet) < 12):        idx = random.randint(0, vertNum-1);        pSet.add(Point(vertex[idx][0]));    print(pSet);    pList = list(pSet);    for i in range(len(pList)):        pList[i] = pList[i].value();    print(pList);    transform = geo.Transform();    pList = transform.angularSort(pList);    print(pList);#</span>



<span style="font-size:18px;">//if (1) {var r = 20;              config.setSector(1,1,1,1);                config.graphPaper2D(0, 0, r);              config.axis2D(0, 0, 250, 1.2);   //坐标轴设定                var scaleX = 2*r, scaleY = 2*r;                  var spaceX = 2, spaceY = 2;                   var xS = -10, xE = 10;                  var yS = -10, yE = 10;                  config.axisSpacing(xS, xE, spaceX, scaleX, 'X');                    config.axisSpacing(yS, yE, spaceY, scaleY, 'Y');                                        var transform = new Transform();    //顶点var a = [];for (var i = 0; i < $vertex.length; i++) {a.push($vertex[i][0]);}//显示变换                if (a.length > 0) {                    a = transform.scale(transform.translate(a, 0, 0), scaleX/spaceX, scaleY/spaceY);}var lable = [];for (var i = 0; i < 100; i++) {lable.push(i.toFixed(0));}var colorArray = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple'];var seg = [];plot.setLineWidth(5);seg = transform.scale(transform.translate($poly, 0, 0), scaleX/spaceX, scaleY/spaceY);shape.strokeDraw([].concat(seg), 'black');//主要顶点shape.pointDraw([].concat(a), 'blue', 1, 1, lable);cPoint = transform.scale(transform.translate($center, 0, 0), scaleX/spaceX, scaleY/spaceY);}//</span>

更多图片:







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

0 0
原创粉丝点击