Exemplo n.º 1
0
        public static cylineParam GetVecticalLine(cylineParam mainLine, cyPoint2d point)
        {
            double c2 = (mainLine.A * point.y - mainLine.B * point.x);

            return(new cylineParam()
            {
                A = -mainLine.B, B = mainLine.A, C = c2
            });
        }
Exemplo n.º 2
0
        public static cylineParam OnGetLine(cyPoint2d point1, cyPoint2d point2)
        {
            cylineParam line1 = new cylineParam();

            line1.A = point1.y - point2.y;
            line1.B = -(point1.x - point2.x);
            line1.C = line1.A * point1.x + line1.B * point1.y;
            line1.OnNormalize();
            return(line1);
        }
Exemplo n.º 3
0
        public static void OnInterSectionContours2(double[] contourX, double[] contourY, cylineParam lineParam, out List <double> interSectionX, out List <double> interSectionY)
        {
            interSectionX = new List <double>();
            interSectionY = new List <double>();
            if (contourX.Length == 0)
            {
                return;
            }
            double value1 = lineParam.C - contourX[0] * lineParam.A - contourY[0] * lineParam.B;
            int    direct = 0;//零为正, 1 为负

            if (Math.Abs(value1) < 1e-8)
            {
                interSectionX.Add(contourX[0]); interSectionY.Add(contourY[0]);
            }
            for (int i = 1; i < contourX.Length; i += 2)
            {
                double value2 = lineParam.C - contourX[i] * lineParam.A - contourY[i] * lineParam.B;
                if ((value2 < 0 && value1 > 0) || (value2 > 0 && value1 < 0))
                {
                    List <double> xpos = new List <double>(); List <double> ypos = new List <double>();
                    for (int t = -15; t < 15; t += 2)
                    {
                        int index = i + t;
                        if (index < 0)
                        {
                            index += contourX.Count();
                        }
                        else if (index >= contourX.Count())
                        {
                            index -= contourX.Count();
                        }
                        xpos.Add(contourX[index]); ypos.Add(contourY[index]);
                    }
                    cylineParam line1;
                    leastSquareAdaptLineFast(xpos, ypos, out line1);
                    cyPoint2d cross = IntersectPoint(line1, lineParam);
                    interSectionX.Add(cross.x);
                    interSectionY.Add(cross.y);
                }
                else if (Math.Abs(value2) <= Double.MinValue * 10)
                {
                    interSectionX.Add(contourX[i]); interSectionY.Add(contourY[i]);
                }
                value1 = value2;
            }
        }
Exemplo n.º 4
0
        public bool IntersectPoint(cylineParam line1, out cyPoint2d crossPoint)
        {
            crossPoint = new cyPoint2d()
            {
                x = 0, y = 0
            };
            double condition = line1.A * B - A * line1.B;

            if (Math.Abs(condition) < 1e-6)
            {
                return(false);
            }

            crossPoint.x = ((B * line1.C - line1.B * C) / condition);
            crossPoint.y = ((-A * line1.C + line1.A * C) / condition);
            return(true);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 根据直线方程和contour ,计算交点;
        /// </summary>
        /// <param name="contourX"></param>
        /// <param name="contourY"></param>
        /// <param name="lineParam"></param>
        /// <param name="interSectionX"></param>
        /// <param name="interSectionY"></param>
        public static void OnInterSectionContours(List <double> contourX, List <double> contourY, cylineParam lineParam, out List <double> interSectionX, out List <double> interSectionY)
        {
            interSectionX = new List <double>();
            interSectionY = new List <double>();
            if (contourX.Count == 0)
            {
                return;
            }
            double value1 = lineParam.C - contourX[0] * lineParam.A - contourY[0] * lineParam.B;
            int    direct = 0;//零为正, 1 为负

            if (Math.Abs(value1) < 1e-8)
            {
                interSectionX.Add(contourX[0]); interSectionY.Add(contourY[0]);
            }
            for (int i = 1; i < contourX.Count; i++)
            {
                double value2 = lineParam.C - contourX[0] * lineParam.A - contourY[0] * lineParam.B;
                if ((value2 < 0 && value1 > 0) || (value2 > 0 && value1 < 0))
                {
                    cylineParam line1 = OnGetLine(new cyPoint2d()
                    {
                        x = contourX[i], y = contourY[i]
                    }, new cyPoint2d()
                    {
                        x = contourX[i - 1], y = contourY[i - 1]
                    });
                    cyPoint2d cross = IntersectPoint(line1, lineParam);
                    interSectionX.Add(cross.x);
                    interSectionY.Add(cross.y);
                }
                else if (value2 == 0)
                {
                    interSectionX.Add(contourX[i]);
                    interSectionY.Add(contourY[i]);
                }
                value1 = value2;
            }
        }
Exemplo n.º 6
0
        public static cyPoint2d IntersectPoint(cylineParam line1, cylineParam interline)
        {
            cyPoint2d crossPoint = new cyPoint2d()
            {
                x = 0, y = 0
            };
            List <double> matrix = new List <double>()
            {
                line1.A, line1.B, interline.A, interline.B
            };
            List <double> mult = new List <double>()
            {
                line1.C, interline.C
            };
            List <double> inv1, result;

            cyUCSMeasure.MatrixInv2X2(matrix, out inv1);
            cyUCSMeasure.Matrix_Mult2X1(inv1, mult, out result);

            crossPoint.x = result[0];
            crossPoint.y = result[1];
            return(crossPoint);
        }
Exemplo n.º 7
0
        public cyOXYLine GetVecticalline(cyPoint2d point)
        {
            float c2 = (float)(A * point.y - B * point.x);

            return(new cyOXYLine(B, -A, c2));
        }