[从头学数学] 第276节 [计算几何] 中心点与顶点的凹凸性

剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。


正剧开始:
星历2016年09月25日 11:26:01, 银河系厄尔斯星球中华帝国江南行省。

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




<span style="font-size:18px;">#
>>> 
顶点数量: 8
顶点集: [Point([6, 9]), Point([2.4, 5.4]), Point([0.8, 3.8]), Point([1.33, 3]), Point([2, 3]), Point([6, 3]), Point([6, 3.86]), Point([3.33, 5])]
边集: [SegLine([2.4, 5.4], [6, 9]), SegLine([0.8, 3.8], [2.4, 5.4]), SegLine([1.33, 3], [0.8, 3.8]), SegLine([1.33, 3], [2, 3]), SegLine([2, 3], [6, 3]), SegLine([6, 3], [6, 3.86]), SegLine([6, 3.86], [3.33, 5]), SegLine([3.33, 5], [6, 9])] 

边集
[1.33, 3]: [Point([2, 3]), Point([0.8, 3.8])], len =2
[2, 3]: [Point([1.33, 3]), Point([6, 3])], len =2
[6, 3]: [Point([2, 3]), Point([6, 3.86])], len =2
[0.8, 3.8]: [Point([1.33, 3]), Point([2.4, 5.4])], len =2
[6, 3.86]: [Point([6, 3]), Point([3.33, 5])], len =2
[3.33, 5]: [Point([6, 3.86]), Point([6, 9])], len =2
[2.4, 5.4]: [Point([0.8, 3.8]), Point([6, 9])], len =2
[6, 9]: [Point([3.33, 5]), Point([2.4, 5.4])], len =2
顶点集
[Point([1.33, 3]), Point([2, 3]), Point([6, 3]), Point([0.8, 3.8]), Point([6, 3.86]), Point([3.33, 5]), Point([2.4, 5.4]), Point([6, 9])]


>>> 

>>> 
操作用时:3.159e-02 s
[[3.48, 4.51], [3.73, 4.51], [2.23, 4.13], [2.21, 4.32], [3.07, 4.26], [2.73, 4.51], [5.22, 2.3], [5.72, 2.41], [1.09, 4.99], [4.13, 3.26], [5.62, 1.19], [5.67, 2.11], [5.48, 1.62], [6.12, 1.29], [5.98, 1.73], [6.1, 1.16], [6.4, 0.25], [6.38, 0.17], [6.27, 0.67], [6.06, 0.98]]
>>> 

def tmp3():
    path = [[[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [6, 3], [6, 3.86], [3.33, 5], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86], [8, 3], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.5, 1.5], [1.78, 2.33], [2, 3], [3.33, 5], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [1.78, 2.33], [2, 3], [3.33, 5], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [6, 3], [6, 3.86], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86], [6, 9]], [[6, 9], [2.4, 5.4], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [2.4, 5.4], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [2.4, 5.4], [-6, 9], [-0.37, 2.56], [0, 3], [1.33, 3], [2, 3], [3.33, 5], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [1.78, 2.33], [3.67, -0.5], [4.29, 0.43], [6, 3], [6, 3.86], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 3.86], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [4.29, 0.43], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.56, -3.33], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [5.35, -3.97], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [4, -1], [6, -3], [8, -7], [8, 3], [6, 9]]]
    len_path = len(path);

    centerArray = [];

    #计时开始
    startTime = time.clock();
    
    for i in range(len_path):
        poly = Polygon(path[i]);
        poly.genVertexTree();

        centerArray.append(poly.centerPoint());

    #计时结束
    endTime = time.clock();

    #打印结果
    print('操作用时:{0:.3e} s'.format(endTime-startTime));   

    print(centerArray);

#</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 b = [];
		for (var i = 0; i < $seg.length; i++) {
			b.push([a[$seg[i][0]], a[$seg[i][1]]]);
		}
		
				
		var edges = b.length;
		for (var i = 0; i < edges; i++) {
			shape.multiLineDraw([].concat(b[i]), 'red');
		}*/
		
		var colorArray = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple'];
		var seg = [];		
		
		var idx = xGlobal;
		var len = $path2.length;

		plot.setLineWidth(3);

		seg = transform.scale(transform.translate($path2[idx%len], 0, 0), scaleX/spaceX, scaleY/spaceY);
		shape.multiLineDraw([].concat(seg), 'pink');
		
		cPoint = transform.scale(transform.translate($center, 0, 0), scaleX/spaceX, scaleY/spaceY);
		
		shape.pointDraw([].concat([cPoint[idx%len]]), 'red');
		

		/*
		//次要顶点
		var b = [];
		
		for (var i = 0; i < 6; i++) {	
			b = [].concat($pointType[n][i]);
			//显示变换        
			if (b.length > 0) {        
				b = transform.scale(transform.translate(b, 0, 0), scaleX/spaceX, scaleY/spaceY);
				shape.pointDraw([].concat(b), colorArray[(i-1)%7]);
			}

			
			
		}*/
		
		//主要顶点
		shape.pointDraw([].concat(a), 'blue', 1, 1, lable);		

	}

