分享 一个类似 ps 辅助线功能

news2025/2/25 0:42:25

效果图片:

提示:这里的样式我做边做了修改,根据个人情况而定。

//你也可以npm下载
$ npm install --save vue-ruler-tool

在这里插入图片描述

特点

  • 没有依赖
  • 可拖动的辅助线
  • 快捷键支持

开始使用 1. even.js

/**
 * @description 绑定事件 on(element, event, handler)
 */
export const on = (function () {
    if ((document.addEventListener)) {
        return function (element: any, event: any, handler: any) {
            if (element && event && handler) {
                element.addEventListener(event, handler, false)
            }
        }
    } else {
        return function (element: any, event: string, handler: any) {
            if (element && event && handler) {
                element.attachEvent('on' + event, handler)
            }
        }
    }
})()

/**
 * @description 解绑事件 off(element, event, handler)
 */
export const off = (function () {
    if ((document.removeEventListener)) {
        return function (element: any, event: any, handler: any) {
            if (element && event) {
                element.removeEventListener(event, handler, false)
            }
        }
    } else {
        return function (element: any, event: string, handler: any) {
            if (element && event) {
                element.detachEvent('on' + event, handler)
            }
        }
    }
})()

组建rules代码:

提示:这里我运用的npm install

<template>
  <div :style="wrapperStyle" class="vue-ruler-wrapper" onselectstart="return false;" ref="el">
    <section v-show="rulerToggle">
      <div ref="horizontalRuler" class="vue-ruler-h" @mousedown.stop="horizontalDragRuler">
        <span
            v-for="(item,index) in xScale"
            :key="index"
            :style="{ left: index * 50 + 2 + 'px' }"
            class="n"
        >{{ item.id }}</span>
      </div>
      <div ref="verticalRuler" class="vue-ruler-v" @mousedown.stop="verticalDragRuler">
        <span
            v-for="(item,index) in yScale"
            :key="index"
            :style="{ top: index * 50 + 2 + 'px' }"
            class="n"
        >{{ item.id }}</span>
      </div>
      <div :style="{ top: verticalDottedTop + 'px' }" class="vue-ruler-ref-dot-h" />
      <div :style="{ left: horizontalDottedLeft + 'px' }" class="vue-ruler-ref-dot-v" />
      <div
          v-for="item in lineList"
          :title="item.title"
          :style="getLineStyle(item)"
          :key="item.id"
          :class="`vue-ruler-ref-line-${item.type}`"
          @mousedown="handleDragLine(item)"
      ></div>
    </section>
    <div ref="content" class="vue-ruler-content" :style="contentStyle">
      <slot />
    </div>
    <div v-show="isDrag" class="vue-ruler-content-mask"></div>
  </div>
