pyside6学习专栏(八):在PySide6中使用matplotlib库绘制三维图形

news2025/4/16 19:25:38

本代码原来是PySide6官网的一个示例程序,我对其进行的详细的注释,同时增加了一个功能:加载显示cass的地形图坐标数据示例,示例可显示以下几种三维图形

程序运行界面如下:

代码如下:

# -*- coding: utf-8 -*-
from __future__ import annotations

import sys,time,copy,os,random
import numpy as np
from matplotlib.backends.backend_qtagg import FigureCanvas
from matplotlib.figure import Figure
from mpl_toolkits.mplot3d import axes3d
from PySide6.QtCore import Qt, Slot
from PySide6.QtGui import QAction, QKeySequence
from PySide6.QtWidgets import (QApplication, QComboBox, QHBoxLayout,
                               QHeaderView, QLabel, QMainWindow, QSlider,
                               QTableWidget, QTableWidgetItem, QVBoxLayout,
                               QWidget)

"""这是一个使用3Dmatplotlib plot 在Qt Widgets上显示三维图形的示例
原版为PySide6官网上的一示例代码,对其进行了详细注解,同时扩展增加了以下一组示例代码
1、从外部导入地形图数据(cass地形测绘数据格式)并进行显示地形三角网

"""
class ApplicationWindow(QMainWindow):
    def __init__(self, parent=None):
        QMainWindow.__init__(self, parent)
        
        self.column_names = ["X向", "Y向", "Z向"]

        #定义中心窗口,并居中显示
        self._main = QWidget()
        self.setCentralWidget(self._main)
        self.setWindowTitle('PySide6+matplotlib绘制三维图示例')
        #定义菜单栏
        self.menu = self.menuBar()
        self.menu_file = self.menu.addMenu("文件")
        exit = QAction("离开", self, triggered=qApp.quit)  # noqa: F821
        self.menu_file.addAction(exit)

        self.menu_about = self.menu.addMenu("关于")
        about = QAction("关于Qt", self, shortcut=QKeySequence(QKeySequence.HelpContents),
                        triggered=QApplication.aboutQt)  # noqa: F821
        self.menu_about.addAction(about)

        #窗体左侧轮廓:为一视图和标签及滑条
        self.fig = Figure(figsize=(5, 3))
        self.canvas = FigureCanvas(self.fig)

        #左侧滑条控件
        min = 0
        max = 360
        self.slider_azim = QSlider(minimum=min, maximum=max, orientation=Qt.Orientation.Horizontal)
        self.slider_elev = QSlider(minimum=min, maximum=max, orientation=Qt.Orientation.Horizontal)

        self.slider_azim_layout = QHBoxLayout()
        self.slider_azim_layout.addWidget(QLabel(f"{min}"))
        self.slider_azim_layout.addWidget(self.slider_azim)
        self.slider_azim_layout.addWidget(QLabel(f"{max}"))

        self.slider_elev_layout = QHBoxLayout()
        self.slider_elev_layout.addWidget(QLabel(f"{min}"))
        self.slider_elev_layout.addWidget(self.slider_elev)
        self.slider_elev_layout.addWidget(QLabel(f"{max}"))

        #窗体右侧为一表格控件
        self.table = QTableWidget()
        header = self.table.horizontalHeader()
        header.setSectionResizeMode(QHeaderView.Stretch)

        #窗体右侧顶部为一组合框控件
        self.combo = QComboBox()
        self.combo.addItems(["网格", "表面", "三角网表面", "球面","导入cass地形图","导入散点模型"])

        #设置窗体右侧布局
        rlayout = QVBoxLayout()
        rlayout.setContentsMargins(1, 1, 1, 1)
        rlayout.addWidget(QLabel("Plot类:"))
        rlayout.addWidget(self.combo)
        rlayout.addWidget(self.table)

        #设置窗体左侧布局
        llayout = QVBoxLayout()
        rlayout.setContentsMargins(1, 1, 1, 1)
        llayout.addWidget(self.canvas, 88)
        llayout.addWidget(QLabel("方位角:"), 1)
        llayout.addLayout(self.slider_azim_layout, 5)
        llayout.addWidget(QLabel("高程:"), 1)
        llayout.addLayout(self.slider_elev_layout, 5)

        #窗体总布局采用竖向布局
        layout = QHBoxLayout(self._main)
        layout.addLayout(llayout, 70)   #左侧布局占70%
        layout.addLayout(rlayout, 30)   #右侧布局点30%

        #定义信号槽绑定
        self.combo.currentTextChanged.connect(self.combo_option)  #组合框选择项发生变化时
        self.slider_azim.valueChanged.connect(self.rotate_azim)   #方位角(XY平面)滑条控件值发生变化时
        self.slider_elev.valueChanged.connect(self.rotate_elev)   #方位角(Z向)滑条控件值发生变化时

        #初始化视图显示
        self.plot_wire()    #默认加载
        self._ax.view_init(30, 30)
        self.slider_azim.setValue(30)
        self.slider_elev.setValue(30)
        self.fig.canvas.mpl_connect("button_release_event", self.on_click)   #左侧画布视图单击后鼠标释放时信号

    #槽函数: 单击Matplotlib视时发出的信号
    def on_click(self, event):
        azim, elev = self._ax.azim, self._ax.elev
        self.slider_azim.setValue(azim + 180)
        self.slider_elev.setValue(elev + 180)

    # 设置表格中的数据:传入XYZ数据(数据是一个np一维数组)
    def set_table_dataS(self, xS, yS, zS):
        for i in range(len(xS)):
            self.table.setItem(i, 0, QTableWidgetItem(f"{xS[i]:.2f}"))
            self.table.setItem(i, 1, QTableWidgetItem(f"{yS[i]:.2f}"))
            self.table.setItem(i, 2, QTableWidgetItem(f"{zS[i]:.2f}"))

    #重绘视图和表格时,当前的XYZ数据集
    def set_canvas_table_configuration(self, row_count, dataS):
        self.fig.set_canvas(self.canvas)
        self._ax = self.canvas.figure.add_subplot(projection="3d")
        self._ax.set_xlabel(self.column_names[0])    #表格的0例数据全部导入到视图的的x
        self._ax.set_ylabel(self.column_names[1])    #表格的0例数据全部导入到视图的的y
        self._ax.set_zlabel(self.column_names[2])    #表格的0例数据全部导入到视图的的z

        self.table.setRowCount(row_count)
        self.table.setColumnCount(3)
        self.table.setHorizontalHeaderLabels(self.column_names)
        self.set_table_dataS(dataS[0], dataS[1], dataS[2])

    # Plot 绘制样式:
    #视图和表格中数据为四边形网(无表面)
    def plot_wire(self):
        #产生示例数据: np二维数组->(200,200)
        self.X, self.Y, self.Z = axes3d.get_test_data(0.03)    #从axes3d类中得到示例数据
        self.set_canvas_table_configuration(len(self.X[0]), (self.X[0], self.Y[0], self.Z[0]))
        self._ax.plot_wireframe(self.X, self.Y, self.Z, rstride=10, cstride=10, cmap="viridis")
        self.canvas.draw()
    #视图和表格中数据为漏斗型表面
    def plot_surface(self):
        #产生示例数据: np二维数组->(30,30)
        self.X, self.Y = np.meshgrid(np.linspace(-6, 6, 30), np.linspace(-6, 6, 30))   
        self.Z = np.sin(np.sqrt(self.X ** 2 + self.Y ** 2))

        self.set_canvas_table_configuration(len(self.X[0]), (self.X[0], self.Y[0], self.Z[0]))
        self._ax.plot_surface(self.X, self.Y, self.Z,
                              rstride=1, cstride=1, cmap="viridis", edgecolor="none")
        self.canvas.draw()
    #视图和表格中数据为三角网表面
    def plot_triangular_surface(self):
        #产生示例数据: np一维数组->(289,)
        radii = np.linspace(0.125, 1.0, 8)
        angles = np.linspace(0, 2 * np.pi, 36, endpoint=False)[..., np.newaxis]
        self.X = np.append(0, (radii * np.cos(angles)).flatten())
        self.Y = np.append(0, (radii * np.sin(angles)).flatten())
        self.Z = np.sin(-self.X * self.Y)

        self.set_canvas_table_configuration(len(self.X), (self.X, self.Y, self.Z))
        self._ax.plot_trisurf(self.X, self.Y, self.Z, linewidth=0.2, antialiased=True)
        self.canvas.draw()

    #视图和表格中数据为球面
    def plot_sphere(self):
        #产生示例数据: np二维数组->(100,100)
        u = np.linspace(0, 2 * np.pi, 100)
        v = np.linspace(0, np.pi, 100)
        self.X = 10 * np.outer(np.cos(u), np.sin(v))
        self.Y = 10 * np.outer(np.sin(u), np.sin(v))
        self.Z = 9 * np.outer(np.ones(np.size(u)), np.cos(v))

        self.set_canvas_table_configuration(len(self.X), (self.X[0], self.Y[0], self.Z[0]))  #按当前球面的数据重新填写表格
        self._ax.plot_surface(self.X, self.Y, self.Z)
        self.canvas.draw()
