将平面上的 3D 坐标转置为新的 2D 坐标系

Mat*_*att 3 python graphics geometry image-processing linear-algebra

我一直在从事一个个人项目,以生成方程 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 的所有解都位于由以下定义的 2D 平面上:

  • 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]

ABC 飞机

回到我的问题:找到平方解点后,我想将 3D 解点转置为基于 ABC 平面的 2D 坐标,其中 A 为 (0,0),B 是最大“x”值,C 是最大“y”值。然后我希望将这些解决方案输出到图像文件。

我的线性代数知识很少,而且我一直无法找到一种基于3个非共线点将3D坐标转置为2D平面坐标的方法。

我的代码目前是用 python 编写的,但算法/数学答案也同样好!

任何帮助深表感谢!

Gul*_*zar 6

在我看来,你已经可以找到你的(x, y, z)观点,而你的问题是关于如何将它们投影到平面上。

请参阅投影矩阵以了解如何将 3D 世界投影到您选择的图像平面上。

具体来说,您必须将(x, y, z)坐标表示为齐次坐标,将它们称为(x, y, z, 1),并将它们乘以与您需要在其上投射它们的平面正交的相关相机矩阵。

这将产生形式的二维齐次坐标(x', y', f),您可以从中获得投影坐标(x_projected, y_projected) = (x'/f, y'/f)

OpenCV是你的朋友。

回顾:

  1. 输入:n (x, y, z)
  2. M使用 opencv 获取大小的投影(相机)矩阵(4, 3)或使用任何工具自行计算。
  3. 将最后一个维度添加1到所有点以获得 3d 齐次坐标:n(x, y, z, 1)
  4. 将所有点乘以矩阵以获得二维齐次坐标的投影点:M * (x, y, z, 1)^T=(x', y', f)
  5. 通过=获取n实际的 2d 投影坐标(相对于M矩阵定义的相机中心)(x, y)(x'/f, y'/f)

额外奖励:您可以将所有(x, y, z, 1)点作为列堆叠到(4, n)矩阵中P,整个乘法过程将是,形状的R = M * P结果矩阵,其列是生成的齐次坐标。R(3, n)