</template>
<script lang="ts">
import { computed, defineComponent, onBeforeUnmount, onMounted, Ref, ref, watch } from 'vue';
import { on, off } from './event';
export default defineComponent({
  name: 'V3RulerComponent',
  props: {
    position: {
      type: String,
      default: 'relative',
      validator: (val: string) => {
        return ['absolute', 'fixed', 'relative', 'static', 'inherit'].indexOf(val) !== -1
      }
    }, // 规定元素的定位类型
    isHotKey: {
      type: Boolean, default: true
    }, // 热键开关
    isScaleRevise: {
      type: Boolean, default: false
    }, // 刻度修正(根据content进行刻度重置)
    value: {
      type: Array,
      default: () => {
        return [{ type: 'h', site: 50 }, { type: 'v', site: 180 }] //
      }
    }, // 预置参考线
    contentLayout: {
      type: Object,
      default: () => {
        return { top: 0, left: 0 }
      }
    }, // 内容部分布局
    parent: {
      type: Boolean,
      default: false
    },
    visible: {
      type: Boolean,
      default: true
    },
    stepLength: {
      type: Number,
      default: 50,
      validator: (val: number) => val % 10 === 0
    } // 步长
  },
  setup(props, context) {
    const size = 17;
    let left_top = 18;//18 内容左上填充
    let windowWidth = ref(0); // 窗口宽度
    let windowHeight = ref(0); // 窗口高度
    let xScale = ref<[{id:number}]>([{id:0}]); // 水平刻度
    let yScale= ref<[{id:number}]>([{id:0}]); // 垂直刻度
    let topSpacing = 0; // 标尺与窗口上间距
    let leftSpacing = 0; //  标尺与窗口左间距
    let isDrag = ref(false);
    let dragFlag = ''; // 拖动开始标记,可能值x(从水平标尺开始拖动);y(从垂直标尺开始拖动)
    let horizontalDottedLeft = ref(-999); // 水平虚线位置
    let verticalDottedTop = ref(-999); // 垂直虚线位置
    let rulerWidth = 0; // 垂直标尺的宽度
    let rulerHeight = 0; // 水平标尺的高度
    let dragLineId = ''; // 被移动线的ID
    //ref
    const content = ref(null);
    const el = ref(null);
    const verticalRuler = ref(null);
    const horizontalRuler = ref(null);

    const keyCode = {
      r: 82
    }; // 快捷键参数
    let rulerToggle = ref(true); // 标尺辅助线显示开关
    const wrapperStyle:any = computed(() => {
      return {
        width: windowWidth.value + 'px',
        height: windowHeight.value + 'px',
        position: props.position
      }
    });
    const contentStyle = computed(() => {
      // padding: left_top + 'px 0px 0px ' + left_top + 'px'
      return {
        left: props.contentLayout.left + 'px',
        top: props.contentLayout.top + 'px',
        padding: left_top + 'px 0px 0px 0px'
      }
    });
    const lineList = computed(() => {
      let hCount = 0;
      let vCount = 0;
      return props.value.map((item: any) => {
        const isH = item.type === 'h'
        return {
          id: `${item.type}_${isH ? hCount++ : vCount++}`,
          type: item.type,
          title: item.site.toFixed(2) + 'px',
          [isH ? 'top' : 'left']: item.site / (props.stepLength / 50) + size
        }
      })
    });
    watch(() => props.visible, (visible: any) => {
      rulerToggle.value = visible;
    }, {
      immediate: true
    });
    onMounted(() => {
      on(document, 'mousemove', dottedLineMove)
      on(document, 'mouseup', dottedLineUp)
      on(document, 'keyup', keyboard)
      init()
      on(window, 'resize', windowResize)
    });
    onBeforeUnmount(() => {
      off(document, 'mousemove', dottedLineMove)
      off(document, 'mouseup', dottedLineUp)
      off(document, 'keyup', keyboard)
      off(window, 'resize', windowResize)
    });
    //function
    const init = (() => {
      box()
      scaleCalc()
    });

    const windowResize = (() => {
      xScale.value = [{id:0}]
      yScale.value = [{id:0}]
      init()
    });
    const getLineStyle = (({ type, top, left }: any) => {
      return type === 'h' ? { top: top + 'px' } : { left: left + 'px' }
    });
    const handleDragLine = (({ type, id }: any) => {
      return type === 'h' ? dragHorizontalLine(id) : dragVerticalLine(id)
    });
    //获取窗口宽与高
    const box = (() => {
      if (props.isScaleRevise) { // 根据内容部分进行刻度修正
        const contentLeft = (content.value as any).offsetLeft
        const contentTop = (content.value as any).offsetTop
        getCalcRevise(xScale.value, contentLeft)
        getCalcRevise(yScale.value, contentTop)
      }
      if (props.parent) {
        const style = window.getComputedStyle((el.value as any).parentNode, null);
        windowWidth.value = parseInt(style.getPropertyValue('width'), 10);
        windowHeight.value = parseInt(style.getPropertyValue('height'), 10);
      } else {
        windowWidth.value = document.documentElement.clientWidth - leftSpacing
        windowHeight.value = document.documentElement.clientHeight - topSpacing
      }
      rulerWidth = (verticalRuler.value as any).clientWidth;
      rulerHeight = (horizontalRuler.value as any).clientHeight;
      setSpacing()
    });
    const setSpacing = (() => {
      topSpacing = (horizontalRuler.value as any).getBoundingClientRect().y //.offsetParent.offsetTop
      leftSpacing = (verticalRuler.value as any).getBoundingClientRect().x// .offsetParent.offsetLeft
    });
    // 计算刻度
    const scaleCalc = (() => {
      getCalc(xScale.value, windowWidth.value);
      getCalc(yScale.value, windowHeight.value);
    });

    //获取刻度
    const getCalc = ((array: [{id:number}], length: any) => {
      for (let i = 0; i < length * props.stepLength / 50; i += props.stepLength) {
        if (i % props.stepLength === 0) {
          array.push({ id: i })
        }
      }
    });
    // 获取矫正刻度方法
    const getCalcRevise = ((array: [{id:number}], length: any) => {
      for (let i = 0; i < length; i += 1) {
        if (i % props.stepLength === 0 && i + props.stepLength <= length) {
          array.push({ id: i })
        }
      }
    });
    //生成一个参考线
    const newLine = ((val: any) => {
      isDrag.value = true
      dragFlag = val
    });
    //虚线移动
    const dottedLineMove = (($event: any) => {
      setSpacing()
      switch (dragFlag) {
        case 'x':
          if (isDrag.value) {
            verticalDottedTop.value = $event.pageY - topSpacing
          }
          break
        case 'y':
          if (isDrag.value) {
            horizontalDottedLeft.value = $event.pageX - leftSpacing
          }
          break
        case 'h':
          if (isDrag.value) {
            verticalDottedTop.value = $event.pageY - topSpacing
          }
          break
        case 'v':
          if (isDrag.value) {
            horizontalDottedLeft.value = $event.pageX - leftSpacing
          }
          break
        default:
          break
      }
    });
    //虚线松开
    const dottedLineUp = (($event: any) => {
      setSpacing()
      if (isDrag.value) {
        isDrag.value = false
        const cloneList = JSON.parse(JSON.stringify(props.value))
        switch (dragFlag) {
          case 'x':
            cloneList.push({
              type: 'h',
              site: ($event.pageY - topSpacing - size) * (props.stepLength / 50)
            })
            context.emit('input', cloneList);
            break
          case 'y':
            cloneList.push({
              type: 'v',
              site: ($event.pageX - leftSpacing - size) * (props.stepLength / 50)
            })
            context.emit('input', cloneList);
            break
          case 'h':
            dragCalc(cloneList, $event.pageY, topSpacing, rulerHeight, 'h')
            context.emit('input', cloneList);
            break
          case 'v':
            dragCalc(cloneList, $event.pageX, leftSpacing, rulerWidth, 'v')
            context.emit('input', cloneList);
            break
          default:
            break
        }
        verticalDottedTop.value = horizontalDottedLeft.value = -10
      }
    });
    const dragCalc = ((list: any, page: any, spacing: any, ruler: any, type: any) => {
      if (page - spacing < ruler) {
        let Index, id
        lineList.value.forEach((item: any, index: any) => {
          if (item.id === dragLineId) {
            Index = index
            id = item.id
          }
        })
        list.splice(Index, 1, {
          type: type,
          site: -600
        })
      } else {
        let Index, id
        lineList.value.forEach((item, index) => {
          if (item.id === dragLineId) {
            Index = index
            id = item.id
          }
        })
        list.splice(Index, 1, {
          type: type,
          site: (page - spacing - size) * (props.stepLength / 50)
        })
      }
    });
    //水平标尺按下鼠标
    const horizontalDragRuler = (() => {
      newLine('x')
    });
    //垂直标尺按下鼠标
    const verticalDragRuler = (() => {
      newLine('y')
    });
    // 水平线处按下鼠标
    const dragHorizontalLine = ((id: any) => {
      isDrag.value = true
      dragFlag = 'h'
      dragLineId = id
    });
    // 垂直线处按下鼠标
    const dragVerticalLine = ((id: any) => {
      isDrag.value = true
      dragFlag = 'v'
      dragLineId = id
    });
    //键盘事件
    const keyboard = (($event: any) => {
      if (props.isHotKey) {
        switch ($event.keyCode) {
          case keyCode.r:
            rulerToggle.value = !rulerToggle.value
            context.emit('update:visible', rulerToggle.value)
            if (rulerToggle.value) {
              left_top = 18 ;//18
            } else {
              left_top = 0;
            }
            break
        }
      }
    });
    return {
      wrapperStyle, rulerToggle, horizontalDragRuler, xScale, verticalDragRuler, yScale, verticalDottedTop, horizontalDottedLeft, lineList, getLineStyle
      , handleDragLine, contentStyle, isDrag, content, el, verticalRuler, horizontalRuler
    };
  },
})
</script>
<style lang="scss">
.vue-ruler{
  &-wrapper {
    left: 0;
    top: 0;
    z-index: 999;
    overflow: hidden;
    user-select: none;
  }
  &-h,
  &-v,
  &-ref-line-v,
  &-ref-line-h,
  &-ref-dot-h,
  &-ref-dot-v {
    position: absolute;
    left: 0;
    top: 0;
    overflow: hidden;
    z-index: 999;
  }
  &-h,
  &-v,
  &-ref-line-v,
  &-ref-line-h,
  &-ref-dot-h,
  &-ref-dot-v {
    position: absolute;
    left: 0;
    top: 0;
    overflow: hidden;
    z-index: 999;
  }

  &-h {
    width: 100%;
    height: 18px;
    left: 18px;
    opacity: 0.6;
    //background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAASCAMAAAAuTX21AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRFMzMzAAAABqjYlAAAACNJREFUeNpiYCAdMDKRCka1jGoBA2JZZGshiaCXFpIBQIABAAplBkCmQpujAAAAAElFTkSuQmCC)
    //repeat-x; /*./image/ruler_h.png*/

    background-image: repeating-linear-gradient(to right, #656565 0, #656565 0.05em, transparent 0, transparent 4em), repeating-linear-gradient(to right, #656565 0, #656565 0.05em, transparent 0, transparent 2em), repeating-linear-gradient(to right, #656565 0, #656565 0.05em, transparent 0, transparent 1em);
    //background-size: 100% 10px, 100% 6px, 100% 4px;
    //background-repeat: no-repeat;
    //background-position: 0.05em 100%, 0.05em 100%, 0.05em 100%;
    background-size: 100% 18px, 100% 7px,100% 7px;
    background-repeat: no-repeat;
    background-position: 100% 0.05em , 100% 0.05em ,100% 0.05em;
    //border-bottom: 1px solid #656565;
  }

  &-v {
    width: 18px;
    height: 100%;
    top: 18px;
    opacity: 0.6;
    //background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAyCAMAAABmvHtTAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRFMzMzAAAABqjYlAAAACBJREFUeNpiYGBEBwwMTGiAakI0NX7U9aOuHyGuBwgwAH6bBkAR6jkzAAAAAElFTkSuQmCC)
    //repeat-y; /*./image/ruler_v.png*/
    background-image: repeating-linear-gradient(to bottom, #656565 0, #656565 0.05em, transparent 0, transparent 4em), repeating-linear-gradient(to bottom, #656565 0, #656565 0.05em, transparent 0, transparent 2em), repeating-linear-gradient(to bottom, #656565 0, #656565 0.05em, transparent 0, transparent 1em);
    background-size: 18px 100%, 7px 100% , 7px 100%;
    background-repeat: no-repeat;
    background-position: 0.05em 100%, 0.05em 100%, 0.05em 100%;
    //border-bottom: 1px solid #656565;
  }

  &-v .n,
  &-h .n {
    position: absolute;
    font: 10px/1 Arial, sans-serif;
    color: transparent;
    cursor: default;
  }

  &-v .n {
    width: 8px;
    left: 3px;
    word-wrap: break-word;
  }

  &-h .n {
    top: 1px;
  }

  &-ref-line-v,
  &-ref-line-h,
  &-ref-dot-h,
  &-ref-dot-v {
    z-index: 998;
  }

  &-ref-line-h {
    width: 100%;
    height: 3px;
    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAABCAMAAADU3h9xAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFSv//AAAAH8VRuAAAAA5JREFUeNpiYIACgAADAAAJAAE0lmO3AAAAAElFTkSuQmCC)
    repeat-x left center; /*./image/line_h.png*/
    cursor: n-resize; /*url(./image/cur_move_h.cur), move*/
  }

  &-ref-line-v {
    width: 3px;
    height: 100%;
    _height: 9999px;
    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAICAMAAAAPxGVzAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFSv//AAAAH8VRuAAAAA5JREFUeNpiYEAFAAEGAAAQAAGePof9AAAAAElFTkSuQmCC)
    repeat-y center top; /*./image/line_v.png*/
    cursor: w-resize; /*url(./image/cur_move_v.cur), move*/
  }

  &-ref-dot-h {
    width: 100%;
    height: 3px;
    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAMAAABFaP0WAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFf39/F3PnHQAAAAJ0Uk5T/wDltzBKAAAAEElEQVR42mJgYGRgZAQIMAAADQAExkizYQAAAABJRU5ErkJggg==)
    repeat-x left 1px; /*./image/line_dot.png*/
    cursor: n-resize; /*url(./image/cur_move_h.cur), move*/
    top: -10px;
  }

  &-ref-dot-v {
    width: 3px;
    height: 100%;
    _height: 9999px;
    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAMAAABFaP0WAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFf39/F3PnHQAAAAJ0Uk5T/wDltzBKAAAAEElEQVR42mJgYGRgZAQIMAAADQAExkizYQAAAABJRU5ErkJggg==)
    repeat-y 1px top; /*./image/line_dot.png*/
    cursor: w-resize; /*url(./image/cur_move_v.cur), move*/
    left: -10px;
  }
  &-content {
    position: absolute;
    z-index: 997;
  }
  &-content-mask{
    position: absolute;
    width: 100%;
    height: 100%;
    background: transparent;
    z-index: 998;
  }
}
</style>

