矩阵XY快速排序
using MyVision.Script.Method;public class MyScript : ScriptMethods
{//struct MOTIONPOSXY_S{public double Pos_x;public double Pos_y;};//脚本执行该方法public bool Process(){//@try{//脚本代码写在下方 List<double> PointX = GetDoubleList("斑点分析.X");List<double> PointY = GetDoubleList("斑点分析.Y");List<MOTIONPOSXY_S> PointList = new List<MOTIONPOSXY_S>();for (int i = 0; i < PointX.Count(); ++i){MOTIONPOSXY_S tmp;tmp.Pos_x = PointX[i];tmp.Pos_y = PointY[i];PointList.Add(tmp);}//QuickSort(ref PointList, 0, PointX.Count() - 1);for (int i = 0; i < PointX.Count(); ++i){PointX[i] = PointList[i].Pos_x;PointY[i] = PointList[i].Pos_y;//LogWarn("" + i + ":" + PointList[i].Pos_x + " " + PointList[i].Pos_y+ "", "");}//List<double> MPointX = new List<double>();List<double> MPointY = new List<double>();for (int i = 0; i < PointX.Count(); ++i){MPointX.Add(PointList[i].Pos_x);MPointY.Add(PointList[i].Pos_y);}//SetDoubleList("数组定义.PointX", MPointX);SetDoubleList("数组定义.PointY", MPointY);//return true;}catch (Exception ex){LogError(GetLogPre() + ex.ToString());return false;}}int Partition(ref List<MOTIONPOSXY_S> list, int low, int high){MOTIONPOSXY_S pbase = list[low];while (low < high){while (low < high && CompareMotion_PosXy(pbase, list[high])){--high;}if (low < high){list[low] = list[high];}while (low < high && CompareMotion_PosXy(list[low], pbase)){++low;}if (low < high){list[high] = list[low];}}list[low] = pbase;return low;}void QuickSort(ref List<MOTIONPOSXY_S> list, int low, int high){if (low < high){int pbase = Partition(ref list, low, high);QuickSort(ref list, low, pbase - 1);QuickSort(ref list, pbase + 1, high);}}//两个坐标比较大小const Test &v1, const Test &v2bool CompareMotion_PosXy(MOTIONPOSXY_S p1, MOTIONPOSXY_S p2){double difference = p1.Pos_y - p2.Pos_y;difference = (difference >= 0 ? difference : (-difference));if (p1.Pos_y < p2.Pos_y){if (difference < 100) return (p1.Pos_x < p2.Pos_x);else return true;}else if (p1.Pos_y == p2.Pos_y){return (p1.Pos_x < p2.Pos_x);}else{if (difference < 100) return (p1.Pos_x < p2.Pos_x);else return false;}}
}
九点标定从中间往外排序
using MyVision.Script.Method;public class MyScript : ScriptMethods
{//struct MOTIONPOSXY_S{public double Pos_x;public double Pos_y;public double Pos_r;};//脚本执行该方法public bool Process(){//@try{//脚本代码写在下方 List<double> PointX = GetDoubleList("斑点分析.X");List<double> PointY = GetDoubleList("斑点分析.Y");List<double> PointR = GetDoubleList("斑点分析.最大内直径");List<MOTIONPOSXY_S> PointList = new List<MOTIONPOSXY_S>();for (int i = 0; i < PointX.Count(); ++i){MOTIONPOSXY_S tmp;tmp.Pos_x = PointX[i];tmp.Pos_y = PointY[i];tmp.Pos_r = PointR[i]/2;PointList.Add(tmp);}//QuickSort(ref PointList, 0, PointX.Count() - 1);for (int i = 0; i < PointX.Count(); ++i){PointX[i] = PointList[i].Pos_x;PointY[i] = PointList[i].Pos_y;PointR[i] = PointList[i].Pos_r;LogWarn("" + i + ":" + PointList[i].Pos_x + " " + PointList[i].Pos_y + PointList[i].Pos_r + "", "");}//List<double> MPointX = new List<double>();List<double> MPointY = new List<double>();List<double> MPointR = new List<double>();//MPointX.Add(PointX[4]); MPointX.Add(PointX[5]);MPointX.Add(PointX[2]); MPointX.Add(PointX[1]); MPointX.Add(PointX[0]);MPointX.Add(PointX[3]);MPointX.Add(PointX[6]); MPointX.Add(PointX[7]); MPointX.Add(PointX[8]);//MPointY.Add(PointY[4]); MPointY.Add(PointY[5]);MPointY.Add(PointY[2]); MPointY.Add(PointY[1]); MPointY.Add(PointY[0]);MPointY.Add(PointY[3]);MPointY.Add(PointY[6]); MPointY.Add(PointY[7]); MPointY.Add(PointY[8]);//MPointR.Add(PointR[4]); MPointR.Add(PointR[5]);MPointR.Add(PointR[2]); MPointR.Add(PointR[1]); MPointR.Add(PointR[0]);MPointR.Add(PointR[3]);MPointR.Add(PointR[6]); MPointR.Add(PointR[7]); MPointR.Add(PointR[8]);//SetDoubleList("数组定义.Value0", MPointX);SetDoubleList("数组定义.Value1", MPointY);SetDoubleList("数组定义.Value2", MPointR);//return true;}catch (Exception ex){LogError(GetLogPre() + ex.ToString());return false;}}int Partition(ref List<MOTIONPOSXY_S> list, int low, int high){MOTIONPOSXY_S pbase = list[low];while (low < high){while (low < high && CompareMotion_PosXy(pbase, list[high])){--high;}if (low < high){list[low] = list[high];}while (low < high && CompareMotion_PosXy(list[low], pbase)){++low;}if (low < high){list[high] = list[low];}}list[low] = pbase;return low;}void QuickSort(ref List<MOTIONPOSXY_S> list, int low, int high){if (low < high){int pbase = Partition(ref list, low, high);QuickSort(ref list, low, pbase - 1);QuickSort(ref list, pbase + 1, high);}}//两个坐标比较大小const Test &v1, const Test &v2bool CompareMotion_PosXy(MOTIONPOSXY_S p1, MOTIONPOSXY_S p2){double difference = p1.Pos_y - p2.Pos_y;difference = (difference >= 0 ? difference : (-difference));if (p1.Pos_y < p2.Pos_y){if (difference < 100) return (p1.Pos_x < p2.Pos_x);else return true;}else if (p1.Pos_y == p2.Pos_y){return (p1.Pos_x < p2.Pos_x);}else{if (difference < 100) return (p1.Pos_x < p2.Pos_x);else return false;}}
}