如何旋转正方形以最小化每个点与四个任意点之间的距离?

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 正”系统中重新推导数学,但这可能有点矫枉过正。)