使用组建:

提示:这里可以添加计划学习的时间

 <Rules :style="`width:${canvasStyle.width}px;`"
            :value="presetLine"
            :is-hot-key="true"
            :step-length="50"
            :parent="true"
            :is-scale-revise="true"
            :visible.sync="rulesVisible"
            @input="cloneList"
        >
  //内容部分
 </Rules>
  //是否显示/隐藏
  let rulesVisible = ref(false);
  //默认辅助线
  let presetLine = ref([{ type: 'h', site: 200 }, { type: 'v', site: 100 }]);
  //获取辅助线
  const cloneList = (list:any)=>{
    presetLine.value = list ;
    console.log("cloneList",list)
    console.log("presetLine",presetLine.value )
  }

总结:

还有一种 我个人感觉也挺好的,地址放在这里了,需要的可以试试:http://mark-rolich.github.io/RulersGuides.js/

npm i ruler-guides

效果图我也给你们放在下方了:
在这里插入图片描述

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

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

相关文章

django使用ztree实现树状结构效果,子节点实现动态加载(l懒加载)

一、实现的效果 由于最近项目中需要实现树状结构的效果,考虑到ztree这个组件大家用的比较多,因此打算在django项目中集成ztree来实现树状的效果。最终实现的示例效果如下: 点击父节点,如果有子节点,则从后台动态请求数据,然后显示出子节点的数据。 二、实现思路 …

