自定义复杂AntV/G6案例

news2025/1/22 21:05:52

一、效果图

在这里插入图片描述

二、源码

/**
*
* Author: me
* CreatDate: 2024-08-22
*
* Description: 复杂G6案例
*
*/
<template>
  <div class="moreG6-wapper">
    <div id="graphContainer" ref="graphRef" class="graph-content"></div>
  </div>
</template>

<script>
import G6 from "@antv/g6";
export default {
  name: "moreG6",
  components: {},
  props: {},
  data() {
    return {
      graph: null, // G6 实例
      graphData: {
        nodes: [],
        edges: [],
      },
      dataList: [
        {
          name: "第一阶段",
          aimData: [
            {
              title: "张三",
              aim: "战胜李四",
              type: 1,
            },
            {
              title: "李四",
              aim: "战胜张三",
              type: 2,
            },
          ],
          eventData: [
            {
              time: "1948年11月6日",
              isLeft: true, // 在左边还是在右边
              dataList: {
                title: "发现王五正在收缩",
                type: 1,
                domain: "综合",
                describe: "发现王五正在收缩,当即转入追击",
                children: [
                  {
                    title: "张三攻占a区,没发现李四",
                    type: 1,
                    domain: "战斗",
                    describe: "",
                  },
                  {
                    title: "李四调动李白",
                    type: 1,
                    domain: "战斗",
                    describe: "",
                  },
                ],
              },
            },
            {
              time: "1948年11月7日",
              isLeft: false,
              dataList: {
                title: "张三团守a州,同时向b州东进",
                type: 2,
                domain: "综合",
                describe: "张三团守a州,令小红、小兰两人回b州东进",
                children: [
                  {
                    title: "李四在b官邸",
                    type: 2,
                    domain: "战斗",
                    describe: "",
                  },
                ],
              },
            },
          ],
        },
        {
          name: "第二阶段",
          aimData: [
            {
              title: "小红",
              aim: "战胜王五",
              type: 1,
            },
            {
              title: "小兰",
              aim: "战胜王五",
              type: 1,
            },
            {
              title: "王五",
              aim: "战胜张三",
              type: 2,
            },
          ],
          eventData: [
            {
              time: "1948年11月6日",
              isLeft: true,
              dataList: {
                title: "发现王五正在收缩",
                type: 1,
                domain: "综合",
                describe: "发现王五正在收缩,当即转入追击",
                children: [
                  {
                    title: "张三攻占a区,没发现李四",
                    type: 1,
                    domain: "战斗",
                    describe: "",
                  },
                  {
                    title: "李四调动李白",
                    type: 1,
                    domain: "战斗",
                    describe: "",
                  },
                  {
                    title: "李四造谣张三",
                    type: 1,
                    domain: "舆论",
                    describe: "",
                  },
                ],
              },
            },
            {
              time: "1948年11月7日",
              isLeft: false,
              dataList: {
                title: "张三团守a州",
                type: 2,
                domain: "综合",
                describe: "张三团守a州,令小红、小兰两人回徐州东进",
                children: [
                  {
                    title: "李四在b官邸",
                    type: 2,
                    domain: "前进",
                    describe: "",
                  },
                  {
                    title: "小兰垄断李四的口粮",
                    type: 2,
                    domain: "商战",
                    describe: "",
                  },
                ],
              },
            },
          ],
        },
        {
          name: "第三阶段",
        },
        {
          name: "第四阶段",
        },
      ],
      bgColor: "#0B1E4C",
      stageSize: [110, 40],
      aimSize: [150, 30],
      eventSize: [176, 46],
      eventContentSize: [182, 90],
      eventDataSize: [120, 40],
      stageSpace: 100,
      openSpace: 40,
      aimSpace: 150,
      eventSpace: 220,
      domainW: 28,
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.initData();
      this.initGraph();
      this.drawGraph();
    });
  },
  methods: {
    /**
     * 根据数据生成节点和边数据
     */
    initData() {
      const that = this;
      const dom = this.$refs.graphRef;
      const centerX = dom.offsetWidth / 2;
      this.dataList.forEach((stage, index) => {
        const pl = ((stage.partieList?.length || 0) / 2) * that.aimSize[1];
        let eventLen = 0;
        if (index === 0) {
          stage.y = 40 + pl;
        } else {
          eventLen = this.dataList[index - 1].eventData?.length || 0;
          stage.y =
            this.dataList[index - 1].y +
            eventLen * that.eventSpace +
            that.stageSpace * 2 +
            pl;
        }
        // 1.阶段总线
        const stageNde = {
          id: `stageNode${index}`, // 元素的 id
          label: stage.name, // 标签文字
          x: centerX,
          y: stage.y,
          type: "rect", // 元素的图形
          size: that.stageSize, // 元素的大小
          // 标签配置属性
          labelCfg: {
            positions: "center", // 标签在元素中的位置
            // 包裹标签样式属性的字段 style 与标签其他属性在数据结构上并行
            style: {
              fill: "#fff", // 填充色,这里是文字颜色
              fontSize: 16,
              // fontWeight: "bold",
              fontFamily: "黑体",
            },
          },
          // 包裹样式属性的字段 style 与其他属性在数据结构上并行
          style: {
            lineWidth: 2,
            fill: "#0F3664", // 元素的填充色
            stroke: "#fff", // 元素的描边色
            radius: 20, // 圆角
          },
          // 锚点
          anchorPoints: [
            [1, 0.5], // 右中
            [0.5, 1], // 下中
          ],
        };
        this.graphData.nodes.push(stageNde);
        if (index !== 0) {
          const stageLine = {
            id: `stageLine${index}`,
            source: `stageNode${index - 1}`, // 和上面的保持一致
            target: `stageNode${index}`,
            type: "line", // 边形状
            style: {
              lineWidth: 2,
              color: "#fff",
              opacity: 0.7, // 边透明度
            },
          };
          this.graphData.edges.push(stageLine);
        }
        // 2.阶段-目标数据
        if (stage.aimData && stage.aimData.length) {
          const adl = stage.aimData.length;
          // 目标数据
          stage.aimData.forEach((aim, aimIndex) => {
            // aimNodeY 先大概吧,后面再重新计算优化一下
            const aimNodeY =
              stage.y + (that.aimSize[1] + 10) * aimIndex - pl - adl * 12;
            // 目标标题
            const aimNode = {
              id: `aimNode${index}${aimIndex}`,
              label: aim.title + "目标",
              x: centerX + that.stageSize[0] + that.openSpace * 2.5,
              y: aimNodeY,
              type: "rect",
              size: that.aimSize,
              labelCfg: {
                style: {
                  textAlign: "center",
                  fill: "#fff",
                  fontSize: 14,
                  fontFamily: "黑体",
                },
              },
              style: {
                lineWidth: 0,
                fill: aim.type === 1 ? "#E16E76" : "#1685F3",
                radius: [0, 15, 15, 0],
              },
              anchorPoints: [
                [0, 0.5],
                [1, 0.5],
              ],
            };
            this.graphData.nodes.push(aimNode);
            // 目标内容
            const aimContentNode = {
              id: `aimContentNode${index}${aimIndex}`,
              label: aim.aim,
              x: centerX + that.stageSize[0] + that.openSpace * 6.5,
              y: aimNodeY,
              type: "rect",
              size: [0, 40],
              labelCfg: {
                positions: "left",
                style: {
                  textAlign: "left",
                  fill: "#fff",
                  fontSize: 14,
                  opacity: 0.7,
                  fontFamily: "黑体",
                },
              },
              style: {
                lineWidth: 0,
                fill: that.bgColor,
              },
              anchorPoints: [[0, 0.5]],
            };
            this.graphData.nodes.push(aimContentNode);
            // 连线
            const aimLine = {
              id: `aimLine${index}${aimIndex}`,
              source: `stageNode${index}`,
              target: `aimNode${index}${aimIndex}`,
              type: "cubic-horizontal", // 边形状
              style: {
                lineWidth: 1,
                fill: "transparent", // 设置透明背景色
                opacity: 0.7,
              },
            };
            const aimContentLine = {
              id: `aimContentLine${index}${aimIndex}`,
              source: `aimNode${index}${aimIndex}`,
              target: `aimContentNode${index}${aimIndex}`,
              type: "line", // 边形状
              style: {
                lineWidth: 1,
                fill: "#ffffff",
                opacity: 0.7,
              },
            };
            this.graphData.edges.push(aimLine);
            this.graphData.edges.push(aimContentLine);
          });
        }
        // 3.时间事件数据
        if (stage.eventData && stage.eventData.length) {
          stage.eventData.forEach((event, eventIndex) => {
            event.x = event.isLeft
              ? -centerX + that.stageSize[0] + that.openSpace * 4
              : centerX + that.stageSize[0] + that.openSpace * 4;
            event.y =
              stage.y +
              eventIndex * that.eventSpace +
              that.aimSize[1] +
              that.openSpace * 2.5; // 先大概吧,后面再重新计算优化一下
            // 时间
            const timeNode = {
              id: `timeNode${index}${eventIndex}`,
              label: event.time,
              x: event.isLeft ? centerX - 10 : centerX + 10,
              y: event.y - 16,
              type: "rect",
              size: [0, 40],
              labelCfg: {
                positions: event.isLeft ? "right" : "left",
                style: {
                  textAlign: event.isLeft ? "right" : "left",
                  fill: "#fff",
                  fontSize: 14,
                  opacity: 0.8,
                  fontFamily: "黑体",
                },
              },
              style: {
                lineWidth: 0,
                fill: that.bgColor,
              },
            };
            this.graphData.nodes.push(timeNode);
            // 事件标题
            const eventNode = {
              id: `eventNode${index}${eventIndex}`,
              label: that.fittingString(event.dataList.title, 9),
              labelInit: event.dataList.title,
              x: event.isLeft
                ? -event.x - that.domainW + 12
                : event.x + that.domainW - 12,
              y: event.y,
              type: "rect",
              size: that.eventSize,
              labelCfg: {
                positions: event.isLeft ? "right" : "left",
                style: {
                  textAlign: "center",
                  fill: "#fff",
                  fontSize: 14,
                  fontFamily: "黑体",
                },
              },
              style: {
                lineWidth: 0,
                fill: event.dataList.type === 1 ? "#E16E76" : "#1685F3",
                radius: event.isLeft ? [24, 0, 0, 24] : [0, 24, 24, 0],
              },
              anchorPoints: [
                [0, 0.5],
                [1, 0.5],
              ],
            };
            this.graphData.nodes.push(eventNode);
            // 领域
            const realmNode = {
              id: `realmNode${index}${eventIndex}`,
              label: [...event.dataList.domain].join("\n"),
              x: event.isLeft
                ? -event.x + that.openSpace * 2 + 6
                : event.x - that.openSpace * 2 - 6,
              y: event.y,
              type: "rect",
              size: [that.domainW, that.eventSize[1]],
              labelCfg: {
                positions: "center",
                style: {
                  textAlign: "center",
                  fill: "#fff",
                  fontSize: 14,
                  fontFamily: "黑体",
                },
              },
              style: {
                lineWidth: 1,
                fill: event.dataList.type === 1 ? "#E16E76" : "#1685F3",
                stroke: event.dataList.type === 1 ? "#EDA9AE" : "#76B7F8", // 元素的描边色
              },
            };
            this.graphData.nodes.push(realmNode);
            // 内容
            const eventContentNode = {
              id: `eventContentNode${index}${eventIndex}`,
              label: event.dataList.describe
                ? that.divideString(event.dataList.describe, 11, 4)
                : "暂无描述",
              labelInit: event.dataList.describe,
              x: event.isLeft ? -event.x + 9 : event.x - 9,
              y: event.y + that.eventSize[1] + 22,
              type: "rect",
              size: that.eventContentSize,
              labelCfg: {
                positions: "center",
                style: {
                  textAlign: "center",
                  fill: "#fff",
                  fontSize: 14,
                  fontFamily: "黑体",
                },
              },
              style: {
                lineWidth: 1,
                fill: "#3C4B70",
                stroke: "#5C6988", // 元素的描边色
                opacity: 0.9,
              },
            };
            this.graphData.nodes.push(eventContentNode);
            // 连线
            const eventLine = {
              id: `eventLine${index}${eventIndex}`,
              source: `stageNode${index}`,
              target: `eventNode${index}${eventIndex}`,
              type: "polyline", // 边形状
              style: {
                lineWidth: 1,
                fill: "transparent",
                opacity: 0.7,
              },
            };
            this.graphData.edges.push(eventLine);
            // 4.时间事件后面的列表
            if (event.dataList.children && event.dataList.children.length) {
              event.dataList.children.forEach((eventData, eventDataIndex) => {
                const x =
                  event.x +
                  that.eventSize[0] +
                  that.openSpace * 3 +
                  eventDataIndex *
                    (that.eventDataSize[0] + that.openSpace * 1.4);
                const y = event.y + that.openSpace;
                // 标题
                const eventDataNode = {
                  id: `eventDataNode${index}${eventIndex}${eventDataIndex}`,
                  label: that.fittingString(eventData.title, 6),
                  labelInit: eventData.title,
                  x: event.isLeft
                    ? -x - that.domainW + 14
                    : x + that.domainW - 14,
                  y: y,
                  type: "rect",
                  size: that.eventDataSize,
                  labelCfg: {
                    positions: event.isLeft ? "right" : "left",
                    style: {
                      textAlign: "center",
                      fill: "#fff",
                      fontSize: 14,
                      fontFamily: "黑体",
                    },
                  },
                  style: {
                    lineWidth: 0,
                    fill: event.dataList.type === 1 ? "#E16E76" : "#1685F3",
                  },
                  anchorPoints: [[0.5, 0]],
                };
                this.graphData.nodes.push(eventDataNode);
                // 领域
                const realmNode02 = {
                  id: `realmNode${index}${eventIndex}${eventDataIndex}02`,
                  label: [...eventData.domain].join("\n"),
                  x: event.isLeft ? -x + 60 : x - 60,
                  y: y,
                  type: "rect",
                  size: [that.domainW, that.eventDataSize[1]],
                  labelCfg: {
                    positions: "center",
                    style: {
                      textAlign: "center",
                      fill: "#fff",
                      fontSize: 14,
                      fontFamily: "黑体",
                    },
                  },
                  style: {
                    lineWidth: 1,
                    fill: event.dataList.type === 1 ? "#E16E76" : "#1685F3",
                    stroke: event.dataList.type === 1 ? "#EDA9AE" : "#76B7F8", // 元素的描边色
                  },
                };
                this.graphData.nodes.push(realmNode02);
                // 内容
                const eventContentNode02 = {
                  id: `eventContentNode${index}${eventIndex}${eventDataIndex}02`,
                  label: eventData.describe
                    ? that.divideString(eventData.describe, 9, 3)
                    : "暂无描述",
                  labelInit: eventData.describe,
                  x: event.isLeft ? -x : x,
                  y: y + that.eventDataSize[1] + 18,
                  type: "rect",
                  size: [
                    that.eventDataSize[0] + that.domainW,
                    that.eventContentSize[1] * 0.85,
                  ],
                  labelCfg: {
                    positions: "center",
                    style: {
                      textAlign: "center",
                      fill: "#fff",
                      fontSize: 14,
                      fontFamily: "黑体",
                    },
                  },
                  style: {
                    lineWidth: 1,
                    fill: "#3C4B70",
                    stroke: "#5C6988",
                    opacity: 0.9,
                  },
                };
                this.graphData.nodes.push(eventContentNode02);
                // 连线
                const eventLine = {
                  id: `eventLine${index}${eventIndex}${eventDataIndex}`,
                  source: `eventNode${index}${eventIndex}`,
                  target: `eventDataNode${index}${eventIndex}${eventDataIndex}`,
                  type: "polyline", // 边形状
                  style: {
                    lineWidth: 1,
                    fill: "transparent", // 透明色
                    opacity: 0.7,
                  },
                };
                this.graphData.edges.push(eventLine);
              });
            }
          });
        }
      });
    },
    /**
     * 初始化graph实例
     */
    initGraph() {
      // 缩略图
      const minimap = new G6.Minimap({
        size: [window.innerWidth / 6, window.innerHeight / 4],
      });
      // 提示框
      const tooltip = new G6.Tooltip({
        offsetX: 10,
        offsetY: 10,
        size: [100, 100],
        itemTypes: ["node"], // 允许出现 tooltip 的 item 类型
        // 自定义 tooltip 内容
        getContent: (e) => {
          const outDiv = document.createElement("div");
          outDiv.style.width = "fit-content";
          outDiv.innerHTML = `<div style="max-width:200px;">
             ${e.item.getModel().labelInit || e.item.getModel().label}
             </div>`;
          return outDiv;
        },
        // 哪些要设置提示框
        shouldBegin: (e) => {
          const id = e.item.getModel().id;
          const a = id.includes("eventNode");
          const b = id.includes("eventContentNode");
          const c = id.includes("eventDataNode");
          const is = a || b || c;
          return is;
        },
      });
      // 容器节点
      const dom = this.$refs.graphRef;
      // 配置参数
      const options = {
        container: "graphContainer", // 画布的容器id
        with: dom.offsetWidth, // 画布宽度
        height: dom.offsetHeight, // 画布高度
        minZoom: 0.2,
        maxZoom: 5,
        // 图交互模式
        modes: {
          default: ["drag-canvas", "zoom-canvas"], // 允许拖拽画布、缩放画布
        },
        plugins: [tooltip, minimap], // 插件
      };
      // 实例化
      this.graph = new G6.Graph(options);
      // 自适应
      this.resizeView();
      // 监听窗口大小变化
      window.addEventListener("resize", this.resizeView);
    },
    /**
     * 画图
     */
    drawGraph() {
      // 清除画布元素
      this.graph.clear();
      // 数据源
      this.graph.data(this.graphData);
      // 渲染
      this.graph.render();
    },
    /**
     * 自适应
     */
    resizeView() {
      const dom = this.$refs.graphRef;
      if (dom && this.graph) {
        this.graph.changeSize(dom.offsetWidth, dom.offsetHeight); // 修改画布大小
        // this.graph.fitCenter(); // 移至中心
      }
    },
    /**
     * 字符串等长划分-入口事件
     * @param str 字符串
     * @param len 一行的长度
     * @param row 行数
     */
    divideString(str, len, row = 3) {
      str = this.fittingString(str, len * row - 2);
      const result = this.divideHandle(str, len);
      return result.join("\n");
    },
    /**
     * 字符串等长划分
     * @param str 字符串
     * @param len 划分的长度
     */
    divideHandle(str, len) {
      if (str.length <= len) {
        return [str];
      }
      const chunk = str.substring(0, len);
      const arr = [chunk, ...this.divideHandle(str.substring(len), len)];
      return arr;
    },
    /**
     * 截取字符串,超出多少len省略
     * @param str 字符串
     * @param len 长度
     */
    fittingString(str, len) {
      if (str.length <= len) {
        return str;
      }
      const result = str.substring(0, len) + "…";
      return result;
    },
  },
  beforeDestroy() {
    this.graph && this.graph.destroy();
  },
  watch: {},
};
</script>