#--------------------------------------------------------------------------------------------------------------------------------------------------------------
    #自定义数据1:视图和表格中数据为从外部文件导入地形图数据: 本例导入CASS的抄测地形坐标文件
    def plot_loadMapDatas(self):
        #导入的示例数据: np二维数组->(526,5)
        self.loadMapData('cass格式地形95个点.DAT')
        self.cassXyz=self.cass_Datas[:,2:5]
        self.X = self.cass_Datas[:,2:3].reshape(int(self.cass_Datas[:,2:3].size))  
        self.Y = self.cass_Datas[:,3:4].reshape(int(self.cass_Datas[:,3:4].size)) 
        self.Z = self.cass_Datas[:,4:5].reshape(int(self.cass_Datas[:,4:5].size)) 
        self.set_canvas_table_configuration(len(self.X), (self.X, self.Y, self.Z))
        self._ax.plot_trisurf(self.X, self.Y, self.Z, linewidth=0.2, antialiased=True)
        self.canvas.draw()
    #自定义数据2:视图和表格中数据为从外部文件导入散点模形
    def plot_load3DSapeDatas(self):
        #产生示例数据: np二维数组->(n,8)
        pass
        self.canvas.draw()

    #从外部地形数据文件导入全部点的坐标数据,示例采用CASS的dat格式数据 二维数组(n,5):如:1,,86240.8790,87568.3282,252.6600
    #导入cass软件用的dat测绘数据
    def loadMapData(self,mapDataFile,type=0):
        s=''
        lstRowData=[]
        lstData=[]
        index=0
        #以下四个变量用于测试坐标点文件中是否存在差距较大的数,以提醒修改,如不修改,可能偏差点会对计算结果影响较大
        minXYZ=[1000000,1000000,1000000]
        maxXYZ=[0,0,0]
        self.minXYZid=[0,0,0]
        self.maxXYZid=[0,0,0]
        if(os.path.exists(mapDataFile)):
            rf = open(mapDataFile,'r',encoding='utf-8')
            lindS=''
            for lineS in rf.readlines():
                lstRowData.clear()
                s=lineS.strip()
                s=s.replace("\n","")  #将从文件中读出的\n删除,此语句可能会报异常
                s=s.replace("\r","")  #将从文件中读出的\r删除,此语句可能会报异常
                if(s==''):continue  #去空行
                lstRowData = s.split(',')
                if(len(lstRowData)!=5):continue  #去格式不对的行(要求每行5个数据,4个逗号)
                lstRowData[0]=index  #重新为数据编号
                if(len(str(lstRowData[1]))!=0): 
                    lstRowData[1]=1                  #对第二个参数不为空时,改其值为1,否则为0
                else:
                    lstRowData[1]=0
                lstRowData[2]=float(lstRowData[2])   #dat文件中的坐标x坐标
                lstRowData[3]=float(lstRowData[3])   #dat文件中的坐标y坐标
                lstRowData[4]=float(lstRowData[4])   #dat文件中的坐标z坐标
                lstData.append(copy.deepcopy(lstRowData))

                #以下对导入的点作最大最小值记录
                if(minXYZ[0]>lstRowData[2]):
                    minXYZ[0]=lstRowData[2]
                    self.minXYZid[0]=index
                if(minXYZ[1]>lstRowData[3]):
                    minXYZ[1]=lstRowData[3]
                    self.minXYZid[1]=index
                if(minXYZ[2]>lstRowData[4]):
                    minXYZ[2]=lstRowData[4]
                    self.minXYZid[2]=index
                if(maxXYZ[0]<lstRowData[2]):
                    maxXYZ[0]=lstRowData[2]
                    self.maxXYZid[0]=index
                if(maxXYZ[1]<lstRowData[3]):
                    maxXYZ[1]=lstRowData[3]
                    self.maxXYZid[1]=index
                if(maxXYZ[2]<lstRowData[4]):
                    maxXYZ[2]=lstRowData[4]
                    self.maxXYZid[2]=index
                index+=1
            rf.close
            print(f'\n minXYZid={self.minXYZid}\n maxXYZid={self.maxXYZid}\n')
            self.pointCount=len(lstData)          #记录本数据文件的总坐标点数
            self.cass_Datas=np.array(lstData)      #保存全部的np原始数据
            #开始处理原始数据
            print(f'导入cass测绘数据文件"{mapDataFile}"成功!')  
            return True
        return False

    #-------------------------------------------------------------------------------------------------------------------------------------------------------------
    #槽函数:组合框选择项发生变化时
    @Slot()
    def combo_option(self, text):
        if text == "网格":
            self.plot_wire()
        elif text == "表面":
            self.plot_surface()
        elif text == "三角网表面":
            self.plot_triangular_surface()
        elif text == "球面":
            self.plot_sphere()
        elif text == "导入cass地形图":
            self.plot_loadMapDatas()
        elif text == "导入散点模型":
            pass     #暂未扩展

    #方位角(XY平面)滑条控件值发生变化时槽函数
    @Slot()
    def rotate_azim(self, value):
        self._ax.view_init(self._ax.elev, value)
        self.fig.set_canvas(self.canvas)
        self.canvas.draw()

    #方位角(Z向)滑条控件值发生变化时槽函数
    @Slot()
    def rotate_elev(self, value):
        self._ax.view_init(value, self._ax.azim)
        self.fig.set_canvas(self.canvas)
        self.canvas.draw()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = ApplicationWindow()
    w.setFixedSize(1280, 720)
    w.show()
    app.exec()

扩展导入的示例cass地形坐标文件内容如下,copy出来后粘贴到记事本另存文件为“cass格式地形95个点.DAT”,将此文件同代码模块文件放在一个目录里即可

1,,8535.0620,20831.2885,384.9640
2,,8564.7031,20818.7979,386.8800
3,,8566.4578,20824.8254,386.8800
4,,8580.2215,20819.2465,388.0300
5,,8590.5382,20815.9465,388.7660
6,,8525.9910,20830.1208,377.0900
7,,8502.7606,20839.6356,383.2100
8,,8537.2997,20855.6420,385.0000
9,,8537.6544,20857.5221,385.0000
10,,8531.2665,20856.1611,385.3500
11,,8534.0532,20857.8461,385.3500
12,,8533.6219,20853.4993,385.3500
13,,8595.2543,20819.8627,391.3100
14,,8558.8369,20813.6480,387.1910
15,,8576.1126,20813.9809,388.4000
16,,8582.0086,20813.3326,388.7660
17,,8574.6472,20807.6877,388.2800
18,,8578.2663,20799.6209,387.8800
19,,8581.3061,20806.9918,388.7000
20,,8544.7344,20858.6430,384.0600
21,,8546.2683,20821.1758,385.8000
22,,8550.3724,20833.8913,385.5660
23,,8544.0034,20833.0925,385.4460
24,,8597.5370,20808.7561,390.1870
25,,8588.3263,20809.5540,389.2140
26,,8581.5961,20810.1927,388.7600
27,,8575.4039,20810.7972,388.3400
28,,8569.2116,20813.0327,387.9020
29,,8560.1202,20816.6382,387.2510
30,,8548.2657,20828.3883,385.8600
31,,8547.2163,20833.4220,385.5060
32,,8546.3340,20840.2102,385.0240
33,,8545.5363,20848.8394,384.7000
34,,8553.8038,20819.7866,386.7750
35,,8550.7684,20823.7166,386.2300
36,,8544.1572,20863.7326,383.6830
37,,8543.6784,20868.8701,383.3000
38,,8529.1556,20863.1078,383.3000
39,,8533.9251,20864.9365,383.3000
40,,8538.7670,20866.7411,383.3000
41,,8548.0837,20870.6865,383.3000
42,,8540.6612,20862.3642,383.6830
43,,8536.5205,20861.3426,383.6830
44,,8531.3321,20860.6948,383.6830
45,,8541.7397,20859.0886,384.0600
46,,8538.8243,20859.4973,384.0600
47,,8528.7124,20850.9021,384.1650
48,,8521.5594,20849.2209,384.1650
49,,8511.9518,20846.3489,384.1650
50,,8531.5137,20846.2046,384.6400
51,,8537.3263,20847.9737,384.6400
52,,8533.9232,20839.3649,384.9640
53,,8540.2409,20839.6848,384.9640
54,,8540.3997,20832.9546,385.4460
55,,8526.7023,20856.3875,384.0600
56,,8520.6090,20855.1941,384.0600
57,,8512.6042,20852.9863,384.0600
58,,8503.9422,20850.4801,384.0600
59,,8499.1817,20849.5675,384.0600
60,,8527.0635,20859.6211,383.6830
61,,8520.2142,20858.3600,383.6830
62,,8511.2339,20856.1466,383.6830
63,,8503.0271,20854.0863,383.6830
64,,8495.8691,20853.3912,383.6830
65,,8585.2618,20790.1975,391.2700
66,,8583.4519,20792.3716,389.6900
67,,8526.2071,20833.0721,377.0900
68,,8511.7583,20834.1661,377.2200
69,,8501.9803,20833.0331,377.2200
70,,8485.7633,20837.8191,377.2800
71,,8480.4063,20841.6261,377.4100
72,,8483.0683,20846.3021,378.1000
73,,8596.9664,20786.3285,391.8000
74,,8587.9307,20791.0655,390.0370
75,,8586.8727,20802.9864,389.1540
76,,8596.9759,20800.4602,390.0300
77,,8565.5924,20800.8019,386.6600
78,,8521.5125,20838.1220,380.1400
79,,8487.6261,20847.4016,378.7800
80,,8497.7541,20845.0826,378.7100
81,,8494.2471,20850.5446,381.6400
82,,8514.0502,20841.4980,383.2100
83,,8524.2421,20843.4686,384.2000
84,,8541.1481,20826.6746,384.7300
85,,8561.0611,20806.2766,386.6300
86,,8547.6462,20816.0442,386.0600
87,,8557.0848,20809.5790,387.1910
88,,8566.6440,20805.8867,387.8420
89,,8580.9124,20803.9858,388.7000
90,,8558.3059,20823.0354,386.8800
91,,8570.3499,20819.9284,388.0300
92,,8587.7689,20820.1814,389.6800
93,,8571.6399,20826.1884,388.0000
94,,8556.9299,20831.2744,386.4100
95,,8550.9689,20844.2314,385.2700

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

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

