手把手教写拖拽布局插件(吸附功能篇)

上午刚写完辅助线,下午趁热把吸附给写了~先放效果图吧:

原理分析

吸附发生在拖动元素的时候,拖动的时候,当前正在拖动的元素抽象出的8个点是图中的白点,和这8个点对比的点是其他元素的绿点

分别对比这些点的x或y的距离,如果小于设定的距离,比如说5px,就改变当前元素的x或y让这个距离变成0。

代码

原理很简单,代码如下:

import { getPoints } from '../utils/common'

export function countAdsorb(e,moveX,moveY) {
    const DISTANCE = 5
    if(this.constructor._instanceList.length < 2){
        return false
    }
    //首先找到需要对比的点和被对比的点
    const currentList = [] //当前元素的8个点
    const compareList = [] //其他元素的点
    for(let i = 0;i< this.constructor._instanceList.length; i++) {
        const instance = this.constructor._instanceList[i]
        if(instance.parentEl === this.parentEl && instance.id !== this.id) {
            compareList.push(...getPoints(instance))
        }else if(instance.parentEl === this.parentEl && instance.id == this.id){
            currentList.push(...getPoints(instance))
        }
    }
    if(compareList.length == 0) {
        return false
    }
    let flag = false
    let res = ''
    //计算它们x和y坐标的差值,如果绝对值小于5就吸附上去,吸附了其中一个就退出循环
    for(let i = 0;i < currentList.length; i++) {
        const x = currentList[i].x
        const y = currentList[i].y
        for(let j = 0;j < compareList.length; j++) {
            const cx = compareList[j].x
            if(Math.abs(x - cx) <= DISTANCE) {
                const dis = x - cx
                flag = true
                res += 'x'
                this.x = this.x - dis
                this.xCenter = this.x + (this.width / 2)
                this.x1 = this.x + this.width
                break;
            }
        }
        for(let j = 0;j < compareList.length; j++) {
            const cy = compareList[j].y
            if(Math.abs(y - cy) <= DISTANCE) {
                const dis = y - cy
                flag = true
                res += 'y'
                this.y = this.y - dis
                this.yCenter = this.y + (this.height / 2)
                this.y1 = this.y + this.height
                break;
            }
        }
        if(flag){
            break;
        }
    }
    //根据变动的是x还是y分量来修正this.dragOrigin的值
    if(res == 'x') { 
        if(Math.abs(moveX) > DISTANCE) {
            this.dragOrign.x = e.pageX
        }
        this.dragOrign.y = e.pageY
    }
    if(res == 'y') { 
        if(Math.abs(moveY) > DISTANCE) {
            this.dragOrign.y = e.pageY
        }
        this.dragOrign.x = e.pageX
    }
    if(res == 'xy') {
        if(Math.abs(moveX) > DISTANCE) {
            this.dragOrign.x = e.pageX
        }
        if(Math.abs(moveY) > DISTANCE) {
            this.dragOrign.y = e.pageY
        }
    }
    if(flag) {
        return true
    }else{
        return false
    }
}

export function registerAdsort(_this) {
    _this.countAdsorb = countAdsorb.bind(_this)
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FOC(Field-Oriented Control)算法需要一定的电机控制基础和编程能力。下面是一个简单的步骤来手把手FOC算法: 1. 确定电机参数:首先,你需要收集电机的参数,如电感、电阻和磁极对数等。这些参数将在FOC算法中使用。 2. 进行Park变换:Park变换可以将三向坐标系(abc)转换为直角坐标系(αβ),这样可以更方便地控制电机。根据Clark变换的反向公式,你可以将输入的三相电流转换为αβ坐标系中的两个轴电流。 3. 进行Clarke变换:Clarke变换将直角坐标系(αβ)转换回三向坐标系(abc)。在FOC算法中,你需要将控制产生的αβ轴电流转换为abc轴电流。 4. 计算磁场定向角度:根据电机的旋转角度和磁极对数,你可以计算出电机的磁场定向角度。这个角度将用于生成磁场定向的电压指令。 5. 控制电压生成:根据FOC算法,你需要生成磁场定向的电压指令,以控制电机的转速和转矩。这些电压指令通过反转Park和Clarke变换,转换为abc轴电压指令。 6. 实时计算:在实际应用中,你需要以一定的频率更新FOC算法,并实时计算磁场定向角度和电压指令。 请注意,以上只是FOC算法的一个简单概述。实际上,FOC算法还涉及到闭环控制、速度和位置估算等复杂的技术细节。因此,在实际应用中,你可能需要更深入地学习和理解FOC算法,并根据具体情况进行调整和优化。 引用资料: 前言 三向电机 Clark变换<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [永磁同步电机驱动视频程_矢量控制_手把手代码_无感FOC_有感FOC_状态观测器_卡尔曼滤波_慧驱动](https://blog.csdn.net/huiqudong/article/details/109865310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [手把手你电机FOC控制【一】](https://blog.csdn.net/oXiaoLingTong/article/details/123867530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值