DataCalculate.cs 13.2 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TSA_V.Common;
using TSA_V.DeviceLibrary; 

namespace TSA_V
{
    partial class FrmBoardInfo
    {
        #region 查找最近的两个点进行计算
       
        private SMTPointInfo CalPointNodePosition(SMTPointInfo smtPoint, List<SMTPointInfo> checkOKList)
        {
            double oldX = smtPoint.NodePositionX;
            double oldY = smtPoint.NodePositionY;
            SMTPointInfo APoint = GetPoint(smtPoint, checkOKList);
           
            SMTPointInfo BPoint = GetPoint(APoint, checkOKList);
             
            //计算坐标    
            if (Math.Abs(smtPoint.PositionX - APoint.PositionX )< 0.01)
            {
                smtPoint.NodePositionX = APoint.NodePositionX;
            }
            else
            {
                smtPoint.NodePositionX = APoint.NodePositionX +   (BPoint.NodePositionX - APoint.NodePositionX) * (smtPoint.PositionX - APoint.PositionX) / (BPoint.PositionX - APoint.PositionX);
                if (double.IsNaN(smtPoint.NodePositionX) || double.IsInfinity(smtPoint.NodePositionX))
                {
                    smtPoint.NodePositionX = APoint.NodePositionX;
                }
            }
            if (Math.Abs(smtPoint.PositionY - APoint.PositionY )< 0.01)
            {
                smtPoint.NodePositionY = APoint.NodePositionY;
            }
            else
            {
                smtPoint.NodePositionY = APoint.NodePositionY +   (BPoint.NodePositionY - APoint.NodePositionY) * (smtPoint.PositionY - APoint.PositionY) / (BPoint.PositionY - APoint.PositionY);
                if (double.IsNaN(smtPoint.NodePositionY) || double.IsInfinity(smtPoint.NodePositionY))
                {
                    smtPoint.NodePositionY = APoint.NodePositionY;
                }
            }
            if (smtPoint.NodePositionX <= 0)
            {
                smtPoint.NodePositionX = 1;
            }else if (smtPoint.NodePositionX > FrmProjectorScreen.instance.BoundsWidth)
            {
                smtPoint.NodePositionX = FrmProjectorScreen.instance.BoundsWidth;
            }
            if (smtPoint.NodePositionY <= 0)
            {
                smtPoint.NodePositionY = 1;
            }
            else if (smtPoint.NodePositionY > FrmProjectorScreen.instance.BoundsHeight)
            {
                smtPoint.NodePositionY = FrmProjectorScreen.instance.BoundsHeight;
            }
          
            if (smtPoint.PointSizeX < 1 || smtPoint.PointSizeX > 255)
            {
                smtPoint.PointSizeX = Setting_NInit.Device_DefaultPointSize; 
            }
            if (smtPoint.PointSizeY < 1 || smtPoint.PointSizeY > 255)
            {
                smtPoint.PointSizeY = Setting_NInit.Device_DefaultPointSize; 
            }
            //smtPoint.PointSize = 4;
            //smtPoint.NodePositionX = BPoint.NodePositionX - (BPoint.NodePositionX - APoint.NodePositionX) * (BPoint.PositionX - smtPoint.PositionX) / (BPoint.PositionX - APoint.PositionX);
            //smtPoint.NodePositionY = BPoint.NodePositionY - (BPoint.NodePositionY - APoint.NodePositionY) * (BPoint.PositionY - smtPoint.PositionY) / (BPoint.PositionY - APoint.PositionY);
            LogUtil.info(" 【" + smtPoint.PN + "】图片坐标【" + smtPoint.PositionX + "," + smtPoint.PositionY + "】旧坐标【" + oldX + "," + oldY + "】A【" + APoint.PN + "】,B【" + BPoint.PN + "】,新坐标【" + smtPoint.NodePositionX + "," + smtPoint.NodePositionY + "】");
            return smtPoint;
        }

        private SMTPointInfo GetPoint(SMTPointInfo smtPoint, List<SMTPointInfo> checkOKList)
        { 
            SMTPointInfo p = null; 
            double maxPingFang = 0;
            foreach (SMTPointInfo sm in checkOKList)
            {
                if (sm.pointNum.Equals(smtPoint.pointNum))
                {
                    continue;
                }
                double xjuli = sm.PositionX - smtPoint.PositionX;
                double yjuli = sm.PositionY - smtPoint.PositionY;
                double cping = xjuli * xjuli + yjuli * yjuli;
                if (cping > maxPingFang) 
                {
                    p = sm; 
                    maxPingFang = cping;
                    continue;
                }
            }
            if (p != null)
            {
                return p;
            }
            return null;
        }

       
        #endregion

      

