[从头学数学] 第279节 [计算几何] 重心

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


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

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






<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], [6, 9]]
各顶点内角: [11.2769, 180.0, 101.4755, 123.5245, 180.0, 90.0, 113.1208, 280.6023]
周长: 21.556
面积: [10.6061, 'anti-clockwise']
重心: [3.45, 4.47, 10.6061]


路径: [[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]]
各顶点内角: [63.4349, 180.0, 101.4755, 123.5245, 123.6239, 259.4969, 180.1469, 48.2973]
周长: 22.79
面积: [17.4599, 'anti-clockwise']
重心: [4.86, 5.51, 17.4599]


路径: [[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]]
各顶点内角: [11.2769, 180.0, 180.0, 90.0, 63.6418, 179.5362, 195.4459, 180.0992]
周长: 19.399
面积: [7.4925, 'anti-clockwise']
重心: [2.36, 4.5, 7.4925]


路径: [[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]]
各顶点内角: [11.2769, 180.0, 180.0, 45.0, 236.113, 52.065, 195.4459, 180.0992]
周长: 18.539
面积: [6.21445, 'anti-clockwise']
重心: [2.63, 4.92, 6.2145]


路径: [[6, 9], [2.4, 5.4], [0.8, 3.8], [0, 3], [1.33, 3], [2, 3], [6, 3], [6, 3.86], [6, 9]]
各顶点内角: [45.0, 180.0, 180.0, 45.0, 180.0, 180.0, 90.0, 180.0]
周长: 20.485
面积: [18.0, 'anti-clockwise']
重心: [4.0, 5.0, 18.0]


路径: [[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]]
各顶点内角: [45.0, 180.0, 180.0, 45.0, 180.0, 123.6239, 259.4969, 66.8792]
周长: 20.93
面积: [12.8519, 'anti-clockwise']
重心: [3.97, 5.51, 12.8519]


路径: [[6, 9], [2.4, 5.4], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 9]]
各顶点内角: [63.4349, 68.2729, 280.351, 56.3761, 270.0, 153.4349, 26.5651, 161.5651]
周长: 39.302
面积: [36.404, 'anti-clockwise']
重心: [6.01, 2.42, 36.404]


路径: [[6, 9], [2.4, 5.4], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [8, -7], [8, 3], [6, 9]]
各顶点内角: [63.4349, 68.2729, 179.8479, 246.8792, 180.0, 153.4349, 26.5651, 161.5651]
周长: 36.663
面积: [31.2559, 'anti-clockwise']
重心: [6.33, 2.21, 31.2559]


路径: [[6, 9], [2.4, 5.4], [-6, 9], [-0.37, 2.56], [0, 3], [1.33, 3], [2, 3], [3.33, 5], [6, 9]]
各顶点内角: [11.2769, 248.1986, 25.6407, 81.2215, 229.9392, 180.0, 123.6239, 180.0992]
周长: 32.57
面积: [22.82, 'anti-clockwise']
重心: [-0.28, 5.49, 22.82]


路径: [[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]]
各顶点内角: [33.7231, 179.9008, 164.5541, 128.0852, 67.4268, 179.9485, 146.3614, 180.0]
周长: 21.524
面积: [19.956, 'anti-clockwise']
重心: [4.29, 3.73, 19.956]


路径: [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]]
各顶点内角: [52.1581, 179.9008, 56.3761, 270.0, 213.4248, 112.9229, 33.6523, 161.5651]
周长: 38.339
面积: [35.17, 'anti-clockwise']
重心: [6.17, 1.92, 35.17]


路径: [[6, 9], [3.33, 5], [2, 3], [6, 3], [6, -3], [8, -7], [8, 3], [6, 3.86], [6, 9]]
各顶点内角: [33.7231, 179.9008, 56.3761, 270.0, 153.4349, 26.5651, 113.2677, 246.7323]
周长: 39.0
面积: [28.87, 'anti-clockwise']
重心: [6.07, 1.58, 28.87]


路径: [[6, 9], [3.33, 5], [2, 3], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]]
各顶点内角: [52.1581, 179.9008, 56.3761, 296.56510000000003, 126.8699, 180.0, 26.5651, 161.5651]
周长: 38.716
面积: [38.51, 'anti-clockwise']
重心: [6.08, 1.89, 38.51]


路径: [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]]
各顶点内角: [52.1581, 79.3977, 246.8792, 180.0, 213.4248, 112.9229, 33.6523, 161.5651]
周长: 35.701
面积: [30.0219, 'anti-clockwise']
重心: [6.53, 1.61, 30.0219]


