Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import UIKit
- import simd
- import Accelerate
- extension CGPoint {
- init(simd3: SIMD3<Double>) {
- self.init(x: simd3.x, y: simd3.y)
- }
- }
- extension simd_double3 {
- init(point: CGPoint) {
- self.init(x: Double(point.x), y: Double(point.y), z: Double(1))
- }
- }
- struct CGLine {
- let start: CGPoint
- let end: CGPoint
- var norm: CGPoint {
- let dy = end.y - start.y
- let dx = end.x - start.x
- return CGPoint(x: start.x + dy, y: start.y - dx)
- }
- }
- extension CGAffineTransform {
- init(from initialLine: CGLine, to transformedLine: CGLine) {
- let initMat = simd_double3x3(
- simd_double3(point: initialLine.start),
- simd_double3(point: initialLine.end),
- simd_double3(point: initialLine.norm)
- ).transpose
- let transformedMat = simd_double3x3(
- simd_double3(point: transformedLine.start),
- simd_double3(point: transformedLine.end),
- simd_double3(point: transformedLine.norm)
- ).transpose
- let transMat = simd_mul(initMat.inverse, transformedMat).transpose
- self.init(
- a: CGFloat(transMat.columns.0.x), b: CGFloat(transMat.columns.0.y),
- c: CGFloat(transMat.columns.1.x), d: CGFloat(transMat.columns.1.y),
- tx: CGFloat(transMat.columns.2.x), ty: CGFloat(transMat.columns.2.y)
- )
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement