经典算法-分治法由散点得出凸包-python实现

import copy
import random
import matplotlib
import mathdef distance_p2l(point, line_point1, line_point2):if (line_point2[0] - line_point1[0]) == 0:return abs(point[0] - line_point2[0])# 计算直线的斜率m = (line_point2[1] - line_point1[1]) / (line_point2[0] - line_point1[0])# 计算直线的截距b = line_point1[1] - m * line_point1[0]# 计算距离d = abs(m * point[0] - point[1] + b) / math.sqrt(m ** 2 + 1)return ddef node_above_line(node, line0, line1,upper_convex=True,left_convex=True):real_y = node[1]# y_on_line =(node[0]-line0[0])/(line1[0]-line0[0])*(line1[1]-line0[1])+line0[1]if (line1[0] - line0[0])!=0:print(node[1],node[0] - line0[0] / (line1[0] - line0[0]) * (line1[1] - line0[1]) + line0[1])if node[1] > (node[0]-line0[0])/(line1[0]-line0[0])* (line1[1]-line0[1])+line0[1]:return Trueelse:return Falseelse:if node[0]<line0[0]:if upper_convex==True:if left_convex:return Trueelse:return Falseif upper_convex==False:if left_convex:return Falseelse:return Trueelse:if upper_convex == True:if left_convex:return Falseelse:return Trueif upper_convex==False:if left_convex:return Trueelse:return Falsedef cal_convex_hull_point(min_x_node, max_x_node, upper_set,upper_convex=True):if len(upper_set) == 0:return [min_x_node, max_x_node]upper_set_distance2line = [distance_p2l(point, max_x_node, min_x_node) for point in upper_set]max_idx = upper_set_distance2line.index(max(upper_set_distance2line))farthest_p = upper_set[max_idx]upper_set_mins =  [node for node in upper_set if node != farthest_p]left_subset_of_upper, right_subset_of_upper = [], []for node in upper_set_mins:if node_above_line(node, farthest_p, min_x_node,upper_convex=upper_convex,left_convex=True)==upper_convex:left_subset_of_upper.append(node)if node_above_line(node, farthest_p, max_x_node,upper_convex=upper_convex,left_convex=False)==upper_convex:right_subset_of_upper.append(node)lu = cal_convex_hull_point(min_x_node,farthest_p,left_subset_of_upper,upper_convex)ru = cal_convex_hull_point(farthest_p,max_x_node,right_subset_of_upper,upper_convex)return lu+rudef divide_conquer(nodes):sorted_nodes = sorted(nodes, key=lambda x: x[0])max_x_node = sorted_nodes[-1]min_x_node = sorted_nodes[0]upper_set = []lower_set = []lu,ru,ll,rl = [],[],[],[]for node in sorted_nodes[1:-1]:if node_above_line(node, max_x_node, min_x_node):upper_set.append(node)else:lower_set.append(node)if len(upper_set)!=0:upper_set_distance2line = [distance_p2l(point, max_x_node, min_x_node) for point in upper_set]max_idx = upper_set_distance2line.index(max(upper_set_distance2line))farthest_p = upper_set[max_idx]upper_set_mins = [node for node in upper_set if node != farthest_p]left_subset_of_upper, right_subset_of_upper = [], []for node in upper_set_mins:if node_above_line(node, farthest_p, min_x_node,left_convex=True):left_subset_of_upper.append(node)if node_above_line(node, farthest_p, max_x_node,left_convex=False):right_subset_of_upper.append(node)lu = cal_convex_hull_point(min_x_node, farthest_p, left_subset_of_upper)ru = cal_convex_hull_point(farthest_p, max_x_node, right_subset_of_upper)if len(lower_set) != 0:lower_set_distance2line = [distance_p2l(point, max_x_node, min_x_node) for point in lower_set]max_idx = lower_set_distance2line.index(max(lower_set_distance2line))farthest_p = lower_set[max_idx]lower_set_mins = [node for node in lower_set if node != farthest_p]left_subset_of_lower, right_subset_of_lower = [], []for node in lower_set_mins:if node_above_line(node, farthest_p, min_x_node,upper_convex=False,left_convex=True)==False:left_subset_of_lower.append(node)if node_above_line(node, farthest_p, max_x_node,upper_convex=False,left_convex=False)==False:right_subset_of_lower.append(node)ll = cal_convex_hull_point(min_x_node, farthest_p, left_subset_of_lower,upper_convex=False)rl = cal_convex_hull_point(farthest_p, max_x_node, right_subset_of_lower,upper_convex=False)point_set = list(set(ll + lu + rl + ru))print("set point",point_set)convex0 = lu + ruconvex1 = ll + rlconvex0 = [convex0[i] for i in range(len(convex0)) if i==0 or i>0 and convex0[i]!=convex0[(i-1)]]convex1 = [convex1[i] for i in range(len(convex1)) if i==0 or i>0 and convex1[i] != convex1[i - 1]]convex1 = [convex1[i] for i in range(len(convex1) - 1, -1, -1)]convex  = convex0 +convex1convex = convex + [convex[0]]print("lines are ", convex)return convexdef draw_points(points, convex_p=None):import matplotlib.pyplot as pltplt.ion()# 输入点的坐标# points = [(0, 55), (40, 93), (20, 70), (10, 60)]  # 示例坐标# 分离 x 和 y 坐标x_coords = [point[0] for point in points]y_coords = [point[1] for point in points]# 绘制点plt.scatter(x_coords, y_coords, color='blue')if convex_p != None:c_x = [p[0] for p in convex_p]c_y = [p[1] for p in convex_p]colors = ['red'] * len(c_y)plt.scatter(c_x, c_y, color=colors)plt.plot(c_x, c_y, color='red')# 添加标题和坐标轴标签plt.title('Scatter Plot of Points')plt.xlabel('X Coordinate')plt.ylabel('Y Coordinate')plt.pause(5)plt.ioff()plt.clf()def pnpoly(vertices, testp):n = len(vertices)j = n - 1res = Falsefor i in range(n):if (vertices[i][1] > testp[1]) != (vertices[j][1] > testp[1]) and \testp[0] < (vertices[j][0] - vertices[i][0]) * (testp[1] - vertices[i][1]) / (vertices[j][1] - vertices[i][1]) + vertices[i][0]:res = not resj = ireturn resfor i in range(38,100):print('seed',i)random.seed(i)nodes = [(random.randint(0, 100), random.randint(0, 100)) for i in range(10)]print(nodes)draw_points(nodes)convex_p = divide_conquer(nodes)draw_points(nodes, convex_p)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/800295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的内连接和外连接

