python - 将平面上的 3D 坐标转置到新的 2D 坐标系

标签 python image-processing graphics geometry 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 的所有解都位于由以下定义的二维平面上:

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

回到我的问题: 找到方形解点后,我想将 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 。

回顾:

  1. 输入:n (x, y, z)积分
  2. 获取投影(相机)矩阵M尺寸(4, 3)使用 opencv 或使用任何工具自行计算。
  3. 添加最后一个维度 1到所有点,将它们作为 3d 齐次坐标:n积分(x, y, z, 1)
  4. 将所有点乘以矩阵以获得投影点作为二维齐次坐标:M * (x, y, z, 1)^T = (x', y', f)
  5. 获取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/

相关文章:

c++ - 丢失和再次找到时的对象跟踪

python - 使用 PIL 修剪扫描图像?

c++ - OpenCV:findContours 函数错误

python - 手动绘制图表并导入 NetworkX

c# - 捕获 TableLayoutPanel 特定区域的图像

python - 向 Django 管理主页添加自定义操作?

python - 在 Windows 上使用 Python 从网络摄像头捕获图像

python - 与 python 上的交互式 shell 脚本交互

python - 使用 h5py 编写大型 hdf5 数据集

algorithm - 组织结构图算法