路径: [[6, 9], [3.33, 5], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]]
各顶点内角: [52.1581, 79.3977, 246.8792, 206.5651, 126.8699, 180.0, 26.5651, 161.5651]
周长: 36.077
面积: [33.3619, 'anti-clockwise']
重心: [6.39, 1.6, 33.3619]


路径: [[6, 9], [6, 3.86], [6, 3], [4.29, 0.43], [4.5, 0], [6, -3], [8, -7], [8, 3], [6, 9]]
各顶点内角: [18.4349, 180.0, 213.6386, 120.3318, 179.4645, 180.0, 26.5651, 161.5651]
周长: 33.716
面积: [27.1375, 'anti-clockwise']
重心: [6.68, 0.49, 27.1375]


路径: [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.56, -3.33], [5.67, -3.5], [8, -7], [8, 3], [6, 9]]
各顶点内角: [18.4349, 180.0, 180.0, 233.1301, 93.9647, 179.253, 33.6523, 161.5651]
周长: 33.282
面积: [23.21555, 'anti-clockwise']
重心: [6.95, 0.31, 23.2156]


路径: [[6, 9], [6, 3.86], [6, 3], [6, -3], [5.67, -3.5], [5.35, -3.97], [8, -7], [8, 3], [6, 9]]
各顶点内角: [18.4349, 180.0, 180.0, 213.4248, 180.8242, 104.5784, 41.1725, 161.5651]
周长: 33.518
面积: [24.26755, 'anti-clockwise']
重心: [6.92, 0.09, 24.2675]


路径: [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [6, -3], [5.67, -3.5], [8, -7], [8, 3], [6, 9]]
各顶点内角: [18.4349, 180.0, 206.5651, 126.8699, 239.9899, 112.9229, 33.6523, 161.5651]
周长: 33.836
面积: [27.66, 'anti-clockwise']
重心: [6.71, 0.27, 27.66]


路径: [[6, 9], [6, 3.86], [6, 3], [4.5, 0], [4, -1], [6, -3], [8, -7], [8, 3], [6, 9]]
各顶点内角: [18.4349, 180.0, 206.5651, 180.0, 108.4349, 198.4349, 26.5651, 161.5651]
周长: 34.097
面积: [28.0, 'anti-clockwise']
重心: [6.62, 0.38, 28.0]


操作用时:1.182e+00 s
[[3.45, 4.47], [4.86, 5.51], [2.36, 4.5], [2.63, 4.92], [4.0, 5.0], [3.97, 5.51], [6.01, 2.42], [6.33, 2.21], [-0.28, 5.49], [4.29, 3.73], [6.17, 1.92], [6.07, 1.58], [6.08, 1.89], [6.53, 1.61], [6.39, 1.6], [6.68, 0.49], [6.95, 0.31], [6.92, 0.09], [6.71, 0.27], [6.62, 0.38]]

   #重心计算
    def gravityCenter(self):
        def __area(p1, p2, p3):
            x1, y1, x2, y2, x3, y3 = p1[0], p1[1], p2[0], p2[1], p3[0], p3[1];

            return (x1*y2-x2*y1)-(x1*y3-x3*y1)+(x2*y3-x3*y2);
        
        len_ = self.vertNum;
        vert = self.getVertexValue();
        S = [];
        Sgx = [];
        Sgy = [];
        
        p1 = vert[0];

        for i in range(1, len_-1):
            p2, p3 = vert[i], vert[i+1];

            x_ = (p1[0]+p2[0]+p3[0])/3;
            y_ = (p1[1]+p2[1]+p3[1])/3;

            S.append(__area(p1, p2, p3));
            Sgx.append(x_*S[-1]);
            Sgy.append(y_*S[-1]);
            
        S_ = sum(S);
        return [round(sum(Sgx)/S_, 2), round(sum(Sgy)/S_, 2), round(S_/2, 4)];
		
def tmp4():
    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):
        path_ = path[i];
        len_path_ = len(path_);
        poly = Polygon(path_);

        #生成顶点树
        poly.genVertexTree();
        #设置顶点凹凸性的属性
        poly.setConcave();
        #设置顶点的角度
        poly.setAngle();

        t = poly.getVertexTree();
        angle = [];
        for j in range(len_path_-1):
            angle.append(t.find(Vertex(Point(path_[j]))).getVal().getAngle());

        print('路径:', path[i]);
        print('各顶点内角:', angle);        
        print('周长:',poly.perimeterCalc());
        print('面积:', poly.areaCalc());
        gC = poly.gravityCenter();
        centerArray.append([gC[0], gC[1]]);
        print('重心:', gC);

        print('\n');

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

    print(centerArray);

#</span>

如下图, 黑色点就是重心,更多图片参见上节。



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值