我有一个点云,所有点都位于3D空间的平面上。我需要将每个点转换为2D坐标,反之亦然。
坐标系(x,y,z) A =>转换矩阵( T1 )=>坐标系 B
中的(x,y) 坐标系(x,y) B =>转换矩阵( T2 )=>坐标系 A
中的(x,y,z)我需要 T1 和 T2 。 坐标系 B 可以是任意参考系。
答案 0 :(得分:6)
据我了解,所有点都位于同一平面上,您希望减小尺寸并稍后恢复坐标。
获得三个非共线点A,B,C。制作向量AB和AC 正常到那个平面是
N = AB x AC //cross product
现在将矢量AB和N标准化为单位U = uAB
和uN
。构建第二个基本向量(它是单位并位于平面中)
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 sheet点A=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
}
}