【计算机视觉】二、图像形成——实验:2D变换编辑器2.0(Pygame)

文章目录

  • 一、向量和矩阵的基本运算
  • 二、几何基元和变换
    • 1、几何基元(Geometric Primitives)
    • 2、几何变换(Geometric Transformations)
    • 2D变换编辑器
      • 0. 项目结构
      • 1. Package: gui
        • button.py
        • window.py
          • 1. `__init__(self, width, height, title)`
          • 2. `add_buttons(self)`
          • 3. `clear(self)`
          • 4. `draw(self, original_img)`
          • 5. `handle_events(self, event)`
          • 6. `save_image(self)`
          • 7. 代码整合
      • 2. Package: transformations
        • image_generators.py
        • image_transformers.py
      • 3. main.py
      • 4. 效果展示
        • 选择图像
        • 图像操作
        • 保存图像

一、向量和矩阵的基本运算

【计算机视觉】二、图像形成:1、向量和矩阵的基本运算:线性变换与齐次坐标

二、几何基元和变换

1、几何基元(Geometric Primitives)

  几何基元是计算机图形学中最基本的图形对象,它们是构建更复杂图形的基础单元。常见的几何基元包括:

  • 点(Point): 由一对或一组坐标值表示的零维对象。
  • 线段(Line Segment): 由两个端点确定的一维对象。
  • 多边形(Polygon): 由一系列顶点连接而成的闭合平面图形,是二维对象。
  • 曲线(Curve): 由一系列控制点和方程确定的平滑曲线,如贝塞尔曲线、样条曲线等。
  • 圆(Circle): 由一个圆心和半径确定的二维闭合曲线。
  • 球体(Sphere): 由一个球心和半径确定的三维闭合曲面。

  这些基本的几何基元可以通过组合、变换等操作构建出更加复杂的图形对象,如三维模型、场景等。

2、几何变换(Geometric Transformations)

【计算机视觉】二、图像形成:2、几何基元和几何变换:2D变换

在这里插入图片描述

2D变换编辑器

【计算机视觉】二、图像形成——实验:2D变换编辑器(Pygame)

0. 项目结构

image_transformations/
├── main.py
├── gui/
│   ├── __init__.py
│   ├── button.py
│   └── window.py
├── transformations/
│   ├── __init__.py
│   ├── image_generators.py
│   └── image_transformers.py
├── utils/
│   ├── __init__.py
│   └── file_utils.py

1. Package: gui

button.py
import pygame# 按钮类
class Button:def __init__(self, x, y, width, height, text, color):self.rect = pygame.Rect(x, y, width, height)self.text = textself.color = colorself.darker_color = (max(color[0] - 50, 0), max(color[1] - 50, 0), max(color[2] - 50, 0))  # 计算一个较暗的颜色def draw(self, surface):pygame.draw.rect(surface, self.color, self.rect)font = pygame.font.Font(None, 24)text = font.render(self.text, True, (255, 255, 255))text_rect = text.get_rect(center=self.rect.center)surface.blit(text, text_rect)def is_clicked(self, pos):return self.rect.collidepoint(pos)
window.py

   Window 类负责管理整个窗口及其界面,只需要创建一个 Window 对象,并在主循环中调用 clear()draw()handle_events() 方法即可。这样可以使代码更加模块化和易于维护。

1. __init__(self, width, height, title)
  • 初始化窗口对象。
  • 设置窗口的宽度、高度和标题。
  • 创建一个空列表 self.buttons 来存储所有按钮对象。
  • 初始化当前层级 self.current_layer 为 1。
  • 初始化其他变量,如选择的变换操作 self.selected_transform、变换后的图像 self.transformed_img、原始图像 self.original_img、鼠标拖拽相关变量等。
  • 调用 self.add_buttons() 方法添加按钮。
    def __init__(self, width, height, title):self.width = widthself.height = heightself.window = pygame.display.set_mode((width, height))pygame.display.set_caption(title)self.buttons = []self.current_layer = 1self.selected_transform = Noneself.transformed_img = Noneself.original_img = Noneself.mouse_dragging = Falseself.drag_start_pos = (0, 0)self.drag_offset = (0, 0)self.translation_offset = (0, 0)self.add_buttons()# pygame.display.set_icon(pygame.image.load("icon.png"))  # 加载图标文件self.pygame_to_numpy_map = {}