        private void NCalibrationProcess()
        {

            try
            {
                int index = dgvList.FirstDisplayedScrollingRowIndex;
                if (updateBoardInfo != null)
                {
                    List<SMTPointInfo> pointList = allPointInfo();
                    List<SMTPointInfo> checkOKList = (from m in pointList where m.CheckOK select m).ToList<SMTPointInfo>();
                    if (checkOKList.Count < 2)
                    {
                        btnCheck.Enabled = true;
                        MessageBox.Show(ResourceCulture.GetString("请先设置至少2个校准点"));
                        return;
                    }
 
                    this.Cursor = Cursors.WaitCursor;
                    for (int i = 0; i < pointList.Count; i++)
                    {
                        if (pointList[i].CheckOK)
                        {
                            continue;
                        }
                         
                        pointList[i] = CalPointNodePosition(pointList[i], checkOKList);

                    }

                    updateBoardInfo.smtList = pointList;
                    int color = btnColorChange.BackColor.ToArgb();
                    updateBoardInfo.PointColor = color;
                    for (int i = 0; i < pointList.Count; i++)
                    {
                        dgvList.Rows[i].Cells[this.Column_NodeX.Name].Value = pointList[i].NodePositionX;
                        dgvList.Rows[i].Cells[this.Column_NodeY.Name].Value = pointList[i].NodePositionY;
                        dgvList.Rows[i].Cells[this.Column_PointSizeX.Name].Value = pointList[i].PointSizeX;
                        dgvList.Rows[i].Cells[this.Column_PointSizeY.Name].Value = pointList[i].PointSizeY;

                    }
                    SetListCurrCell(index);
                    FrmProjectorScreen.instance.ClearPoint();
                    FrmProjectorScreen.instance.ShowPoint(false, updateBoardInfo.PointColor, pointList.ToArray( ));
                    this.Cursor = Cursors.Default;
                    //重新加载
                    MessageBox.Show(ResourceCulture.GetString(ResourceCulture.TrainOK, "坐标校准完成!"));
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("校准坐标出错:" + ex.ToString());
            }
        }

        //private static  List<CalibrationPoint> GetSortPoint(double PositionX, double PositionY, List<CalibrationPoint> checkOKList, int type)
        //{

        //    List<CalInfo> fangList = new List<CalInfo>();
        //    int i = 0;
        //    foreach (CalibrationPoint sm in checkOKList)
        //    {
        //        if (type.Equals(1))
        //        {
        //            double xjuli = sm.NodeX - PositionX;
        //            double yjuli = sm.NodeY - PositionY;
        //            double cping = xjuli * xjuli + yjuli * yjuli;
        //            fangList.Add(new CalInfo(i, cping));
        //        }
        //        else if (type.Equals(2))
        //        {
        //            double xjuli = sm.X - PositionX;
        //            double yjuli = sm.Y - PositionY;
        //            double cping = xjuli * xjuli + yjuli * yjuli;
        //            fangList.Add(new CalInfo(i, cping));
        //        }
        //        i++;
        //    }

        //    List<CalInfo> info = new List<CalInfo>(from m in fangList orderby m.Value ascending select m).ToList<CalInfo>();
        //    List<CalibrationPoint> newList = new List<CalibrationPoint>();
        //    foreach (CalInfo c in info)
        //    {
        //        newList.Add(checkOKList[c.ID]);
        //    }
        //    return newList;
        //}

        //private bool CalCalPosition(SMTPointInfo smtPoint, List<CalibrationPoint> OkPoints, out double[] position)
        //{
        //    position = new double[2];
        //    try
        //    {
        //        List<CalibrationPoint> newList = GetSortPoint(smtPoint.NodePositionX, smtPoint.NodePositionY, OkPoints, 1);
        //        double Xxishu = 1;
        //        double Yxishu = 1;
        //        CalibrationPoint APoint, BPoint;
        //        APoint = newList[0];
        //        BPoint = (from m in newList where m.Y != APoint.Y select m).ToList<CalibrationPoint>()[0];
        //        //计算坐标    
        //        if (Math.Abs(smtPoint.NodePositionX - APoint.NodeX) < 1)
        //        {
        //            position[1] = APoint.Y;
        //        }
        //        else
        //        {
        //            position[1] = (float)(APoint.Y + Xxishu * (BPoint.Y - APoint.Y) * (smtPoint.NodePositionX - APoint.NodeX) / (BPoint.NodeX - APoint.NodeX));
        //            if (double.IsNaN(position[1]) || double.IsInfinity(position[1]))
        //            {
        //                position[1] = APoint.Y;
        //            }
        //        }
        //        BPoint = (from m in newList where m.X != APoint.X select m).ToList<CalibrationPoint>()[0];
        //        if (Math.Abs(smtPoint.NodePositionY - APoint.NodeY) < 1)
        //        {
        //            position[0] = APoint.X;
        //        }
        //        else
        //        {
        //            position[0] = APoint.X + Yxishu * (BPoint.X - APoint.X) * (smtPoint.NodePositionY - APoint.NodeY) / (BPoint.NodeY - APoint.NodeY);
        //            if (double.IsNaN(position[0]) || double.IsInfinity(position[0]))
        //            {
        //                position[0] = APoint.X;
        //            }
        //        }

        //        LogUtil.info("【" + smtPoint.pointName + "】A【" + APoint.X + "," + APoint.Y + "】B【" + BPoint.X + "," + BPoint.Y + "】,校准版坐标【" + position[0] + "," + position[1] + "】");
        //        return true;
        //    }
        //    catch (Exception ex)
        //    {
        //        LogUtil.error("【" + smtPoint.pointName + "】获取校准版对应坐标出错:" + ex.ToString());
        //    }
        //    return false;
        //}

        //public static  bool PCalCalPosition(double PositionX, double PositionY, List<CalibrationPoint> OkPoints, out double[] position, out string msg)
        //{
          
        //    //获取红外坐标
        //    position = new double[2];
        //    try
        //    {
        //        CalibrationPoint APoint, BPoint;
        //        List<CalibrationPoint> newList = GetSortPoint(PositionX, PositionY, OkPoints, 2);
        //        double Xxishu = 1;
        //        double Yxishu = 1;
        //        APoint = newList[0];
        //        BPoint = (from m in newList where m.X != APoint.X select m).ToList<CalibrationPoint>()[0];
        //        //计算坐标    
        //        if (Math.Abs(PositionX - APoint.X) < 0.01)
        //        {
        //            position[1] = APoint.NodeY;
        //        }
        //        else
        //        {
        //            position[1] = APoint.NodeY + Xxishu * (BPoint.NodeY - APoint.NodeY) * (PositionX - APoint.X) / (BPoint.X - APoint.X);
        //            if (double.IsNaN(position[1]) || double.IsInfinity(position[1]))
        //            {
        //                position[1] = APoint.NodeY;
        //            }
        //        }
        //        msg = (" A【" + APoint.X + "," + APoint.Y + "】B【" + BPoint.X + "," + BPoint.Y + "】 ");
        //        BPoint = (from m in newList where m.Y != APoint.Y select m).ToList<CalibrationPoint>()[0];
        //        if (Math.Abs(PositionY - APoint.Y) < 0.01)
        //        {
        //            position[0] = APoint.NodeX;
        //        }
        //        else
        //        {
        //            position[0] = APoint.NodeX + Yxishu * (BPoint.NodeX - APoint.NodeX) * (PositionY - APoint.Y) / (BPoint.Y - APoint.Y);
        //            if (double.IsNaN(position[0]) || double.IsInfinity(position[0]))
        //            {
        //                position[0] = APoint.NodeX;
        //            }
        //        }

        //        msg += ("C【" + BPoint.X + "," + BPoint.Y + "】 ");
        //        return true;
        //    }
        //    catch (Exception ex)
        //    {
        //        msg = "PCalCalPosition【" + PositionX + "," + PositionY + "】获取校准版对应坐标出错:" + ex.ToString();
        //        LogUtil.error("PCalCalPosition【" + PositionX + "," + PositionY + "】获取校准版对应坐标出错:" + ex.ToString());
        //    }
        //    return false; 
        //}
    }
    public class CalInfo
    {
        public CalInfo(int id,double value)
        {
            this.ID = id;
            this.Value = value;
        }
        public int ID { get; set; }

        public double Value { get; set; }
    }
}