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 }); }
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); }
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; } }
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); }
/// <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; } }
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); }
public cyOXYLine GetVecticalline(cyPoint2d point) { float c2 = (float)(A * point.y - B * point.x); return(new cyOXYLine(B, -A, c2)); }