2. add_buttons(self)
  • 创建第一层界面的三个按钮对象。
  • 创建第二层界面的八个按钮对象。
  • 将所有按钮对象添加到 self.buttons 列表中。
   def add_buttons(self):# 添加第一层界面按钮self.buttons.append(Button(50, 50, 200, 50, "Select Image", (255, 0, 0)))self.buttons.append(Button(350, 50, 200, 50, "Generate Square", (0, 255, 0)))self.buttons.append(Button(650, 50, 200, 50, "Generate Circle", (0, 0, 255)))# 添加第二层界面按钮# - "Translate"按钮颜色为红色# - "Rotate"按钮颜色为橙色 `(2# - "Isotropic Scale"按钮# - "Scale"按钮颜色为青色 `(0,# - "Mirror"按钮颜色为蓝色 `(0# - "Shear"按钮颜色为紫色 `(12# 问:为什么没有黄色# 答:黄色太耀眼了………self.buttons.append(Button(50, 50, 150, 50, "Translate", (255, 0, 0)))self.buttons.append(Button(250, 50, 150, 50, "Rotate", (255, 165, 0)))self.buttons.append(Button(450, 50, 150, 50, "Isotropic Scale", (0, 255, 0)))self.buttons.append(Button(650, 50, 150, 50, "Scale", (0, 255, 255)))self.buttons.append(Button(50, 150, 150, 50, "Mirror", (0, 0, 255)))self.buttons.append(Button(250, 150, 150, 50, "Shear", (128, 0, 128)))self.buttons.append(Button(450, 150, 150, 50, "Back to Selection", (128, 128, 128)))# 新增"保存图片"功能self.buttons.append(Button(650, 150, 150, 50, "Save Image", (0, 128, 0)))
3. clear(self)
  • 使用灰色色 (220, 220, 220) 填充窗口~ui界面背景。
	 def clear(self):self.window.fill((220, 220, 220)) 
4. draw(self, original_img)
  • 根据当前层级绘制相应的界面。
  • 在第一层界面中,绘制前三个按钮。
  • 在第二层界面中,绘制原始图像和后七个按钮。
  • 在第三层界面中,绘制原始图像、变换后的图像、后七个按钮和选择的变换操作文本。
    def draw(self, original_img):# # 绘制标题栏# pygame.draw.rect(self.window, (100, 100, 100), (0, 0, self.width, 50))  # 绘制矩形背景# font = pygame.font.Font(None, 36)# text = font.render("Image Transformations", True, (255, 255, 255))  # 绘制白色文本# self.window.blit(text, (10, 10))if self.current_layer == 1:# 绘制第一层界面for button in self.buttons[:3]:button.draw(self.window)elif self.current_layer == 2:# 绘制第二层界面if original_img is not None:self.window.blit(original_img, (50, 250))for button in self.buttons[3:]:button.draw(self.window)elif self.current_layer == 3:# 绘制第三层界面if self.original_img is not None:self.window.blit(self.original_img, (50, 250))if self.transformed_img is not None:self.window.blit(self.transformed_img, (350, 250))for button in self.buttons[3:]:  # 在第三层界面上方显示操作按钮button.draw(self.window)if self.selected_transform is not None:font = pygame.font.Font(None, 36)text = font.render(f"Selected Transform: {self.selected_transform}", True, (255, 255, 255))text_rect = text.get_rect(center=(self.width // 2, 222))self.window.blit(text, text_rect)
5. handle_events(self, event)
  • 处理各种事件。
  • 如果事件类型是 pygame.MOUSEBUTTONDOWN,则处理鼠标按下事件:
    • 在第一层界面中,点击相应按钮加载图像或生成图形。
    • 在第二层和第三层界面中,点击相应按钮选择变换操作。
    • 如果点击左键,开始鼠标拖拽操作。
  • 如果事件类型是 pygame.MOUSEBUTTONUP,则处理鼠标释放事件,结束鼠标拖拽操作。
  • 如果事件类型是 pygame.MOUSEMOTION,则处理鼠标移动事件:
    • 如果处于第三层界面并正在拖拽,则根据选择的变换操作和鼠标移动量执行相应的变换,并更新变换后的图像。
6. save_image(self)
    def save_image(self):if self.transformed_img is not None:root = Tk()root.withdraw()file_path = filedialog.asksaveasfilename(defaultextension=".png")if file_path:pygame.image.save(self.transformed_img, file_path)
