如何旋转正方形以最小化每个点与四个任意点之间的距离?
How can I rotate a square to minimize the distance between each point and four arbitrary points?
我一直在努力关注这篇文章:
https://andersource.dev/2020/11/06/organic-grid.html
特别是附录。但是我对微积分及其符号的理解是有限的。
所以我也尝试理解并 adapt/rewrite 源代码:
https://raw.githubusercontent.com/andersource/andersource.github.io/master/assets/organic-grid/index.js
但它使用了一些我不熟悉的库,我想从第一原则开始工作。
这是一个包含我的代码的简单示例(所有相关代码都在 rotateSquareToFitQuad
函数中)
https://editor.p5js.org/marcusround/sketches/5jckZCCw-
[编辑:此示例已使用下面的 andersource 提供的修复程序进行了更新] 但是生成的正方形似乎具有几乎随机的旋转,所以我一定是在调整代码时犯了一些错误。
我的目标是最小化连接每对顶点的四条线的总长度。
您的数学运算是正确的。这种情况的罪魁祸首是数学和许多图形实用程序之间 y 轴“向上”方向之间臭名昭著的不匹配;这会影响文章中数学公式的“顺时针”假设。
在您的实现中,您可以这样定义象限:
const quadrants = [
[-1, -1], // TL
[1, -1], // TR
[1, 1], // BR
[-1, 1], // BL
]
这确实以顺时针方向渲染顶点,但在数学上会导致逆时针计算。
将其替换为以下定义:
const quadrants = [
[-1, -1],
[-1, 1],
[1, 1],
[1, -1],
]
得到正确的解决方案(尽管顶点的逆时针渲染和“拟合”正方形与原始顶点之间的对应关系发生了偏移)。
(另一种解决方案是在“向下为 y 正”系统中重新推导数学,但这可能有点矫枉过正。)
我一直在努力关注这篇文章: https://andersource.dev/2020/11/06/organic-grid.html
特别是附录。但是我对微积分及其符号的理解是有限的。
所以我也尝试理解并 adapt/rewrite 源代码: https://raw.githubusercontent.com/andersource/andersource.github.io/master/assets/organic-grid/index.js
但它使用了一些我不熟悉的库,我想从第一原则开始工作。
这是一个包含我的代码的简单示例(所有相关代码都在 rotateSquareToFitQuad
函数中)
https://editor.p5js.org/marcusround/sketches/5jckZCCw-
[编辑:此示例已使用下面的 andersource 提供的修复程序进行了更新] 但是生成的正方形似乎具有几乎随机的旋转,所以我一定是在调整代码时犯了一些错误。
我的目标是最小化连接每对顶点的四条线的总长度。
您的数学运算是正确的。这种情况的罪魁祸首是数学和许多图形实用程序之间 y 轴“向上”方向之间臭名昭著的不匹配;这会影响文章中数学公式的“顺时针”假设。
在您的实现中,您可以这样定义象限:
const quadrants = [
[-1, -1], // TL
[1, -1], // TR
[1, 1], // BR
[-1, 1], // BL
]
这确实以顺时针方向渲染顶点,但在数学上会导致逆时针计算。
将其替换为以下定义:
const quadrants = [
[-1, -1],
[-1, 1],
[1, 1],
[1, -1],
]
得到正确的解决方案(尽管顶点的逆时针渲染和“拟合”正方形与原始顶点之间的对应关系发生了偏移)。
(另一种解决方案是在“向下为 y 正”系统中重新推导数学,但这可能有点矫枉过正。)