Linux常用命令——dpkg-deb命令

在线Linux命令查询工具 dpkg-deb Debian Linux下的软件包管理工具 补充说明 dpkg-deb命令是Debian Linux下的软件包管理工具&#xff0c;它可以对软件包执行打包和解包操作以及提供软件包信息。 语法 dpkg-deb(选项)(参数)选项 -c&#xff1a;显示软件包中的文件列表&am…

【ASP.NET MVC】数据到客户端(7)

前文ViewBag数据在服务端动态生成页面&#xff0c;也可以传到客户端浏览器供JS使用。 一、数据从控制器到客户端 前文介绍&#xff0c;动态生成页面时&#xff0c;控制器的数据 并没有传递到 客户端&#xff0c;而是给自己来用&#xff0c;生成View 再利用http传递到客户端浏…

rn打包react-native-orientation报错

rn 打包时控制台报Task :react-native-orientation:verifyReleaseResources FAILED 解决&#xff1a;修改node_modules下react-native-orientation依赖中的build.gradle文件

拓数派入选中国信通院“铸基计划”「高质量数字化转型产品及服务全景图」...

7月27日&#xff0c;由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;主办的“2023数字生态发展大会”暨中国信通院“铸基计划”年中会议在京召开&#xff0c;本次大会深度展示了中国信通院在数字化领域的工作成果&#xff0c;并正式发布了《高质量数字化转…

