您的位置:首页 > 其它

[从头学数学] 第277节 [计算几何] 任意多边形的内角

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

正剧开始:

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

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



<span style="font-size:18px;">#
>>>
[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
凸点
>>>

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(1):
poly = Polygon(path[i]);
#生成顶点树
poly.genVertexTree();
#设置顶点凹凸性的属性
poly.setConcave();

t = poly.getVertexTree();

for item in t:
print(item);
print(item.getConcave());

#</span>



<span style="font-size:18px;">#
>>>
[1.33, 3]: [Point([2, 3]), Point([0.8, 3.8])], len =2
凸点
内角: 123.5245
[2, 3]: [Point([1.33, 3]), Point([6, 3])], len =2
凸点
内角: 180.0
[6, 3]: [Point([2, 3]), Point([6, 3.86])], len =2
凸点
内角: 90.0
[0.8, 3.8]: [Point([1.33, 3]), Point([2.4, 5.4])], len =2
凸点
内角: 101.4755
[6, 3.86]: [Point([6, 3]), Point([3.33, 5])], len =2
凸点
内角: 113.1208
[3.33, 5]: [Point([6, 3.86]), Point([6, 9])], len =2
凹点
内角: 280.6023
[2.4, 5.4]: [Point([0.8, 3.8]), Point([6, 9])], len =2
凸点
内角: 180.0
[6, 9]: [Point([3.33, 5]), Point([2.4, 5.4])], len =2
凸点
内角: 11.2769
>>>

#设置角度
def setAngle(self):
p = self.point;
relate = self.getRelate();
if (len(relate) == 2):
#此处点是PointType,所以要先取它们的值,
#如果是坐标对格式,要省去这一步
p_ = p.value();
p1_ = relate[0].value();
p2_ = relate[1].value();

vec_1 = [p1_[0]-p_[0], p1_[1]-p_[1]];
vec_2 = [p2_[0]-p_[0], p2_[1]-p_[1]];
mod1 = (vec_1[0]**2 + vec_1[1]**2)**0.5;
mod2 = (vec_2[0]**2 + vec_2[1]**2)**0.5;

dot = vec_1[0]*vec_2[0]+vec_1[1]*vec_2[1];
if (mod1 != 0 and mod2 != 0):
cos = dot/(mod1 * mod2);
result = math.acos(cos)*180/math.pi;
else:
result = 90;

result = round(result, 4);

if (self.concave == True):
self.angle = 360 - result;
else:
self.angle = result;

def getAngle(self):
return self.angle;

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(1):
poly = Polygon(path[i]);
#生成顶点树
poly.genVertexTree();
#设置顶点凹凸性的属性
poly.setConcave();
#设置顶点的角度
poly.setAngle();

t = poly.getVertexTree();

for item in t:
print(item);
print(item.getConcave());
print('内角:', item.getAngle());

#</span>
本节到此结束,欲知后事如何,请看下回分解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: