Пример #1
0
        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);
        }
Пример #2
0
        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));
        }