第一个计算几何算法的可视化---极点法获取凸包

  1. 生成随机的点

  2. 使用EP算法得到极点

    • 初始化状态
    • 3重循环遍历三角形
    • 第四重循环判断点
    • intriagle测试里面先要保证三角形的顶点是CCW
    • to-left测试的计算公式
  3. 可视化所有的点

  4. 完整代码

    import pygame
    import random
    
    # 定义颜色
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BACKGROUND_COLOR = (255, 255, 255)
    
    
    class Point:
        def __init__(self, x, y):
            self.x = x
            self.y = y
            self.extreme = True
    
    def toLeft(p, q, s):
        area = p.x * q.y - p.y * q.x + \
               q.x * s.y - q.y * s.x + \
               s.x * p.y - s.y * p.x
    
        return area > 0
    
    
    
    def InTriangle(p, q, r, s):
        # 这里需要一个函数来检测点s是否在由p, q, r形成的三角形内
        # 返回True如果s在三角形内, 否则返回False
        # NOTE: 这个函数的具体实现需要更多的背景知识来完成,这里我暂时用一个简单的返回值代替
        if not toLeft(p, q, r):
            p, r = r, p
    
        ret1 = toLeft(p, q, s)
        ret2 = toLeft(q, r, s)
        ret3 = toLeft(r, p, s)
        if ret1 and ret2 and ret3:
            return True
        return False
    
    def extremePoint(points):
        n = len(points)
        for s in range(n):
            points[s].extreme = True
    
        for p in range(n):
            for q in range(p + 1, n):
                for r in range(q + 1, n):
                    for s in range(n):
                        if s == p or s == q or s == r or not points[s].extreme:
                            continue
                        if InTriangle(points[p
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值