拖拽拉伸加上旋转角度的数学原理

最近在写公司项目的时候遇到了拖拽拉伸加旋转组件然后改变其高度宽度的需求,原本以为‘拖拽那么简单,拉伸的话就改变width和height就好了’,因为拖拽拉伸的方位有八个点,所有一个个计算总会解决的,but

神奇的现象

clipboard.png

起初在没有加上旋转角度的时候测试了八个方位的拖拽拉伸是没有问题的,而且其本身实现方法不难,例如拖拽的是最顶部的中心点则改变其组件的top数值和height数值就好了,但如果加上了旋转角度之后、、似乎变得诡异了起来

分析原因

我们知道,旋转的角度可以通过CSS3的transform属性的rotate值来改变,然后如果不改变坐标圆点则默认是组件的中心点,所以如果一旦rotate值发生改变其组件的整个坐标系也随之改变,我大概粗略的画了下图

clipboard.png

图中蓝色的方块比作组件,其坐标系是蓝色的XY坐标系,加入旋转角度为45度的话,则坐标系就变成了橙色的XY坐标系

这个时候如果再用以蓝色坐标系为参考系来计算拖拽拉伸的数值肯定是不正确的,此时我们借助于坐标系的旋转变换公式,还记得吗?

理清需求

因为我们在拉伸顶部的时候只计算了top值和height值,忽略了left值,以为拉伸顶部只改变只两个值就好了,但其实这是理想情况,譬如上图中的点V,我们在旋转到45度的时候,拉伸顶部要保证V点的位置不变,注意!只是保证V点在蓝色的原始坐标系中的位置,那么势必还是要计算left值的,我又大概粗略的画了下图

clipboard.png

为了好计算,我假设组件的高度为100,被拉伸之后的高度为200,那么拉伸到200的时候其坐标系为深灰色的X`Y`坐标系,答案显而易见,V点到深灰色坐标原点的横坐标距离 等于 V点到橙色坐标原点的横坐标距离 加上 这两个坐标原点的横坐标距离

clipboard.png

我最后大概又画了下图

clipboard.png

也就是说我们在拖拽拉伸的时候要保证这个等式成立,也就是E`F` = EF + OO`
那么,一我们知道了角度rotate、二我们也知道了两个坐标系圆点之间的距离OO`(注:sin(45度) * (200 - 100) / 2),那么就能保证V点的位置横向不变了,这里只例举了横坐标的情况,纵坐标的原理类似

最终效果

clipboard.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
贝塞尔曲线是一种应用于二维图形应用程序的数学曲线,由线段和节点组成。节点是可拖动的支点,线段像可伸缩的皮筋。贝塞尔曲线可以通过控制点的个数和位置来决定最终曲线的形状。一阶贝塞尔曲线是直线,而其他多阶贝塞尔曲线都是抛物线。贝塞尔曲线在矢量图形软件中被广泛使用,如Photoshop等。\[1\]\[3\] 贝塞尔曲线的数学原理涉及到贝塞尔曲线的参数方程和控制点的计算。具体来说,对于n阶贝塞尔曲线,其参数方程可以表示为: B(t) = Σ(i=0 to n) (nCi) * (1-t)^(n-i) * t^i * Pi 其中,B(t)是曲线上的点,t是参数,取值范围为0到1,n是曲线的阶数,nCi是组合数,Pi是控制点的坐标。通过调整控制点的位置和个数,可以得到不同形状的贝塞尔曲线。 在Matlab中,可以使用bezier函数来绘制贝塞尔曲线。该函数接受一个控制点矩阵作为输入,并返回曲线上的点坐标。例如,使用以下代码可以绘制一个三阶贝塞尔曲线: ```matlab P = \[0 0; 1 2; 3 -1; 4 0\]; % 控制点矩阵 t = linspace(0, 1, 100); % 参数t的取值范围 B = bezier(P, t); % 计算曲线上的点坐标 plot(B(:,1), B(:,2)); % 绘制曲线 ``` 这段代码中,P是一个4行2列的矩阵,每一行代表一个控制点的坐标。t是参数t的取值范围,可以根据需要进行调整。bezier函数会返回一个100行2列的矩阵B,其中每一行代表曲线上的一个点的坐标。最后使用plot函数将曲线绘制出来。 总结起来,贝塞尔曲线是一种由线段和节点组成的数学曲线,可以通过调整控制点的位置和个数来控制曲线的形状。在Matlab中,可以使用bezier函数来绘制贝塞尔曲线。 #### 引用[.reference_title] - *1* *2* [贝塞尔曲线的数学原理](https://blog.csdn.net/weixin_34270606/article/details/89082935)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现](https://blog.csdn.net/sinat_35676815/article/details/120884682)[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^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值