相关文章

松灵机器人地盘 安装 ros 驱动 并且 发布ros 指令进行控制

安装驱动 $ cd ~/catkin_ws/src $ git clone https://github.com/agilexrobotics/ugv_sdk.git $ git clone https://github.com/agilexrobotics/scout_ros.git $ cd .. $ catkin_make安装 ● 使能 gs_usb 内核模块 ● 设置 500k 波特率和使能 can-to-usb 适配器 sudo modp…

python力扣2:两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 开…

服务器间迁移conda环境

注意&#xff1a;可使用迁移miniconda文件 or 迁移yaml文件两种方式&#xff0c;推荐前者&#xff0c;基本无bug&#xff01; 一、迁移miniconda文件&#xff1a; 拷贝旧机器的miniconda文件文件到新机器: 内网拷贝&#xff1a;scp -r mazhf192.168.1.233:~/miniconda3 ~/ 外…

Python 绘制迷宫游戏,自带最优解路线

1、需要安装pygame 2、上下左右移动&#xff0c;空格实现物体所在位置到终点的路线&#xff0c;会有虚线绘制。 import pygame import random import math# 迷宫单元格类 class Cell:def __init__(self, x, y):self.x xself.y yself.walls {top: True, right: True, botto…

恶意 SSP 注入收集密码

