将3d平面上的点转换为2d坐标

时间:2018-04-11 07:52:21

标签: 3d geometry point-clouds

我有一个点云,所有点都位于3D空间的平面上。我需要将每个点转换为2D坐标,反之亦然。

坐标系

(x,y,z) A =>转换矩阵( T1 )=>坐标系 B

中的(x,y) 坐标系

(x,y) B =>转换矩阵( T2 )=>坐标系 A

中的(x,y,z)

我需要 T1 T2 。 坐标系 B 可以是任意参考系。

2 个答案:

答案 0 :(得分:6)

据我了解,所有点都位于同一平面上,您希望减小尺寸并稍后恢复坐标。

获得三个非共线点A,B,C。制作向量AB和AC 正常到那个平面是

 N = AB x AC //cross product

现在将矢量AB和N标准化为单位U = uABuN。构建第二个基本向量(它是单位并位于平面中)

 V = U x uN

现在您有四个基点A, u=A+U, v=A+V, n=A+uN

转换应相应地将这些点映射到四元组(0,0,0), (1,0,0), (0,1,0), (0,0,1)

现在关于仿射变换矩阵来进行这种映射:

      [Ax ux vx nx]   [0 1 0 0]
 M *  [Ay uy vy ny] = [0 0 1 0]
      [Az uz vz nz]   [0 0 0 1]
      [1  1  1  1 ]   [1 1 1 1]

  M * S = D
  M * S * Sinv = D * Sinv
  M = D * Sinv

因此,计算S=[Ax ux...]的逆矩阵,得到所需的矩阵M.

将M应用于平面中的任何点都会给出具有零z分量的新坐标。

将M的逆应用于(x,y,0)会在给定平面中产生3D坐标。

Maple sheetA=1,1,1 B=2,1,1 C=1,1,2 (in plane Y=1)

新坐标AA,BB,CC具有零z分量。

对于同一平面中的任意点,映射后的z分量也为零。

 P:=vector([-2,1,7,1]);
 > PP := multiply(M, P);
 PP := [-3, 6, 0, 1]

答案 1 :(得分:0)

为了帮助阐明在Visual Studio风格和DxMath中从3d移到2d并从2d移回到3d的过程,以将平面上的3d坐标转换为2d坐标。例如,帮助在3d世界中使用2d三角剖分算法。

@IBDesignable
class RoundedButton: UIButton {

    @IBInspectable var cornerRadius: CGFloat = 10.0 {
        didSet {
            self.layer.cornerRadius = cornerRadius
        }
    }

    @IBInspectable var borderWidth: CGFloat = 0.0 {
        didSet {
            self.layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var borderColor: UIColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0) {
        didSet {
            self.layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable
    var shadowRadius: CGFloat {
        get {
            return layer.shadowRadius
        }
        set {
            layer.shadowRadius = newValue
        }
    }

    @IBInspectable
    var shadowOpacity: Float {
        get {
            return layer.shadowOpacity
        }
        set {
            layer.shadowOpacity = newValue
        }
    }

    @IBInspectable
    var shadowOffset: CGSize {
        get {
            return layer.shadowOffset
        }
        set {
            layer.shadowOffset = newValue
        }
    }

    @IBInspectable
    var shadowColor: CGColor? {
        get {
            if let color = layer.shadowColor {
                return color
            }
            return nil
        }
        set {
            if let color = newValue {
                layer.shadowColor = color
            } else {
                layer.shadowColor = nil
            }
        }
    }

    override func awakeFromNib() {
        self.setupView()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
    }

    func setupView() {
        self.layer.cornerRadius = cornerRadius
        self.layer.borderWidth = borderWidth
        self.layer.borderColor = borderColor.cgColor
        self.layer.shadowColor = shadowColor ?? UIColor.gray.cgColor
        self.layer.shadowOffset = shadowOffset
        self.layer.shadowRadius = shadowRadius
        self.layer.shadowOpacity = shadowOpacity
    }


}