<style lang='scss' scoped>
.moreG6-wapper {
  height: 100%;
  background: #0b1e4c;
  .graph-content {
    width: 100%;
    height: 96%;
    ::v-deep .g6-tooltip {
      border: 1px solid #e2e2e2;
      border-radius: 4px;
      font-size: 12px;
      color: #545454;
      background-color: rgba(255, 255, 255, 0.9);
      padding: 10px 8px;
      box-shadow: rgb(174, 174, 174) 0px 0px 10px;
    }
    ::v-deep .g6-minimap {
      position: absolute;
      right: 0;
      top: 61px;
      background-color: #0b1e4c;
    }
  }
}
</style>

三、记录说明

  • 当前使用版本:"@antv/g6": "^4.8.21"

  • 官方文档节点形状为shape,但是在不记得哪个版本后, shape 改为 type,当时整了好久,形状就是不生效,原来是字段改变了,这个坑要注意

  • 初步接触就有这么个界面需求,官方文档有点乱,且不全面,新手小白上路属实有点头皮发麻,后来也琢磨出来一些:

    • 官方案例实现不了的,自己画
    • 无非就是两个要点:节点、边
    • 像这案例一样的不能使用居中api的,得自己计算节点的位置
    • 实现不了的不影响使用的小功能,就干掉它,不要了…
  • 期间遇到还没解决的问题:

    • 使用image内置节点,自己的图片显示有问题
    • polyline样式的连线拐点问题,本来定在边角的锚点,但是拐点太多了不齐整,后来就直接锚点在中间了…
    • 本来有个节点收缩/展开的功能,后来没做了,这个后面再研究研究…

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

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

