剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年09月24日 12:50:50, 银河系厄尔斯星球中华帝国江南行省。
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年09月24日 12:50:50, 银河系厄尔斯星球中华帝国江南行省。
[工程师阿伟]正在和[机器小伟]一起研究[计算几何]]。
<span style="font-size:18px;">#
>>>
[1.33, 3]: [Point([2, 3]), Point([0.8, 3.8])], len =2
End
[2, 3]: [Point([1.33, 3]), Point([6, 3])], len =2
Regular
[6, 3]: [Point([2, 3]), Point([6, 3.86])], len =2
Regular
[0.8, 3.8]: [Point([1.33, 3]), Point([2.4, 5.4])], len =2
Regular
[6, 3.86]: [Point([6, 3]), Point([3.33, 5])], len =2
Regular
[3.33, 5]: [Point([6, 3.86]), Point([6, 9])], len =2
Regular
[2.4, 5.4]: [Point([0.8, 3.8]), Point([6, 9])], len =2
Regular
[6, 9]: [Point([3.33, 5]), Point([2.4, 5.4])], len =2
Start
>>>
class Vertex():
def __init__(self, point, relatePoint = None):
self.point = point;
self.relate = AVL.AVLTree();
if (relatePoint != None):
self.addRelate(relatePoint);
#返回与自身顶点相关联的顶点数量,也就是通过该点的线段数量
def __len__(self):
return len(self.relate);
#增加关联点
def addRelate(self, point):
self.relate.insert(point);
#移除关联点
def removeRelate(self, point):
self.relate.delete(point);
#取顶点值
def getVertex(self):
return self.point;
#取关联顶点阵列
def getRelate(self):
return self.relate.items();
def pointType(self):
#对于多边形的顶点来说,必然有且只有两个关联顶点
#否则<0> 'Unknown'
#共有五种顶点类型
#<1>起始顶点:所有关联顶点值都小于自身 'Start'
#<2>终止顶点:所有关联顶点值都大于自身 'End'
#<3> 普通: 'Regular'
#<4> 分裂:两个关联顶点的y值都小于自身,而(x_1-x)*(x_2-x)<0 'Split'
#<5> 汇合:两个关联顶点的y值都大于自身,而(x_1-x)*(x_2-x)<0 'Merge'
p = self.point;
relate = self.getRelate();
s = '';
if (len(relate) != 2):
s = 'Unknown';
else:
p1, p2 = relate[0], relate[1];
if (p1 < p and p2 < p):
s = 'Start';
elif (p1 > p and p2 > p):
s = 'End';
else:
p_, p1_, p2_ = p.value(), p1.value(), p2.value();
x0, y0, x1, y1, x2, y2 = p_[0], p_[1], p1_[0], p1_[1], p2_[0], p2_[1];
if (y1 < y0 and y2 < y0) and (x0-x1)*(x0-x2) < 0:
s = 'Split';
elif (y1 > y0 and y2 > y0) and (x0-x1)*(x0-x2) < 0:
s = 'Merge';
else:
s = 'Regular';
return s;
def __lt__(self, other):
if other == None:
return False;
return self.point < other.point;
def __eq__(self, other):
if other == None:
return False;
return self.point == other.point;
def __gt__(self, other):
return not (self < other or self == other);
def __str__(self):
return str(self.point)+': '+str(self.relate)+', len ='+str(len(self));
#生成顶点树
def genVertexTree(seg):
len_seg = len(seg);
isSegType = (type(seg[0]) == SegLine);
vertexTree = AVL.AVLTree();
vertexQueue = AVL.AVLTree();
for i in range(len_seg):
if (isSegType):
val = seg[i].value();
else:
val = seg[i];
p1, p2 = Point(val[0]), Point(val[1]);
if p1 in vertexQueue:
vertexTree.find(Vertex(p1)).getVal().addRelate(p2);
else:
vertexTree.insert(Vertex(p1, p2));
vertexQueue.insert(p1);
if p2 in vertexQueue:
vertexTree.find(Vertex(p2)).getVal().addRelate(p1);
else:
vertexTree.insert(Vertex(p2, p1));
vertexQueue.insert(p2);
return [vertexQueue, vertexTree];
def tmp2():
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);
for i in range(1):
path_ = path[i];
seg = [];
for j in range(len(path_)-1):
seg.append([path_[j], path_[j+1]]);
result = genVertexTree(seg);
vertexTree = result[1];
for item in vertexTree:
print(item);
print(item.pointType());
#</span>
<span style="font-size:18px;">#
>>>
[[[], [[6, 9]], [[1.33, 3]], [], [], [[2, 3], [6, 3], [0.8, 3.8], [6, 3.86], [3.33, 5], [2.4, 5.4]]], [[], [[3.33, 5], [6, 9]], [[1.33, 3], [8, 3]], [], [], [[2, 3], [0.8, 3.8], [6, 3.86], [2.4, 5.4]]], [[], [[6, 9]], [[1.5, 1.5]], [], [], [[1.78, 2.33], [0, 3], [2, 3], [0.8, 3.8], [3.33, 5], [2.4, 5.4]]], [[], [[1.33, 3], [6, 9]], [[1.78, 2.33], [0, 3]], [], [], [[2, 3], [0.8, 3.8], [3.33, 5], [2.4, 5.4]]], [[], [[6, 9]], [[0, 3]], [], [], [[1.33, 3], [2, 3], [6, 3], [0.8, 3.8], [6, 3.86], [2.4, 5.4]]], [[], [[3.33, 5], [6, 9]], [[0, 3], [6, 3.86]], [], [], [[1.33, 3], [2, 3], [0.8, 3.8], [2.4, 5.4]]], [[], [[6, 3], [6, 9]], [[8, -7], [2, 3]], [], [], [[6, -3], [8, 3], [3.33, 5], [2.4, 5.4]]], [[], [[6, 9]], [[8, -7]], [], [], [[6, -3], [6, 3], [8, 3], [6, 3.86], [3.33, 5], [2.4, 5.4]]], [[], [[-6, 9], [6, 9]], [[-0.37, 2.56], [2.4, 5.4]], [], [], [[0, 3], [1.33, 3], [2, 3], [3.33, 5]]], [[], [[6, 9]], [[3.67, -0.5]], [], [],