Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 633|回复: 0

python动态演示蛮力法解决凸包问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-7-18 11:11:32 | 显示全部楼层 |阅读模式

    最近开了算法课,但是我的算法着实不咋地,一直搞web和逆向,就没怎么编程。记录一下0.0

    算法倒是不难实现,但是这个动态演示很烦,从纯粹的可视化小白,强行写完了,写完发现非常简单,只是自己不知道的函数太多了,哭了。。。。

    蛮力法就不用解释了,通俗的说就是把所有可能试一遍。

    凸包问题,就是将n个点中某几个点围成一个多边形,除了这n个点,其余的点都在这个多边形内。

    核心算法其实就是一个行列式演变而来,后悔没学好线代。。。。。

    参考:https://blog.csdn.net/u011001084/article/details/72768075

    贴出我的代码:

    import random
    import matplotlib.pyplot as p
    
    input = int(input('输入生成点的数量:'))
    dot = [[0]*3 for i in range(input)]
    x = [[0]*2 for a in range(int(input * (input - 1) / 2))]
    y = [[0]*2 for b in range(int(input * (input - 1) / 2))]
    fg = p.figure()
    cn = fg.add_subplot(1, 1, 1)
    cn.set_xlim(0, 1000)
    cn.set_ylim(0, 1000)
    p.ion()
    for i in range(input):
        dot[0] = random.randrange(1000)
        dot[1] = random.randrange(1000)
        dot[2] = 0
    def judge(inp):
        n = 0
        for i in range(inp):
            for j in range(i+1, inp):
                a = dot[j][1] - dot[1]
                b = dot[0] - dot[j][0]
                c = (dot[0] * dot[j][1]) - (dot[1] * dot[j][0])
                sign1 = 0
                sign2 = 0
                x[n][0] = dot[0]
                x[n][1] = dot[j][0]
                y[n][0] = dot[1]
                y[n][1] = dot[j][1]
                n += 1
                for k in range(inp):
                    if k == j or k == i:
                        continue
                    if a*dot[k][0]+b*dot[k][1] == c:
                        sign1 += 1
                        sign2 += 1
                    if a*dot[k][0]+b*dot[k][1] > c:
                        sign1 += 1
                    if a*dot[k][0]+b*dot[k][1] < c:
                        sign2 += 1
                    if (sign1 == (inp - 2)) or (sign2 == (inp - 2)):
                        dot[2] = 1
                        dot[j][2] = 1
                        cn.scatter(dot[0], dot[1], color='g', marker='.')
                        cn.scatter(dot[j][0], dot[j][1], color='g', marker='.')
                        cn.plot(x[n-1], y[n-1], color='b')
                cn.scatter(dot[0], dot[1], color='g', marker='.')
                cn.scatter(dot[j][0], dot[j][1], color='g', marker='.')
                cn.plot(x[n-1], y[n-1], color='r')
                p.pause(0.1)
                cn.lines.pop()
    judge(input)
    print("凸包极点:")
    for i in range(input):
        if dot[2] == 1:
            print((dot[0], dot[1]))
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 16:53 , Processed in 0.059507 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表