public int[,] HomographyProjection(int[,] alignPoints, int[,] recordedPoints, int[,] padPoints) { Accord.IntPoint[] correlationPoints1 = new Accord.IntPoint[alignPoints.GetLength(0)]; Accord.IntPoint[] correlationPoints2 = new Accord.IntPoint[recordedPoints.GetLength(0)]; for (int i = 0; i < alignPoints.GetLength(0); i++) { correlationPoints1[i] = new Accord.IntPoint(alignPoints[i, 0], alignPoints[i, 1]); correlationPoints2[i] = new Accord.IntPoint(recordedPoints[i, 0], recordedPoints[i, 1]); } RansacHomographyEstimator ransac = new RansacHomographyEstimator(0.001, 0.99); var homography = ransac.Estimate(correlationPoints1, correlationPoints2); PointF[] testPoints = new PointF[padPoints.GetLength(0)]; for (int i = 0; i < padPoints.GetLength(0); i++) { testPoints[i] = new PointF(padPoints[i, 0], padPoints[i, 1]); } var transformed = homography.TransformPoints(testPoints); int[,] results = new int[padPoints.GetLength(0), 3]; float[] equ = equation_plane(recordedPoints[0, 0], recordedPoints[0, 1], recordedPoints[0, 2], recordedPoints[1, 0], recordedPoints[1, 1], recordedPoints[1, 2], recordedPoints[2, 0], recordedPoints[2, 1], recordedPoints[2, 2] ); for (int i = 0; i < padPoints.GetLength(0); i++) { results[i, 0] = (int)transformed[i].X; results[i, 1] = (int)transformed[i].Y; results[i, 2] = (int)(results[i, 0] * equ[0] + results[i, 1] * equ[1] + equ[2]); } return(results); }
public int[,] AlignmentProjection(int[,] dxfPoints, int[,] plattenPoints, int[,] padPoints) { Accord.DoublePoint[] points = new Accord.DoublePoint[dxfPoints.GetLength(0)]; Accord.DoublePoint[] targetPoints = new Accord.DoublePoint[plattenPoints.GetLength(0)]; for (int i = 0; i < dxfPoints.GetLength(0); i++) { points[i] = new Accord.IntPoint(dxfPoints[i, 0], dxfPoints[i, 1]); targetPoints[i] = new Accord.IntPoint(plattenPoints[i, 0], plattenPoints[i, 1]); } if (points.Length == 2) { var line = points[1] - points[0]; var targetLine = targetPoints[1] - targetPoints[0]; var reScale = targetLine.EuclideanNorm() / line.EuclideanNorm(); var angleChange = Math.Atan2(targetLine.Y, targetLine.X) - Math.Atan2(line.Y, line.X); int[,] results = new int[padPoints.GetLength(0), 3]; var slopeDir = targetLine / targetLine.EuclideanNorm(); var d = (targetPoints[1].X - targetPoints[0].X) * slopeDir.X + (targetPoints[1].Y - targetPoints[0].Y) * slopeDir.Y; var slope = (plattenPoints[1, 2] - plattenPoints[0, 2]) / d; var b = plattenPoints[0, 2]; var C = Math.Cos(angleChange); var S = Math.Sin(angleChange); for (int i = 0; i < padPoints.GetLength(0); i++) { var x = padPoints[i, 0] - points[0].X; var y = padPoints[i, 1] - points[0].Y; var xC = (x * C - y * S) * reScale + targetPoints[0].X; var yC = (x * S + y * C) * reScale + targetPoints[0].Y; d = (xC - targetPoints[0].X) * slopeDir.X + (yC - targetPoints[0].Y) * slopeDir.Y; results[i, 0] = (int)xC; results[i, 1] = (int)yC; results[i, 2] = (int)(d * slope + b); } return(results); } if (points.Length == 3) { var line1 = points[1] - points[0]; var line2 = points[2] - points[0]; var targetLine1 = targetPoints[1] - targetPoints[0]; var targetLine2 = targetPoints[2] - targetPoints[0]; var reScale1 = targetLine1.EuclideanNorm() / line1.EuclideanNorm(); var reScale2 = targetLine2.EuclideanNorm() / line2.EuclideanNorm(); var angleChange1 = Math.Atan2(targetLine1.Y, targetLine1.X) - Math.Atan2(line1.Y, line1.X); var angleChange2 = Math.Atan2(targetLine2.Y, targetLine2.X) - Math.Atan2(line2.Y, line2.X); if (angleChange1 < 0) { angleChange1 = 6.28 + angleChange1; } if (angleChange2 < 0) { angleChange2 = 6.28 + angleChange2; } if (angleChange1 > 5 && angleChange2 < 3) { angleChange2 += 6.28; } if (angleChange2 > 5 && angleChange1 < 3) { angleChange1 += 6.28; } var angleChange = ((angleChange1 + angleChange2) / 2) % 6.28; var reScale = (reScale1 + reScale2) / 2; int[,] results = new int[padPoints.GetLength(0), 3]; float[] equ = equation_plane(plattenPoints[0, 0], plattenPoints[0, 1], plattenPoints[0, 2], plattenPoints[1, 0], plattenPoints[1, 1], plattenPoints[1, 2], plattenPoints[2, 0], plattenPoints[2, 1], plattenPoints[2, 2]); var C = Math.Cos(angleChange); var S = Math.Sin(angleChange); for (int i = 0; i < padPoints.GetLength(0); i++) { var x = padPoints[i, 0] - points[0].X; var y = padPoints[i, 1] - points[0].Y; var xC = (x * C - y * S) * reScale + targetPoints[0].X; var yC = (x * S + y * C) * reScale + targetPoints[0].Y; results[i, 0] = (int)xC; results[i, 1] = (int)yC; results[i, 2] = (int)(results[i, 0] * equ[0] + results[i, 1] * equ[1] + equ[2]); } return(results); } return(HomographyProjection(dxfPoints, plattenPoints, padPoints)); }