7. 代码整合
import numpy as np
import pygame
from gui.button import Button
from transformations.image_generators import *
from transformations.image_transformers import *
from tkinter import filedialog
from tkinter import Tkclass Window:def __init__(self, width, height, title):self.width = widthself.height = heightself.window = pygame.display.set_mode((width, height))pygame.display.set_caption(title)self.buttons = []self.current_layer = 1self.selected_transform = Noneself.transformed_img = Noneself.original_img = Noneself.mouse_dragging = Falseself.drag_start_pos = (0, 0)self.drag_offset = (0, 0)self.translation_offset = (0, 0)self.add_buttons()# pygame.display.set_icon(pygame.image.load("icon.png"))  # 加载图标文件self.pygame_to_numpy_map = {}# def pygame_to_numpy(self, surface):#     if surface in self.pygame_to_numpy_map:#         return self.pygame_to_numpy_map[surface]#     else:#         numpy_array = np.transpose(np.array(pygame.surfarray.pixels3d(surface)), (1, 0, 2))#         self.pygame_to_numpy_map[surface] = numpy_array#         return numpy_array# # def numpy_to_pygame(self, numpy_array):#     surface = pygame.Surface(numpy_array.shape[:2][::-1], pygame.SRCALPHA)#     pygame.surfarray.blit_array(surface, np.transpose(numpy_array, (1, 0, 2)))#     return surfacedef add_buttons(self):# 添加第一层界面按钮self.buttons.append(Button(50, 50, 200, 50, "Select Image", (255, 0, 0)))self.buttons.append(Button(350, 50, 200, 50, "Generate Square", (0, 255, 0)))self.buttons.append(Button(650, 50, 200, 50, "Generate Circle", (0, 0, 255)))# 添加第二层界面按钮# - "Translate"按钮颜色为红色# - "Rotate"按钮颜色为橙色 `(2# - "Isotropic Scale"按钮# - "Scale"按钮颜色为青色 `(0,# - "Mirror"按钮颜色为蓝色 `(0# - "Shear"按钮颜色为紫色 `(12# 问:为什么没有黄色# 答:黄色太耀眼了………self.buttons.append(Button(50, 50, 150, 50, "Translate", (255, 0, 0)))self.buttons.append(Button(250, 50, 150, 50, "Rotate", (255, 165, 0)))self.buttons.append(Button(450, 50, 150, 50, "Isotropic Scale", (0, 255, 0)))self.buttons.append(Button(650, 50, 150, 50, "Scale", (0, 255, 255)))self.buttons.append(Button(50, 150, 150, 50, "Mirror", (0, 0, 255)))self.buttons.append(Button(250, 150, 150, 50, "Shear", (128, 0, 128)))self.buttons.append(Button(450, 150, 150, 50, "Back to Selection", (128, 128, 128)))# 新增"保存图片"功能self.buttons.append(Button(650, 150, 150, 50, "Save Image", (0, 128, 0)))def clear(self):self.window.fill((220, 220, 220))  # ui界面灰色背景def draw(self, original_img):# # 绘制标题栏# pygame.draw.rect(self.window, (100, 100, 100), (0, 0, self.width, 50))  # 绘制矩形背景# font = pygame.font.Font(None, 36)# text = font.render("Image Transformations", True, (255, 255, 255))  # 绘制白色文本# self.window.blit(text, (10, 10))if self.current_layer == 1:# 绘制第一层界面for button in self.buttons[:3]:button.draw(self.window)elif self.current_layer == 2:# 绘制第二层界面if original_img is not None:self.window.blit(original_img, (50, 250))for button in self.buttons[3:]:button.draw(self.window)elif self.current_layer == 3:# 绘制第三层界面if self.original_img is not None:self.window.blit(self.original_img, (50, 250))if self.transformed_img is not None:self.window.blit(self.transformed_img, (350, 250))for button in self.buttons[3:]:  # 在第三层界面上方显示操作按钮button.draw(self.window)if self.selected_transform is not None:font = pygame.font.Font(None, 36)text = font.render(f"Selected Transform: {self.selected_transform}", True, (255, 255, 255))text_rect = text.get_rect(center=(self.width // 2, 222))self.window.blit(text, text_rect)def handle_events(self, event):if event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()if self.current_layer == 1:  # 第一层界面for button in self.buttons[:3]:if button.is_clicked(mouse_pos):if button.text == "Select Image":root = Tk()root.withdraw()self.file_path = filedialog.askopenfilename(title="Select Image")if self.file_path:self.original_img = pygame.image.load(self.file_path)self.original_img = pygame.transform.scale(self.original_img, (256, 256))self.current_layer = 2elif button.text == "Generate Square":self.original_img = generate_square(256, (255, 255, 255))self.current_layer = 2elif button.text == "Generate Circle":self.original_img = generate_circle(128, (255, 255, 255))self.current_layer = 2elif self.current_layer == 2 or self.current_layer == 3:  # 第二层和第三层界面for button in self.buttons[3:]:if button.is_clicked(mouse_pos):if button.text == "Save Image":self.save_image()elif button.text == "Back to Selection":  # 返回选择界面self.original_img = Noneself.selected_transform = Noneself.transformed_img = Noneself.current_layer = 1else:self.selected_transform = button.textself.transformed_img = self.original_img.copy()if self.current_layer == 2:self.current_layer = 3if event.button == 1:  # 鼠标左键self.mouse_dragging = Trueself.drag_start_pos = mouse_poselif event.type == pygame.MOUSEBUTTONUP:if event.button == 1:  # 鼠标左键self.mouse_dragging = Falseelif event.type == pygame.MOUSEMOTION:if self.mouse_dragging and self.current_layer == 3:pygame.mouse.set_cursor(pygame.SYSTEM_CURSOR_HAND)mouse_pos = pygame.mouse.get_pos()self.drag_offset = (mouse_pos[0] - self.drag_start_pos[0], mouse_pos[1] - self.drag_start_pos[1])if self.selected_transform == "Translate":self.translation_offset = self.drag_offset  # 更新平移偏移量self.transformed_img = translate(self.original_img, self.translation_offset[0],self.translation_offset[1])elif self.selected_transform == "Rotate":angle = self.drag_offset[0]self.transformed_img = rotate(self.original_img, angle)elif self.selected_transform == "Isotropic Scale":scale_factor = max(0.1, 1 + self.drag_offset[0] / 100)  # 限制缩放比例在0.1到无穷大之间self.transformed_img = isotropic_scale(self.original_img, scale_factor)elif self.selected_transform == "Scale":scale_x = max(0.1, 1 + self.drag_offset[0] / 100)  # 限制x方向缩放比例在0.1到无穷大之间scale_y = max(0.1, 1 + self.drag_offset[1] / 100)  # 限制y方向缩放比例在0.1到无穷大之间self.transformed_img = scale(self.original_img, scale_x, scale_y)elif self.selected_transform == "Mirror":if self.drag_offset[0] > 0:mirror_type = 'horizontal'else:mirror_type = 'vertical'self.transformed_img = mirror(self.original_img, mirror_type)elif self.selected_transform == "Shear":shear_x = self.drag_offset[0] / 100shear_y = self.drag_offset[1] / 100self.transformed_img = shear(self.original_img, shear_x, shear_y)else:pygame.mouse.set_cursor(pygame.SYSTEM_CURSOR_ARROW)# 在鼠标拖拽时将鼠标指针设置为手型, 否则设置为默认箭头形状。def save_image(self):if self.transformed_img is not None:root = Tk()root.withdraw()file_path = filedialog.asksaveasfilename(defaultextension=".png")if file_path:pygame.image.save(self.transformed_img, file_path)