//</span>


下面各图中红色的为中心点,橙色的为凹顶点,事实证明,中心点的位置与多边形的凹凸性,与顶点的凹凸性,没有任何关系。


路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [6, 3], [6, 3.86], [3.33, 5]]
凹点: [[3.33, 5]]
凸点: [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [6, 3], [6, 3.86]]


路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86], [8, 3]]
凹点: [[3.33, 5], [6, 3.86]]
凸点: [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [8, 3]]



路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.5, 1.5], [1.78, 2.33], [2, 3], [3.33, 5]]
凹点: [[0.8, 3.8], [2, 3], [3.33, 5]]
凸点: [[6, 9], [2.4, 5.4], [0, 3], [1.5, 1.5], [1.78, 2.33]]



路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [1.78, 2.33], [2, 3], [3.33, 5]]
凹点: [[0.8, 3.8], [1.33, 3], [2, 3], [3.33, 5]]
凸点: [[6, 9], [2.4, 5.4], [0, 3], [1.78, 2.33]]



路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [6, 3], [6, 3.86]]
凹点: [[0.8, 3.8]]
凸点: [[6, 9], [2.4, 5.4], [0, 3], [6, 3]]



路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86]]
凹点: [[0.8, 3.8], [3.33, 5]]
凸点: [[6, 9], [2.4, 5.4], [0, 3], [2, 3], [6, 3.86]]



路径: [[6, 9], [2.4, 5.4], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3]]
凹点: [[3.33, 5], [6, 3]]
凸点: [[6, 9], [2.4, 5.4], [2, 3], [6, -3], [8, -7], [8, 3]]



路径: [[6, 9], [2.4, 5.4], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3.86]]
凸点: [[6, 9], [2.4, 5.4], [3.33, 5], [6, -3], [8, -7], [8, 3]]



路径: [[6, 9], [2.4, 5.4], [-6, 9], [-0.37, 2.56], [0, 3], [1.33, 3], [2, 3], [3.33, 5]]
凹点: [[2.4, 5.4], [0, 3], [3.33, 5]]
凸点: [[6, 9], [-6, 9], [-0.37, 2.56], [2, 3]]



路径: [[6, 9], [3.33, 5], [2, 3], [1.78, 2.33], [3.67, -0.5], [4.29, 0.43], [6, 3], [6, 3.86]]
凹点: []
凸点: [[6, 9], [3.33, 5], [2, 3], [1.78, 2.33], [3.67, -0.5], [4.29, 0.43], [6, 3]]



路径: [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3]]
凹点: [[6, 3], [6, -3]]
凸点: [[6, 9], [3.33, 5], [2, 3], [5.67, -3.5], [8, -7], [8, 3]]



路径: [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 3.86]]
凹点: [[6, 3], [6, 3.86]]
凸点: [[6, 9], [3.33, 5], [2, 3], [6, -3], [8, -7], [8, 3]]



路径: [[6, 9], [3.33, 5], [2, 3], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3]]
凸点: [[6, 9], [3.33, 5], [2, 3], [4.5, 0], [8, -7], [8, 3]]



路径: [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3]]
凹点: [[6, 3.86], [6, -3]]
凸点: [[6, 9], [3.33, 5], [5.67, -3.5], [8, -7], [8, 3]]



路径: [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3.86], [6, 3]]
凸点: [[6, 9], [3.33, 5], [4.5, 0], [8, -7], [8, 3]]



路径: [[6, 9], [6, 3.86], [6, 3], [4.29, 0.43], [4.5, 0], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3]]
凸点: [[6, 9], [4.29, 0.43], [4.5, 0], [8, -7], [8, 3]]



路径: [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.56, -3.33], [5.67, -3.5], [8, -7], [8, 3]]
凹点: [[6, -3]]
凸点: [[6, 9], [5.56, -3.33], [5.67, -3.5], [8, -7], [8, 3]]