内连接 在之前的MySQL的复合查询时&#xff0c;我们能够通过给两个表做笛卡尔积查询和where子句限定条件来查询想查询的数据&#xff0c;不过MySQL还提供了内连接用来给两个表做笛卡尔积&#xff0c;对比之前的复合查询笛卡尔积来说语法更加简洁。 语法&#xff1a;select 字段…

实验:基于Red Hat Enterprise Linux系统建立逻辑卷并进行划分

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 1. 为虚拟机添加三块大小为5GB的磁盘nvme0n2 nvme0n3 nvme0n4 2. 将三块硬盘转换为物理卷&#xff0c;并将nvme0n2 nvme0n3两pv建立成名为"自己名字_vg“的卷组&#xff0c;并将nvme0n4扩展进该卷组。 LVM管…

MySQL数据库的增删改查(进阶)

1.新增 将一个表中的内容插入到另一个表中. 这里需要确保查询集合的列数,类型,顺序要和插入表的列数,类型,顺序一致,这里列的名称可以不一样. values 替换成了select 查询的临时表. 2. 查询 2.1 聚合查询 2.1.1 聚合查询 函数 说明COUNT([DISTINCT] expr)返回…

k8snode节点kubeadm join主节点失败,请问你们有什么好的办法吗?

K8S版本&#xff1a;1.20.9&#xff0c;docker也是1.20的 在网上找了&#xff0c;说是关闭交换区swap&#xff0c;这个也关了&#xff0c;防火墙也关了&#xff0c;现在kubelet无法启动&#xff0c;网上查了只有kubeadm init后kubelet才能启动&#xff0c;而init后10250端口会…

Master节点快照回退遇到的容器不存在的问题

这次遇到的问题说起来有点扯&#xff0c;k8s集群出了点问题&#xff0c;kuboard无法访问&#xff0c;查看容器状态后&#xff0c;初始问题简单的以为是kuboard出问题了&#xff0c;理论上来说重新安装kuboard即可&#xff0c; 由此问题引发的系统bug&#xff0c;导致master节点…

掼蛋八大定律

1、首引定律 沟通是掼蛋的灵魂&#xff0c;原则上前三手牌都需要沟通。第一手牌&#xff0c;沟通牌力强弱&#xff1b;第二手牌沟通上游概率&#xff1b;第三手牌沟通双下可能。首引定律有几个公式&#xff1a;&#xff08;1&#xff09;首引小单牌示弱&#xff1b;&#xff0…

vue前端项目到后端执行逻辑——自己改的话要怎么改

文章目录 vue前端项目到后端流程——自己改的话要怎么改 vue前端项目到后端流程——自己改的话要怎么改

yarn集群部署

yarn集群部署案例 我们来基于一个案例讲解yarn集群部署 我们要部署yarn集群&#xff0c;需要分别部署HDFS文件系统及YARN集群 Hadoop HDFS分布式文件系统&#xff0c;我们会启动&#xff1a; NameNode进程作为管理节点DataNode进程作为工作节点SecondaryNamenode作为辅助 同…