相关文章

计算机毕业设计污染物文献共享数据库管理系统网站开发与实现

计算机毕业设计&#xff1a;污染物文献共享数据库管理系统网站开发与实现 1. 项目背景 随着环境问题日益严峻&#xff0c;对污染物的研究变得尤为重要。然而&#xff0c;在学术界和工业界之间存在着信息孤岛现象&#xff0c;即大量的研究成果被分散在不同的数据…

[Redis][String][上]详细讲解

目录 0.前言1.常见命令1.SET2.GET3.MSET && MGET4.SETNX && SETXX 2.计数命令1.INCR2.INCRBY3.DECR4.DECYBY5.INCRBYFLOAT6.注意 0.前言 字符串类型是Redis最基础的数据类型&#xff0c;关于字符串需要特别注意&#xff1a; Redis中所有的键的类型都是字符串类…

【Elasticsearch系列十四】Elasticsearch

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

大数据概念与价值

文章目录 引言大数据的概念高德纳咨询公司的定义麦肯锡全球研究所的定义什么是大数据&#xff1f; 大数据的特征Volume&#xff08;体积&#xff09;Variety&#xff08;种类&#xff09;Velocity&#xff08;速度&#xff09;Value&#xff08;价值&#xff09;Veracity&#…

Apache Hudi现代数据湖核心技术概论