SSP 安全服务提供者&#xff0c;是微软提供的与安全有关的函数接口&#xff0c;用户可根据自己的需求调用 SSP 接口实现高度自定义的身份验证等安全功能。攻击者注入恶意的 SSP 接口覆盖微软默认的某些安全功能&#xff0c;导致用户一旦进行身份验证&#xff0c;恶意的 SSP 将保…

Python----数据分析(Numpy:安装,数组创建,切片和索引,数组的属性,数据类型,数组形状,数组的运算,基本函数)

一、 Numpy库简介 1.1、概念 NumPy(Numerical Python)是一个开源的Python科学计算库&#xff0c;旨在为Python提供 高性能的多维数组对象和一系列工具。NumPy数组是Python数据分析的基础&#xff0c;许多 其他的数据处理库&#xff08;如Pandas、SciPy&#xff09;都依赖于Num…

Pytest之fixture的常见用法

文章目录 1.前言2.使用fixture执行前置操作3.使用conftest共享fixture4.使用yield执行后置操作 1.前言 在pytest中&#xff0c;fixture是一个非常强大和灵活的功能&#xff0c;用于为测试函数提供固定的测试数据、测试环境或执行一些前置和后置操作等&#xff0c; 与setup和te…

如何把网络ip改为动态:全面指南