2. Package: transformations

image_generators.py
import pygame# 生成正方形图像
def generate_square(size, color):img = pygame.Surface((size, size))img.fill(color)return img# 生成圆形图像
def generate_circle(radius, color):img = pygame.Surface((radius * 2, radius * 2))img.fill((0, 0, 0))img.set_colorkey((0, 0, 0))pygame.draw.circle(img, color, (radius, radius), radius)return img
image_transformers.py
import pygamewindow_width, window_height = 888, 888# 平移变换
def translate(img, x, y):width, height = img.get_size()translated_img = pygame.Surface((window_width, window_height), pygame.SRCALPHA)translated_img.blit(img, (x, y))return translated_img# 旋转变换
def rotate(img, angle):rotated_img = pygame.transform.rotate(img, angle)return rotated_img# 等比缩放变换
def isotropic_scale(img, scale_factor):width, height = img.get_size()new_size = (int(width * scale_factor), int(height * scale_factor))scaled_img = pygame.transform.scale(img, new_size)return scaled_img# 缩放变换
def scale(img, scale_x, scale_y):width, height = img.get_size()new_width = int(width * scale_x)new_height = int(height * scale_y)scaled_img = pygame.transform.scale(img, (new_width, new_height))return scaled_img# 镜像变换
def mirror(img, mirror_type):if mirror_type == 'horizontal':mirrored_img = pygame.transform.flip(img, True, False)elif mirror_type == 'vertical':mirrored_img = pygame.transform.flip(img, False, True)else:return imgreturn mirrored_img# 剪切变换
def shear(img, shear_x, shear_y):width, height = img.get_size()sheared_img = pygame.Surface((width + abs(shear_x * height), height + abs(shear_y * width)))sheared_img.set_colorkey((0, 0, 0))for x in range(width):for y in range(height):sheared_img.blit(img, (x + shear_x * y, y + shear_y * x), (x, y, 1, 1))return sheared_img