数据库基础认识

目录 数据库基本认识 见一见数据库 主流数据库 Windows下启动MySQL 服务器&#xff0c;数据库&#xff0c;表关系 MySQL架构 SQL分类 存储引擎 数据库基本认识 哪一个是客户端哪一个是服务端&#xff1f; 为什么需要数据库&#xff1f; 文件保存数据有以下几个缺点&a…

✌2024/4/4—力扣—盛最多水的容器

代码实现&#xff1a; 方法一&#xff1a;暴力解法——遍历左右边&#xff0c;找出所有面积&#xff0c;取最大值——超时 #define min(a, b) ((a) > (b) ? (b) : (a)) #define max(a, b) ((a) > (b) ? (a) : (b))int maxArea(int *height, int heightSize) {int ans …

基于liorf_localization的重定位

文章目录 概述保存和加载地图利用现有地图进行重定位代码实现Q&&AQ1: point cloud is not in dense format概述 在LIO-SAM的基础上进行重定位,主要是指在已经建立的地图上进行位置的快速定位,这对于机器人在已知环境中的快速启动或者在丢失定位后的恢复尤为重要。L…

蓝桥杯DFS自练三题-串变换,玩具蛇,分糖果

题目一:串变换 代码解析: #include <iostream> using namespace std; struct Option{int select;int x;int y; }; string S,T; int N,K;//N是串的长度&#xff0c;K是操作指令的大小 Option opt[10];//存储所有的指令 bool vis[10];//标记数组&#xff0c;重要&#xff…

node相关

文章目录 nodeJS是什么&#xff1f;优缺点使用场景全局对象适合用于构建 I/O 密集型不适用于计算密集型任务 nodeJS是什么&#xff1f; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;它是跨平台和开源的。 Node.js 使用高效、轻量级的事件驱动、非阻…

Qt使用QWidget重绘实现圆环形渐变色进度条(支持不确定进度模式)

效果如下&#xff1a; 从纯竖直方向顶部蓝色到底部青色的渐变。 从左上角偏左45到右下角偏右45的蓝色到青色渐变。 从左上角偏左22.5到右下角偏右22.5的蓝色到青色渐变。&#xff08;这个角度渐变最好看&#xff09; 可以选择添加背景图片 支持两种模式&#xff1a;正常进度模…

免费试用!英智未来BayStone平台提供高性能算力服务

英智未来BayStone人工智能公共服务平台聚焦全球高端算力资源&#xff0c;提供基于英伟达HGX1系列GPU算力服务&#xff0c;现面向所有政企和科研机构提供现货算力资源服务。点击申请试用 BayStone平台通过全球算力资源调度&#xff0c;帮助用户高效使用高端算力资源&#xff0c;…

TypeScript系列之-理解TypeScript类型系统画图讲解

TypeScript的输入输出 如果我们把 Typescript 编译器看成一个黑盒的话。其输入则是使用 TypeScript 语法书写的文本或者文本集合。 输出是编译之后的 JS 文件 和 .d.ts 的声明文件 其中 JS 是将来需要运行的文件(里面是没有ts语法&#xff0c;有一个类型擦除的操作)&#xff0…

【保姆级】国内Onlyfans如何订阅?OnlyFans订阅保姆级指南

​ 一、 Onlyfans介绍 OnlyFans是一个创立于2016年的在线平台和应用程序&#xff0c;它集结了众多来自健身、音乐、艺术等领域的内容创作者&#xff0c;呈现了他们精彩纷呈的作品。该平台颠覆了传统商业模式&#xff0c;为创作者提供了一个展示独特内容的舞台&#xff0c;用户…

【报错】Python3.9及以上相对路径导入文件夹方式

Python3.9及以上相对路径导入文件夹 python跨文件夹调用别的文件夹下的py文件或参数方式 5.7. 包相对导入 相对导入使用前缀点号。 一个前缀点号表示相对导入从当前包开始。 两个或更多前缀点号表示对当前包的上级包的相对导入&#xff0c;第一个点号之后的每个点号代表一级…

学python能赚钱吗???

python爬虫去哪接单 python爬虫接单的方式有两种 一&#xff0c;接定制需求的单子 爬虫定制的需求其实很多&#xff0c;比如 “爬取某某电商网站的评论”&#xff0c;这类需求一般是按照爬取数据量的大小来收费&#xff0c;价格不会太高&#xff0c;正常500的样子。 常见的…

个推助力小米汽车APP实现智能用户触达,打造智能出行新体验

4月3日&#xff0c;小米SU7首批交付仪式在北京亦庄的小米汽车工厂总装车间举行&#xff0c;全国28城交付中心也同步开启首批交付。随着小米SU7系列汽车的正式发售和交付&#xff0c;小米汽车APP迎来了用户体量的爆发式增长。 小米汽车APP是小米汽车官方推出的手机应用&#xff…