在数字化时代&#xff0c;网络IP地址作为设备在网络中的唯一标识&#xff0c;扮演着至关重要的角色。随着网络环境的不断变化&#xff0c;静态IP地址的局限性逐渐显现&#xff0c;而动态IP地址则因其灵活性和安全性受到越来越多用户的青睐。那么&#xff0c;如何把网络IP改为动…

anythingLLM和deepseek4j和milvus组合建立RAG知识库

1、deepseek本地化部署使用 ollama 下载模型 Tags bge-m3 bge-m3:latest deepseek-r1:32b deepseek-r1:8b 2、安装好向量数据库 milvus docker安装milvus单机版-CSDN博客 3、安装 anythingLLM AnythingLLM | The all-in-one AI application for everyone …

和鲸科技推出人工智能通识课程解决方案,助力AI人才培养

2025年2月&#xff0c;教育部副部长吴岩应港澳特区政府邀请&#xff0c;率团赴港澳宣讲《教育强国建设规划纲要 (2024—2035 年)》。在港澳期间&#xff0c;吴岩阐释了教育强国目标的任务&#xff0c;并与特区政府官员交流推进人工智能人才培养的办法。这一系列行动体现出人工智…

当我删除word文件时无法删除,提示:操作无法完成,因为已在Microsoft Word中打开

现象&#xff1a; 查看电脑桌面下方的任务栏&#xff0c;明明已经关闭了WPS和WORD软件&#xff0c;但是打开word文档时还是提示&#xff1a; 解决方法步骤&#xff1a; 1、按一下键盘上的ctrl Shift Esc 键打开任务管理器 2、在进程中找到如下&#xff1a; 快速找到的方法…

高频面试题(含笔试高频算法整理)基本总结回顾3

目录 一、基本面试流程回顾 二、基本高频算法题展示 三、基本面试题总结回顾 &#xff08;一&#xff09;Java高频面试题整理 &#xff08;二&#xff09;JVM相关面试问题整理 &#xff08;三&#xff09;MySQL相关面试问题整理 &#xff08;四&#xff09;Redis相关面试…

Python中字符串的常用操作

一、r原样输出 在 Python 中&#xff0c;字符串前加 r&#xff08;即 r"string" 或 rstring&#xff09;表示创建一个原始字符串&#xff08;raw string&#xff09;。下面详细介绍原始字符串的特点、使用场景及与普通字符串的对比。 特点 忽略转义字符&#xff1…

卷积神经网络(cnn,类似lenet-1,八)

我们第一层用卷积核&#xff0c;前面已经成功&#xff0c;现在我们用两层卷积核&#xff1a; 结构如下&#xff0c;是不是很想lenet-1&#xff0c;其实我们24年就实现了sigmoid版本的&#xff1a; cnn突破九&#xff08;我们的五层卷积核bpnet网络就是lenet-1&#xff09;-CS…

Win32 C++ 电源计划操作

CPowerCfgUtils.h #pragma once#include <Windows.h> #include <powrprof.h>// https://learn.microsoft.com/zh-cn/windows/win32/api/powrprof/?sourcerecommendations//节能 //DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, …

PH热榜 | 2025-03-01

1. Helix 标语&#xff1a;从想法到原型只需3分钟 介绍&#xff1a;Helix可以在几分钟内将你的创业想法变成一个准备好接受投资的原型。你可以创建功能齐全、可点击的用户界面和用户体验设计&#xff0c;完全不需要任何设计技能。 产品网站&#xff1a; 立即访问 Product H…

Tomcat基础知识及其配置

1.Tomcat简介 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun和其他一些公司及个人共同开发而成。 Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服…

【LeetCode】739.每日温度

目录 题目描述输入输出示例及数据范围思路&#xff1a;单调栈C 实现 题目描述 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这…

测试金蝶云的OpenAPI

如何使用Postman测试K3Cloud的OpenAPI 1. 引言 在本篇博客中&#xff0c;我将带你逐步了解如何使用Postman测试和使用K3Cloud的OpenAPI。内容包括下载所需的SDK文件、配置文件、API调用及测试等步骤。让我们开始吧&#xff01; 2. 下载所需的SDK文件 2.1 获取SDK 首先&…

SID History 域维权

SID History 域林攻击&#xff1a;域林攻击详解-CSDN博客 SID History 根据微软的描述&#xff0c;SID History 属性是微软对域内用户进行域迁移的支持而创建的。每当对象从一个域移动到另一个域时&#xff0c;都会创建一个新的 SID&#xff0c;并且该新 SID 将成为 objectSI…