[从头学数学] 第275节 [计算几何] 多边形顶点的五种类型

[工程师阿伟]与[机器小伟]合作研究[计算几何],探讨了多边形顶点的五种类型及判断逻辑的修正,并介绍了顶点内角计算方法的实现。
摘要由CSDN通过智能技术生成
剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,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]], [], [], 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值