路径: [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [5.35, -3.97], [8, -7], [8, 3]]
凹点: [[6, -3], [5.67, -3.5]]
凸点: [[6, 9], [5.35, -3.97], [8, -7], [8, 3]]



路径: [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [5.67, -3.5], [8, -7], [8, 3]]
凹点: [[6, 3], [6, -3]]
凸点: [[6, 9], [4.5, 0], [5.67, -3.5], [8, -7], [8, 3]]



路径: [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [4, -1], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3], [6, -3]]
凸点: [[6, 9], [4, -1], [8, -7], [8, 3]]


<span style="font-size:18px;">#
>>> 
路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [6, 3], [6, 3.86], [3.33, 5]]
凹点: [[3.33, 5]]
凸点: [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [6, 3], [6, 3.86]]


路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86], [8, 3]]
凹点: [[3.33, 5], [6, 3.86]]
凸点: [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [8, 3]]


路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.5, 1.5], [1.78, 2.33], [2, 3], [3.33, 5]]
凹点: [[0.8, 3.8], [2, 3], [3.33, 5]]
凸点: [[6, 9], [2.4, 5.4], [0, 3], [1.5, 1.5], [1.78, 2.33]]


路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [1.78, 2.33], [2, 3], [3.33, 5]]
凹点: [[0.8, 3.8], [1.33, 3], [2, 3], [3.33, 5]]
凸点: [[6, 9], [2.4, 5.4], [0, 3], [1.78, 2.33]]


路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [6, 3], [6, 3.86]]
凹点: [[0.8, 3.8]]
凸点: [[6, 9], [2.4, 5.4], [0, 3], [6, 3]]


路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86]]
凹点: [[0.8, 3.8], [3.33, 5]]
凸点: [[6, 9], [2.4, 5.4], [0, 3], [2, 3], [6, 3.86]]


路径: [[6, 9], [2.4, 5.4], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3]]
凹点: [[3.33, 5], [6, 3]]
凸点: [[6, 9], [2.4, 5.4], [2, 3], [6, -3], [8, -7], [8, 3]]


路径: [[6, 9], [2.4, 5.4], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3.86]]
凸点: [[6, 9], [2.4, 5.4], [3.33, 5], [6, -3], [8, -7], [8, 3]]


路径: [[6, 9], [2.4, 5.4], [-6, 9], [-0.37, 2.56], [0, 3], [1.33, 3], [2, 3], [3.33, 5]]
凹点: [[2.4, 5.4], [0, 3], [3.33, 5]]
凸点: [[6, 9], [-6, 9], [-0.37, 2.56], [2, 3]]


路径: [[6, 9], [3.33, 5], [2, 3], [1.78, 2.33], [3.67, -0.5], [4.29, 0.43], [6, 3], [6, 3.86]]
凹点: []
凸点: [[6, 9], [3.33, 5], [2, 3], [1.78, 2.33], [3.67, -0.5], [4.29, 0.43], [6, 3]]


路径: [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3]]
凹点: [[6, 3], [6, -3]]
凸点: [[6, 9], [3.33, 5], [2, 3], [5.67, -3.5], [8, -7], [8, 3]]


路径: [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 3.86]]
凹点: [[6, 3], [6, 3.86]]
凸点: [[6, 9], [3.33, 5], [2, 3], [6, -3], [8, -7], [8, 3]]


路径: [[6, 9], [3.33, 5], [2, 3], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3]]
凸点: [[6, 9], [3.33, 5], [2, 3], [4.5, 0], [8, -7], [8, 3]]


路径: [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3]]
凹点: [[6, 3.86], [6, -3]]
凸点: [[6, 9], [3.33, 5], [5.67, -3.5], [8, -7], [8, 3]]


路径: [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3.86], [6, 3]]
凸点: [[6, 9], [3.33, 5], [4.5, 0], [8, -7], [8, 3]]


路径: [[6, 9], [6, 3.86], [6, 3], [4.29, 0.43], [4.5, 0], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3]]
凸点: [[6, 9], [4.29, 0.43], [4.5, 0], [8, -7], [8, 3]]


路径: [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.56, -3.33], [5.67, -3.5], [8, -7], [8, 3]]
凹点: [[6, -3]]
凸点: [[6, 9], [5.56, -3.33], [5.67, -3.5], [8, -7], [8, 3]]


路径: [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [5.35, -3.97], [8, -7], [8, 3]]
凹点: [[6, -3], [5.67, -3.5]]
凸点: [[6, 9], [5.35, -3.97], [8, -7], [8, 3]]