FineReport SQL查询分页

参考&#xff1a;https://help.fanruan.com/finereport/doc-view-4795.html 参考示例为填报页面&#xff0c;以下为分页预览模式下SQL查询分页的制作。 参数说明&#xff1a; 模版参数&#xff1a;gPageSize每页显示数量、gPageNo当前页数 数据集结果&#xff1a;totalcnt总数…

S形速度曲线轨迹规划(SMART PLC梯形图源代码)

有关S形速度曲线轨迹规划相关内容,可以查看下面相关文章,这里不再赘述公式推导过程。 S速度曲线轨迹规划问题(普通变频位置闭环控制算法介绍+SCL代码)_RXXW_Dor的博客-CSDN博客位置控制用PD控制器,详细内容介绍请查看下面博客文章:PD控制器算法详细解读_RXXW_Dor的博客-CS…

宠物医疗进化:互联网宠物医院开发改变兽医服务方式

随着互联网的飞速发展&#xff0c;各行各业都在积极探索数字化转型的可能性。而宠物医疗行业也不例外。互联网宠物医院的开发将为宠物主人和兽医带来许多好处。下面我们将介绍一些互联网宠物医院开发的好处。   提供便利的服务&#xff1a;互联网宠物医院的开发将使宠物主人能…

C# Blazor 学习笔记(5):blazor文件夹组件引入