1. 什么是 Apache Hudi 1.1 简介 Apache Hudi (Hadoop Upserts Deletes and Incrementals) 是一个开源的数据湖框架&#xff0c;旨在提供高效的数据管理和数据更新功能。它允许在大数据平台上执行诸如数据插入、更新和删除操作&#xff0c;同时支持增量式数据处理。Hudi 最初…

React18入门教程

React介绍 React由Meta公司开发&#xff0c;是一个用于 构建Web和原生交互界面的库 React的优势 相较于传统基于DOM开发的优势 组件化的开发方式 不错的性能 相较于其它前端框架的优势 丰富的生态 跨平台支持 React的市场情况 全球最流行&#xff0c;大厂必备 开发环境…

EmguCV学习笔记 C# 12.2 WeChatQRCode

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Vue.js的前端框架有哪些?

Vue.js 是一款流行的前端 JavaScript 框架&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;。除了 Vue.js 本身&#xff0c;还有许多基于 Vue.js 的前端框架和 UI 库&#xff0c;它们提供了更多的功能和组件&#xff0c;以便开发者能够快速构建应用程序。以下是一些…

【图像压缩与重构】基于BP神经网络

课题名称&#xff1a;基于BP神经网络的图像压缩与重构&#xff08;带GUI) 相关资料&#xff1a; 1. 代码注释 2.BP神经网络原理文档资料 3.图像压缩原理文档资料 程序实例截图&#xff1a;