路径: [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [5.67, -3.5], [8, -7], [8, 3]]
凹点: [[6, 3], [6, -3]]
凸点: [[6, 9], [4.5, 0], [5.67, -3.5], [8, -7], [8, 3]]


路径: [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [4, -1], [6, -3], [8, -7], [8, 3]]
凹点: [[6, 3], [6, -3]]
凸点: [[6, 9], [4, -1], [8, -7], [8, 3]]


操作用时:5.985e-01 s
[[3.48, 4.51], [3.73, 4.51], [2.23, 4.13], [2.21, 4.32], [3.07, 4.26], [2.73, 4.51], [5.22, 2.3], [5.72, 2.41], [1.09, 4.99], [4.13, 3.26], [5.62, 1.19], [5.67, 2.11], [5.48, 1.62], [6.12, 1.29], [5.98, 1.73], [6.1, 1.16], [6.4, 0.25], [6.38, 0.17], [6.27, 0.67], [6.06, 0.98]]
[[[3.33, 5]], [[3.33, 5], [6, 3.86]], [[0.8, 3.8], [2, 3], [3.33, 5]], [[0.8, 3.8], [1.33, 3], [2, 3], [3.33, 5]], [[0.8, 3.8]], [[0.8, 3.8], [3.33, 5]], [[3.33, 5], [6, 3]], [[6, 3.86]], [[2.4, 5.4], [0, 3], [3.33, 5]], [], [[6, 3], [6, -3]], [[6, 3], [6, 3.86]], [[6, 3]], [[6, 3.86], [6, -3]], [[6, 3.86], [6, 3]], [[6, 3]], [[6, -3]], [[6, -3], [5.67, -3.5]], [[6, 3], [6, -3]], [[6, 3], [6, -3]]]
>>> 

    #计算中心点
    def centerPoint(self):
        xCenter = 0;
        yCenter = 0;

        for i in range(self.vertNum):
            p_ = self.vertex[i].value();

            xCenter += p_[0];
            yCenter += p_[1];

        return [round(xCenter/self.vertNum, 2), round(yCenter/self.vertNum, 2)];

    #判断三角形是顺时针还是逆时针
    def judgeClockwise(self, P1, P2, P3):
        #三个点都是[x, y]形式,即投影在平面上
        x1, y1, x2, y2, x3, y3 = P1[0], P1[1], P2[0], P2[1], P3[0], P3[1];
        cross = (x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);

        if (cross > 0):
            #逆时针
            return 1;
        elif (cross < 0):
            #顺时针
            return -1;
        else:
            return 0;

    #判断凹多边形,顶点的凹凸性
    def judgeConcavePolygon(self, array):
        newArray = array;
        vertexNum = len(newArray);
        #多边形上的凹点
        concavePoint = [];
        #多边形上的凸点
        convexPoint = [];
        #返回矩阵
        returnArray = [];

        if (vertexNum >= 3):
            for i in range(vertexNum):
                P1 = newArray[(i-1+vertexNum)%vertexNum];
                P2 = newArray[i%vertexNum];
                P3 = newArray[(i+1)%vertexNum];

                if (self.judgeClockwise(P1, P2, P3) < 0): #顺序不能错
                    #三角形是顺时针,是凹点
                    concavePoint.append(P2);
                elif (self.judgeClockwise(P1, P2, P3) > 0): #顺序不能错
                    convexPoint.append(P2);
            returnArray.append(newArray);
            returnArray.append(concavePoint);
            returnArray.append(convexPoint);
                      
            return returnArray;
        else:
            return [array, [], []];
			
def tmp3():
    path = [[[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [6, 3], [6, 3.86], [3.33, 5], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86], [8, 3], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.5, 1.5], [1.78, 2.33], [2, 3], [3.33, 5], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [1.78, 2.33], [2, 3], [3.33, 5], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [6, 3], [6, 3.86], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86], [6, 9]], [[6, 9], [2.4, 5.4], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [2.4, 5.4], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [2.4, 5.4], [-6, 9], [-0.37, 2.56], [0, 3], [1.33, 3], [2, 3], [3.33, 5], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [1.78, 2.33], [3.67, -0.5], [4.29, 0.43], [6, 3], [6, 3.86], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 3.86], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [4.29, 0.43], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.56, -3.33], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [5.35, -3.97], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [4, -1], [6, -3], [8, -7], [8, 3], [6, 9]]]
    len_path = len(path);

    centerArray = [];
    concaveArray = [];

    #计时开始
    startTime = time.clock();
    
    for i in range(len_path):
        poly = Polygon(path[i]);
        #poly.genVertexTree();
        centerArray.append(poly.centerPoint());

        a = poly.judgeConcavePolygon(poly.getVertexValue());
        concaveArray.append(a[1]);
        print('路径:', a[0]);
        print('凹点:', a[1]);
        print('凸点:', a[2]);
        print('\n');

    #计时结束
    endTime = time.clock();

    #打印结果
    print('操作用时:{0:.3e} s'.format(endTime-startTime));   

    print(centerArray);
    print(concaveArray);