文章目录 前言文件夹组件引入文件夹分类文件引入解决方法 前言 为了更好的组件化管理整个文件&#xff0c;我选择使用分文件夹对项目组件进行分类。 文件夹组件引入 文件夹分类 Shared&#xff1a;Layout布局空间放置地方&#xff0c;由于默认创建&#xff0c;动也不好动&a…

一元三次方程求解

一元三次方程求解 题目描述提示输入输出格式输入格式输出格式 输入输出样例输入样例输出样例 算法分析A C 代码 题目描述 有形如&#xff1a; a x 3 b x 2 c x d 0 ax^3bx^2c^xd0 ax3bx2cxd0一元三次方程。给出该方程中各项的系数 ( a a a&#xff0c; b b b&#xff0c;…

如何使用大模型处理生活繁琐的工作

如果每封电子邮件、每个带有订单、发票、投诉、录用请求或工作申请的 PDF 都可以翻译成机器可读的数据&#xff0c;会怎样&#xff1f;然后可以由 ERP / CRM / LMS / TMS 自动处理吗&#xff1f;无需编程特殊接口。 听起来很神奇&#xff1f;它确实有一些魔力。但最近已成为可…

山西电力市场日前价格预测【2023-08-04】

日前价格预测 预测明日&#xff08;2023-08-04&#xff09;山西电力市场全天平均日前电价为388.01元/MWh。其中&#xff0c;最高日前电价为447.89元/MWh&#xff0c;预计出现在19: 30。最低日前电价为348.29元/MWh&#xff0c;预计出现在13: 30。 价差方向预测 1&#xff1a; 实…

