static void Main(string[] args) { bool bRet = SetConsoleCtrlHandler(newDelegate, true); UdpClient x = new UdpClient(0); x.Connect("localhost", 3333); //将雷达的数据通过udp的方式传给应用,默认端口为3333 int oneRadarMaxnumber = 3000; //设置单个雷达单次采样的最大点数 List <Radar> radars = radarSet(oneRadarMaxnumber); Cursor2DManagement management = new Cursor2DManagement(); //管理通过雷达生成的触摸点 int mergeDistance = 50, maxX = 3560, maxY = 2000; //maxX和maxY分别为屏幕坐标的最大距离(最终传输数据限制在0到1之间) //mergeDistance为两个点融合为一个点的最小距离 //(因为物体有体积,一个物体往往在雷达里会生成多个靠近的点) grid pointGrid = new grid(mergeDistance, Math.Max(maxX, maxY), oneRadarMaxnumber * radars.Count); Cursor2D.set(maxX, maxY); //设置融合操作 int frame = 0; way.dtime = 1000.0f / 60.0f; //雷达数据的更新频率,为60帧每秒 for (int i = 0; i < radars.Count; i++) { radars[i].start(); //雷达开启扫描 } while (true) //雷达获取数据和数据的操作 { way.operation(ref radars, pointGrid, management, ref x, ref frame, oneRadarMaxnumber); } for (int i = 0; i < radars.Count; i++) { radars[i].close(); } }
public byte[] setCur2DMessage(Cursor2D x) //根据cursor2D的值设置message为set类型的消息 { return(setCur2DMessage(x.ID(), x.xPos(true), x.yPos(true), x.xSpeed(true), x.ySpeed(true), x.Accel(true))); }
public void update(ref List <XYPoint> currentPoint) //利用currentPoint里的数据更新Cursor2Dset里的鼠标 { float dTime = getTime(); int i, j; bool[] if_have_point = new bool[currentPoint.Count]; bool[] if_have_cursor = new bool[cursor2Dset.Count]; float x, y; for (i = 0; i < currentPoint.Count; i++) { if_have_point[i] = false; } for (i = 0; i < if_have_cursor.Length; i++) { if_have_cursor[i] = false; } for (i = 0; i < cursor2Dset.Count; i++) { x = cursor2Dset[i].xPos() + cursor2Dset[i].xSpeed() * dTime + cursor2Dset[i].xAccel() * dTime * dTime; y = cursor2Dset[i].yPos() + cursor2Dset[i].ySpeed() * dTime + cursor2Dset[i].yAccel() * dTime * dTime; for (j = 0; j < currentPoint.Count; j++) { if ((Math.Abs(x - currentPoint[j].x) < distance) && (Math.Abs(y - currentPoint[j].y) < distance) && (!if_have_point[j])) { if_have_cursor[i] = true; cursor2Dset[i].update(currentPoint[j]); if_have_point[j] = true; break; } } }//每个cursor2D对象根据当前位置、流逝时间、速度和加速度计算预估位置,公式为pos + speed * dtime + accel * dtime * dtime //然后在以这个位置为中心,半径为distance的圆内查找是否存在currentPoint内的点 //以第一个匹配到的点作为cursor2D最新的位置。如果没有匹配的点,则删除这个cursor2D对象。 newCursor.Clear(); for (i = 0; i < cursor2Dset.Count; i++) { if (!if_have_cursor[i]) { IDprovide.freeID(cursor2Dset[i].ID()); } else { newCursor.Add(cursor2Dset[i]); } } //最后没有与任何cursor2D匹配的currentPoint里的点作为新生成的cursor2D的位置 cursor2Dset.Clear(); for (i = 0; i < newCursor.Count; i++) { cursor2Dset.Add(newCursor[i]); } newCursor.Clear(); Cursor2D m; for (i = 0; i < currentPoint.Count; i++) { if (!if_have_point[i]) { m = new Cursor2D(currentPoint[i].x, currentPoint[i].y, 0.0f, 0.0f, 0.0f, 0.0f); m.setID(IDprovide.getID()); cursor2Dset.Add(m); newCursor.Add(m); } } }