javascript - 由于固定的枢轴和移动点,如何倾斜值?
问题描述
假设我有一个点列表,它有自己的价值:
point index 0 = 0
point index 1 = 50
point index 2 = 50
point index 3 = 60
point index 4 = 80
从图形上看,是这样的(考虑以像素为单位的值):
现在,假设我需要根据第一个点的“提升”来倾斜每个点,保持最后一个点固定。即将索引 0 处的点“向上”移动到0
并保持最后一个点为80
:
point index 0 = 0
point index 4 = 80
在精神上,我看到中间的点相应地倾斜/伸展。例如取线并向0拉伸/旋转。我需要中间点的新值列表,保持每个点的X值。
您将如何在数学上应用这种转换?应该是哪个公式?线性插值?抓不住算法...
可能使用内置方法作为旋转和翻译SVG
(和其他系统)这将很容易实现,但我想知道数学,所以我可以在没有内置方法的情况下应用它。
即SVG
和/或Javascript
这里应该只是应用数学的工具。
解决方案
scale 和 skew 是不同的算法。以防万一:如果您的点index 0
从 50 移动到 0,点index 1
也应该从 50 移动到 0,还是移动到 9?
首先,让我们重写你的观点。毕竟,他们每个人都有两个坐标:
index 0: (0, 50) // I suppose 0 for the y value was a typo on your part
index 1: (90, 50)
index 2: (140, 50)
index 3: (210, 60)
index 4: (500, 80)
scale
变换函数从固定点的垂直部分延伸:
( x, y ) => ( x, y * factor + shift )
factor = (fixedY - movingYNew) / (fixedY - movingYOld)
shift = fixedY * (1 - factor)
有了fixedY = 80, movingYOld = 50, movingYNew = 0
它给你factor = 8/3, shift = -400/3
和以下转换点:
index 0: (0, 50) => (0, 0)
index 1: (90, 50) => (0, 0)
index 2: (140, 50) => (0, 0)
index 3: (210, 60) => (0, 26.777)
index 4: (500, 80) => (0, 80)
变换函数在垂直方向上skew
拉伸,但取决于到固定点的水平距离
( x, y ) => ( x, x * skewFactor + y + shift )
factor = (movingYOld - movingYNew) / (fixedX - movingX)
shift = movingYNew - movingYOld
有了fixedY = 80, movingYOld = 50, movingYNew = 0
它,您可以得到 factor = 1/10,shift = -50` 和以下转换点:
index 0: (0, 50) => (0, 0)
index 1: (90, 50) => (0, 9)
index 2: (140, 50) => (0, 14)
index 3: (210, 60) => (0, 31)
index 4: (500, 80) => (0, 80)
推荐阅读
- php - PHP问题将图像上传到远程服务器
- python - Python随机鼠标移动和点击事件
- json - Amazon Web Services 新实例
- azure - Terraform 的 azurerm_lb_rule 不在 Azure 门户中分配前端和后端端口
- ajax - ASP.NET MVC 中的 Ajax 重定向到部分视图
- python - django 休息动作得到了意想不到的位置参数
- flutter - 如何使用颤振绘制自定义形状的小部件
- c - 用来自 csv 文件的输入填充结构数组
- c++ - 如何使代码重复未定义的次数
- javascript - Typescript 在可以产生结果的对象上定义类型