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

这篇博客介绍了如何使用Python进行凸包问题的可视化演示。作者通过生成随机点并利用matplotlib进行动态展示,实现了蛮力法求解凸包的过程。文章强调了算法实现并不复杂,只是需要熟悉一些特定的函数。最后,代码展示了如何找出凸包上的关键点。
摘要由CSDN通过智能技术生成

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

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

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

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

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

44e9342642f8725dbf58f4e183c3dd9a.png

贴出我的代码:

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[i][0] = random.randrange(1000)

dot[i][1] = random.randrange(1000)

dot[i][2] = 0

def judge(inp):

n = 0

for i in range(inp):

for j in range(i+1, inp):

a = dot[j][1] - dot[i][1]

b = dot[i][0] - dot[j][0]

c = (dot[i][0] * dot[j][1]) - (dot[i][1] * dot[j][0])

sign1 = 0

sign2 = 0

x[n][0] = dot[i][0]

x[n][1] = dot[j][0]

y[n][0] = dot[i][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[i][2] = 1

dot[j][2] = 1

cn.scatter(dot[i][0], dot[i][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[i][0], dot[i][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[i][2] == 1:

print((dot[i][0], dot[i][1]))

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[i][0] = random.randrange(1000)

dot[i][1] = random.randrange(1000)

dot[i][2] = 0

def judge(inp):

n = 0

for i in range(inp):

for j in range(i+1, inp):

a = dot[j][1] - dot[i][1]

b = dot[i][0] - dot[j][0]

c = (dot[i][0] * dot[j][1]) - (dot[i][1] * dot[j][0])

sign1 = 0

sign2 = 0

x[n][0] = dot[i][0]

x[n][1] = dot[j][0]

y[n][0] = dot[i][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[i][2] = 1

dot[j][2] = 1

cn.scatter(dot[i][0], dot[i][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[i][0], dot[i][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[i][2] == 1:

print((dot[i][0], dot[i][1]))

标签:cn,python,inp,凸包,color,range,蛮力,input,dot

来源: https://www.cnblogs.com/whitehawk/p/10850368.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值