我一直致力于一个个人项目,以生成方程 x^2 + y^2 + z^2 = S 的整数解的图像,其中“S”是任何整数。
换句话说,我正在寻找所有 3D 点 [x,y,z],其中 x、y 和 z 都是完全平方整数并且 x + y + z = S
例如S = 2809会有解:
- [144, 1296, 1369],
- [144, 729, 1936],
- [0, 0, 2809]
- ...加上上述的所有排列(即 144+729+1936 = 1936+729+144)
在开始我的问题之前,这里有一些上下文的小切线:
一般方程 x + y + z = S 的所有解都位于由以下定义的二维平面上:
- A = [S, 0, 0]
- B = [0, S, 0]
- C = [0, 0, S]
这是 x + y + z = 50 的所有解(不仅仅是方点)的图表,以说明该方程的所有解都位于以上面定义的 ABC 为界的同一平面上。请注意,下面三角形的尖端是:[50, 0, 0]、[0, 50, 0] 和 [0, 0, 50]
回到我的问题: 找到方形解点后,我想将 3D 解点转置为基于 ABC 平面的 2D 坐标,其中 A 为 (0,0),B 是最大 'x' 值,C 是最大 'y' 值.然后我希望将这些解决方案输出到图像文件。
我的线性代数知识匮乏,我一直无法找到基于 3 个非共线点将 3D 坐标转置为 2D 平面坐标的方法。
我的代码目前在 python 中,但算法/数学答案同样好!
非常感谢任何帮助!
最佳答案
如我所见,您已经可以找到您的 (x, y, z)
点,你的问题是关于如何将它们投影到平面上。
请引用projection matrix学习如何将 3d 世界投影到您选择的图像平面上。
具体来说,您必须表达您的 (x, y, z)
坐标为 homogeneous coordinates通过将它们称为 (x, y, z, 1)
,并将它们乘以与您需要转换它们的平面正交的相关相机矩阵。
这将产生 (x', y', f)
形式的二维齐次坐标从中您将能够通过 (x_projected, y_projected) = (x'/f, y'/f)
获得投影坐标.
OpenCV是你的 friend 。
回顾:
- 输入:
n
(x, y, z)
积分 - 获取投影(相机)矩阵
M
尺寸(4, 3)
使用 opencv 或使用任何工具自行计算。 - 添加最后一个维度
1
到所有点,将它们作为 3d 齐次坐标:n
积分(x, y, z, 1)
- 将所有点乘以矩阵以获得投影点作为二维齐次坐标:
M * (x, y, z, 1)^T
=(x', y', f)
- 获取
n
实际二维投影坐标(相对于由M
矩阵定义的相机中心)由(x, y)
=(x'/f, y'/f)
奖励:您可以堆叠所有 (x, y, z, 1)
点作为列进入 (4, n)
矩阵,P
,整个乘法过程就是R = M * P
, 结果矩阵 R
形状(3, n)
其列是生成的齐次坐标。
关于python - 将平面上的 3D 坐标转置到新的 2D 坐标系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63983534/