3. main.py

import pygame
from gui.window import Windowpygame.init()window_width, window_height = 888, 888
window = Window(window_width, window_height, "2D Transformations")running = True
while running:# 设置窗口大小for event in pygame.event.get():if event.type == pygame.QUIT:running = Falsewindow.handle_events(event)window.clear()window.draw(window.original_img)pygame.display.flip()pygame.quit()

4. 效果展示

在这里插入图片描述

选择图像

在这里插入图片描述

图像操作

在这里插入图片描述

保存图像

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Docker 安装 Skywalking以及UI界面

关于Skywalking 在现代分布式系统架构中,应用性能监控(Application Performance Monitoring, APM)扮演着至关重要的角色。本文将聚焦于一款备受瞩目的开源APM工具——Apache Skywalking,通过对其功能特性和工作原理的详细介绍&am…

【C++ leetcode 】双指针问题

1. 183. 移动零 题目 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 题目链接 . - 力扣(LeetCode) 画图 和 文字 分…

基于深度学习LSTM+NLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM+机器学习双推荐算法+scrapy爬虫+NLP情感分析+数据分析可视化)

文章目录 基于深度学习LSTMNLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM机器学习双推荐算法scrapy爬虫NLP情感分析数据分析可视化)项目概述深度学习长短时记忆网络(Long Short-Term Memory,LSTM)机器学习协…

golang常用库之-golang常用库之-ladon包 | 基于策略的访问控制

文章目录 golang常用库之-ladon包 | 基于策略的访问控制概念使用策略 条件 Conditions自定义conditionLadon Condition使用示例 持久化访问控制(Warden) 结合 Gin 开发一个简易 ACL 接口参考 golang常用库之-ladon包 | 基于策略的访问控制 https://github.com/ory/ladon Lado…

NPM 仓库的超集 JSR 来了!

引言 今天在 Deno 博客中看到了一篇文章,介绍了一个叫 JSR 的包管理注册中心,简单尝试了一下觉得还不错,本文将结合原文章和个人体验对 JSR 进行一个详细的介绍。 在现如今的前端开发中,包管理注册中心 (如 npmjs.com) 扮演着至…

Javaweb学习记录(一)Maven

Maven是一款Java项目管理工具,下面将介绍Maven的实际作用和相关的操作 Maven项目依赖的添加 在Maven项目中添加依赖,通过dependencies标签添加所有依赖,所有依赖都添加在里面,而单个依赖就使用dependency标签添加进项目&#xf…

Github 2024-03-17 php开源项目日报 Top9