掌握Java JDK 1.8 API帮助文档中文版,事半功倍编程

文章目录 1. JDK 1.8 API帮助文档简介2. 如何查阅JDK 1.8 API帮助文档中文版2.1 在线文档2.2 本地文档2.3 集成开发环境&#xff08;IDE&#xff09; 3. 如何使用JDK 1.8 API帮助文档中文版3.1 寻找类和方法3.2 阅读文档说明3.3 查看示例代码 4. 总结 引言&#xff1a; Java是一…

UML—用例图的那些事

目录 背景: 1.用例图的发展史 过程: 1.用例图中的元素和关系 2.应用中的例子 总结&#xff1a; 背景: 1.用例图的发展史 用例图是一种常用的软件工程工具&#xff0c;用于描述系统的功能需求和用户与系统的交互。它在软件开发过程中起到了重要的作用&#xff0c;并且经历了…

工业级芯片 | 拓尔微TMI8920/8940D集成化优势,替代分立器件

电磁阀驱动器作为一种重要的控制装置&#xff0c;在工业设备、汽车、智能家居等行业得到了广泛应用&#xff0c;尤其对于工业设备来说需要长时间连续工作的情况下&#xff0c;芯片的稳定性和可靠性是重中之重。 目前市面上的阀门驱动大部分还在使用传统P-MOSFET驱动电路。相对…

初阶C语言-数组

“少年没有偏旁&#xff0c;自己便是华章&#xff01;” 今天我们继续一起来学习一下数组的相关知识点。 数组 1.一维数组的创建和初始化1.1 数组的创建1.2 数组的初始化1.3 一维数组的使用1.4 一维数组在内存中的存储 2. 二维数组的创建和初始化2.1二维数组的创建2.2二维数组…

安达发|APS系统帮助家具行业建立精益生产计划

随着家具企业的业务量不断扩大&#xff0c;仅依靠传统的ERP系统和人工生产调度已经不能满足精益生产改进的要求。建立高效的精益生产计划模型及其对应的组织结构&#xff0c;提高整个供应链计划的效率&#xff0c;优化计划结果&#xff0c;从而提高供应链的运作效率&#xff0c…

VSCode C/C++ 分目录编译配置

分目录编译配置记录 launch.json文件 注释处为修改内容 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configur…

ChatGPT已打破图灵测试,新的测试方法在路上

生信麻瓜的 ChatGPT 4.0 初体验 偷个懒&#xff0c;用ChatGPT 帮我写段生物信息代码 代码看不懂&#xff1f;ChatGPT 帮你解释&#xff0c;详细到爆&#xff01; 如果 ChatGPT 给出的的代码不太完善&#xff0c;如何请他一步步改好&#xff1f; 全球最佳的人工智能系统可以通过…

MATLAB算法实战应用案例精讲-【自动驾驶】路径规划

目录 前言 几个高频面试题目 无人车运动规划&#xff0c;路径规划&#xff0c;轨迹规划的区别和联系&#xff1f; 算法原理 路径规划算法原理 1.建立轨迹规划坐标系 2、建立初始规划轨迹 3. 轨迹曲线插值 车辆路径规划跟随原理 运动规划 什么是Motion Planning Moti…