#</span>

<span style="font-size:18px;">//
$center = [[3.48, 4.51], [3.73, 4.51], [2.23, 4.13], [2.21, 4.32], [3.07, 4.26], [2.73, 4.51], [5.22, 2.3], [5.72, 2.41], [1.09, 4.99], [4.13, 3.26], [5.62, 1.19], [5.67, 2.11], [5.48, 1.62], [6.12, 1.29], [5.98, 1.73], [6.1, 1.16], [6.4, 0.25], [6.38, 0.17], [6.27, 0.67], [6.06, 0.98]];

$concave = [[[3.33, 5]], [[3.33, 5], [6, 3.86]], [[0.8, 3.8], [2, 3], [3.33, 5]], [[0.8, 3.8], [1.33, 3], [2, 3], [3.33, 5]], [[0.8, 3.8]], [[0.8, 3.8], [3.33, 5]], [[3.33, 5], [6, 3]], [[6, 3.86]], [[2.4, 5.4], [0, 3], [3.33, 5]], [], [[6, 3], [6, -3]], [[6, 3], [6, 3.86]], [[6, 3]], [[6, 3.86], [6, -3]], [[6, 3.86], [6, 3]], [[6, 3]], [[6, -3]], [[6, -3], [5.67, -3.5]], [[6, 3], [6, -3]], [[6, 3], [6, -3]]];

$path2 = [[[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [6, 3], [6, 3.86], [3.33, 5], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86], [8, 3], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.5, 1.5], [1.78, 2.33], [2, 3], [3.33, 5], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [1.78, 2.33], [2, 3], [3.33, 5], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [6, 3], [6, 3.86], [6, 9]], [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [3.33, 5], [6, 3.86], [6, 9]], [[6, 9], [2.4, 5.4], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [2.4, 5.4], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [2.4, 5.4], [-6, 9], [-0.37, 2.56], [0, 3], [1.33, 3], [2, 3], [3.33, 5], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [1.78, 2.33], [3.67, -0.5], [4.29, 0.43], [6, 3], [6, 3.86], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 3.86], [6, 9]], [[6, 9], [3.33, 5], [2, 3], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [4.29, 0.43], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.56, -3.33], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [5.35, -3.97], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]], [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [4, -1], [6, -3], [8, -7], [8, 3], [6, 9]]]

	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 b = [];
		for (var i = 0; i < $seg.length; i++) {
			b.push([a[$seg[i][0]], a[$seg[i][1]]]);
		}
		
				
		var edges = b.length;
		for (var i = 0; i < edges; i++) {
			shape.multiLineDraw([].concat(b[i]), 'red');
		}*/
		
		var colorArray = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple'];
		var seg = [];		
		
		var idx = xGlobal;
		var len = $path2.length;

		plot.setLineWidth(3);

		seg = transform.scale(transform.translate($path2[idx%len], 0, 0), scaleX/spaceX, scaleY/spaceY);
		shape.multiLineDraw([].concat(seg), 'pink');
		
		
		//主要顶点
		shape.pointDraw([].concat(a), 'blue', 1, 1, lable);
		
		cPoint = transform.scale(transform.translate($center, 0, 0), scaleX/spaceX, scaleY/spaceY);
		
		shape.pointDraw([].concat([cPoint[idx%len]]), 'red');
		
		
		concavePoint = transform.scale(transform.translate($concave[idx%len], 0, 0), scaleX/spaceX, scaleY/spaceY);
		
		shape.pointDraw([].concat(concavePoint), 'orange');
		

		/*
		//次要顶点
		var b = [];
		
		for (var i = 0; i < 6; i++) {	
			b = [].concat($pointType[n][i]);
			//显示变换        
			if (b.length > 0) {        
				b = transform.scale(transform.translate(b, 0, 0), scaleX/spaceX, scaleY/spaceY);
				shape.pointDraw([].concat(b), colorArray[(i-1)%7]);
			}

			
			
		}*/
	}

//</span>

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







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值