根据Github Trendings的统计,今日(2024-03-17统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目9Blade项目2Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次关…

电脑充电器能充手机吗?如何给手机充电?

电脑充电器可以给手机充电吗? 电脑充电器可以给手机充电,但前提是电脑充电器的功率输出与手机的功率匹配且接口匹配。 假设电脑充电器的输出功率为5V/2A,手机也支持5V/2A的输入功率。 只要接口匹配,就可以使用电脑充电器给手机充…

记录-gitlab-安装在k8s中的一些注意点

一、已有cert-manager的时候如何配置? 1、首先需要创建一个ClusterIssuer apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata:name: letsencrypt-staging spec:acme:# You must replace this email address with your own.# Lets Encrypt will use thi…

微信开发者工具如何使用?使用注意事项

(1)单位如何进行换算? 1 px 750/屏幕宽度 rpx 1 rpx 屏幕宽度/750 px (2)如何新建文件? 1> 点开app.json 2> 在“pages/index/index”后面接“,pages/自定义文件夹名/自定义文件名”…

万界星空科技商业开源MES,技术支持+项目合作

商业开源的一套超有价值的JAVA制造执行MES系统源码 亲测 带本地部署搭建教程 教你如何在本地运行运行起来。 开发环境:jdk11tomcatmysql8springbootmaven 可以免费使用,需要源码价格便宜,私信我获取。 一、系统概述: MES制造执…

Spring炼气之路(炼气二层)

一、bean的配置 1.1 bean的基础配置 id&#xff1a; bean的id&#xff0c;使用容器可以通过id值获取对应的bean&#xff0c;在一个容器中id值唯一 class&#xff1a; bean的类型&#xff0c;即配置的bean的全路径类名 <bean id"bookDao" class "com.zhang…

软件测试 自动化测试selenium 基础篇

文章目录 1. 什么是自动化测试&#xff1f;1.1 自动化分类 2. 什么是 Selenium &#xff1f;3. 为什么使用 Selenium &#xff1f;4. Selenium 工作原理5. Selenium 环境搭建 1. 什么是自动化测试&#xff1f; 将人工要做的测试工作进行转换&#xff0c;让代码去执行测试工作 …

macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载

macOS Ventura 13.6.5 (22G621) Boot ISO 原版可引导镜像下载 3 月 8 日凌晨&#xff0c;macOS Sonoma 14.4 发布&#xff0c;同时带来了 macOS Ventru 13.6.5 和 macOS Monterey 12.7.4 安全更新。 macOS Ventura 13.6 及更新版本&#xff0c;如无特殊说明皆为安全更新&…

【开源鸿蒙】编译OpenHarmony轻量系统QEMU RISC-V版

文章目录 一、背景介绍二、准备OpenHarmony源代码三、准备hb命令3.1 安装hb命令3.2 检查hb命令 四、编译RISC-V架构的OpenHarmony轻量系统4.1 设置hb构建目标4.2 启动hb构建过程 五、问题解决5.1 hb set 报错问题解决 六、参考链接 开源鸿蒙坚果派&#xff0c;学习鸿蒙一起来&a…

Vue.js+SpringBoot开发农家乐订餐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户2.2 管理员 三、系统展示四、核心代码4.1 查询菜品类型4.2 查询菜品4.3 加购菜品4.4 新增菜品收藏4.5 新增菜品留言 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的农家乐订餐系统&#xff0c…

ISIS接口MD5 算法认证实验简述

默认情况下&#xff0c;ISIS接口认证通过在ISIS协议数据单元&#xff08;PDU&#xff09;中添加认证字段&#xff0c;例如&#xff1a;MD5 算法&#xff0c;用于验证发送方的身份。 ISIS接口认证防止未经授权的设备加入到网络中&#xff0c;并确保邻居之间的通信是可信的。它可…

Blocks —— 《Objective-C高级编程 iOS与OS X多线程和内存管理》

目录 Blocks概要什么是BlocksOC转C方法关于几种变量的特点 Blocks模式Block语法Block类型 变量截获局部变量值__block说明符截获的局部变量 Blocks的实现Block的实质 Blocks概要 什么是Blocks Blocks是C语言的扩充功能&#xff0c;即带有局部变量的匿名函数。 顾名思义&#x…

数据结构与算法Bonus-KNN问题的代码求解过程

一、问题提出 &#xff08;一&#xff09;要求 1.随机生成>10万个三维点的点云&#xff0c;并以适当方式存储 2.自行实现一个KNN算法&#xff0c;对任意Query点&#xff0c;返回最邻近的K个点 3.不允许使用第三方库(e.g.flann&#xff0c;PCL,opencv)! 4.语言任选(推荐…

ChatGPT编程实现简易聊天工具

ChatGPT编程实现简易聊天工具 今天借助[[小蜜蜂]][https://zglg.work]网站的ChatGPT练习socket编程&#xff0c;实现一个简易聊天工具软件。 环境&#xff1a;Pycharm 2021 系统&#xff1a;Mac OS 向ChatGPT输入如下内容&#xff1a; ChatGPT收到后&#xff0c;根据返回结…