eclipse git 不小心点了igore,文件如何加到git中去。

1、创建了文件&#xff0c;或者利用三方工具&#xff0c;或者用mybatis plus生成了文件以后&#xff0c;我们需要右键文件&#xff0c;然后加入到git中。 右键有问号的java文件 -- Team -- Add to Index &#xff0c;然后变成个号就可以了。 2、不小心&#xff0c;点了一下Ign…

Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐

在日常文字编辑中&#xff0c;我们经常需要重复使用复制的内容。然而&#xff0c;新内容一旦复制&#xff0c;旧内容就会被覆盖。因此&#xff0c;选择一款易用高效的剪贴板工具成为了许多人的需求。本文整理了一些适用于 macOS 系统的优秀剪贴板增强工具&#xff0c;欢迎大家下…

华为OD机试 - 构成指定长度字符串的个数(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

想高效开发,也许可以试试文件系统。。。

众所周知&#xff0c;4G-Cat.1模组的文件系统与数据传输速度、存储效率&#xff0c;以及数据安全性等有非常重要的关系&#xff0c;在应用开发中也非常重要。 今天我们来尝试Air201的实用示例——文件系统的使用 Air201文件系统的使用 合宙Air201资产定位模组——是一个集成超…

密集行人数据集 CrowdHumanvoc和yolo两种格式,yolo可以直接使用train val test已经划分好有yolov8训练200轮模型

密集行人数据集 CrowdHuman voc和yolo两种格式&#xff0c;yolo可以直接使用 train val test已经划分好 有yolov8训练200轮模型。 CrowdHuman 密集行人检测数据集 数据集描述 CrowdHuman数据集是一个专为密集行人检测设计的数据集&#xff0c;旨在解决行人密集场景下的检测挑…

【自动驾驶】控制算法(九)深度解析车辆纵向控制 | 从算法基础到 Carsim 仿真实践

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

【C语言】常见的C语言概念

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 什么是C语言2.C语言的历史3. 编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022的优缺点 4.VS项目和源文件、头文件介绍5. 第一个C语言程序6. main函数7. printf和库函数8. 关键字介绍9. 字符和ASCII编…

【machine learning-十-梯度下降-学习率】

学习率 学习率不同的学习率 在梯度下降算法中&#xff0c;学习率的选择很重要&#xff0c;不恰当的选择&#xff0c;甚至可能导致损失发散&#xff0c;而非收敛&#xff0c;下面就看一下学习率的影响。 学习率 学习率是下图中的红框圈出来的部分&#xff0c; 学习率是模型的超…

Python 复制Excel 中的行、列、单元格

在Excel中&#xff0c;复制行、列和单元格是日常工作中经常需要进行的操作&#xff0c;它可以帮助你快速调整数据布局、复制数据模板或进行数据的批量处理。 本文将详细介绍如何使用Python将Excel中的行、列、或单元格范围复制到指定位置。 所需Python库 要使用Python操作Exc…

今天不写项目,聊聊后端面试吧

首先感谢大家之前的观看呀~兄弟们~ 这边把我去过几家公司面试的题目都写一下哈&#xff0c;像我大二下&#xff0c;就是前两个月7-9进了公司进行后端实习&#xff0c;哎.....反正就是学学学..话不多说~ 1.Frist 1.HashMap实现原理 HashMap是基于哈希表的Map接口的非同步实现…

Zabbix 部署----安装 Zabbix(监控服务器)

目录 zabbix 官网: 1、准备一台虚拟机 1.整理配置yum源(192.xx.xx.10) 2.设置主机名(192.xx.xx.10) 3.防火墙 4.selinux 2、准备Zabbix-repo 使用阿里提供的zabbixYUM源 3、安装Zabbix服务器 4、初始化数据库 1.安装数据库 2.启动数据库 3.授权zabbix账号 4.初始化…