剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年09月26日 09:58:10, 银河系厄尔斯星球中华帝国江南行省。
如下图, 黑色点就是重心,更多图片参见上节。
阿伟看到了一本比较有趣的书,是关于《计算几何》的,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>
如下图, 黑色点就是重心,更多图片参见上节。
本节到此结束,欲知后事如何,请看下回分解。