private void OnGoClick(object sender, EventArgs e) { logBox.Items.Clear(); goButton.Enabled = false; clearButton.Enabled = false; var triangulator = new Delaunay(points); triangulator.PointSelected += (o, pe) => { selectedPoint = pe.SelectedPoint; BeginInvoke(new Action(() => { curX = (int)pe.SelectedPoint.X; logBox.Items.Insert(0, String.Format( "Point {0} selected ({1:#},{2:#})", pe.SelectedPoint.Index, pe.SelectedPoint.X, pe.SelectedPoint.Y )); canvas.Invalidate(); })); Thread.Sleep(100); }; EventHandler <TrianglesModifiedArgs> triEvent = (o, te) => { tris = te.NewTriangles.ToList(); BeginInvoke(new Action(() => { logBox.Items.Insert(0, String.Format( "Triangles {0}: New count: {1}", te.EventType, te.NewTriangles.Count() )); canvas.Invalidate(); })); Thread.Sleep(100); }; triangulator.CreatedTriangles += triEvent; triangulator.RemovedTriangles += triEvent; EventHandler <EdgeArgs> edgeEvent = (o, ee) => { selectedEdge = ee.Edge; BeginInvoke(new Action(() => { logBox.Items.Insert(0, String.Format( "Edge {0} between {1} and {2}", ee.EventType, ee.Edge.First.Index, ee.Edge.Second.Index )); canvas.Invalidate(); })); Thread.Sleep(50); }; triangulator.EdgeAdded += edgeEvent; triangulator.EdgeRemoved += edgeEvent; ThreadPool.QueueUserWorkItem(o => { tris = triangulator.CalculateTriangles().ToList(); BeginInvoke(new Action(() => { selectedEdge = null; selectedPoint = null; goButton.Enabled = true; clearButton.Enabled = true; canvas.Invalidate(); })); }); }
protected override void OnUpdateFrame(FrameEventArgs e) { base.OnUpdateFrame(e); bool zInput = false, xInput = false; float accel = 150.0f; float maxVel = 700.0f; float decel = 2000.0f; if (Keyboard[Key.Up]) { cameraVel.Z += accel; zInput = true; } if (Keyboard[Key.Down]) { cameraVel.Z -= accel; zInput = true; } if (Keyboard[Key.Left]) { cameraVel.X -= accel; xInput = true; } if (Keyboard[Key.Right]) { cameraVel.X += accel; xInput = true; } if (Math.Abs(cameraVel.Z) > maxVel) { cameraVel.Z = Math.Sign(cameraVel.Z) * maxVel; } if (Math.Abs(cameraVel.X) > maxVel) { cameraVel.X = Math.Sign(cameraVel.X) * maxVel; } float decelMag = (float)(decel * e.Time); if (!zInput) { cameraVel.Z -= Math.Sign(cameraVel.Z) * decelMag; if (Math.Abs(cameraVel.Z) < decelMag) { cameraVel.Z = 0.0f; } } if (!xInput) { cameraVel.X -= Math.Sign(cameraVel.X) * decelMag; if (Math.Abs(cameraVel.X) < decelMag) { cameraVel.X = 0.0f; } } if (xInput || zInput) { mainCam.MoveForward((float)(cameraVel.Z * e.Time)); mainCam.Strafe((float)(cameraVel.X * e.Time)); } if (file != null && file.IsLoaded && firstLoad) { gui.UpdateObjectText("label", "Loaded LAS File" + Environment.NewLine + "Triangulating..."); verts = new Vertex[file.StoredPoints]; List <Point> points = new List <Point>(verts.Length); for (int i = 0; i < verts.Length; i++) { LPoint point = file[(long)i]; points.Add(new Point( (uint)i, point.X, point.Y)); verts[i] = new Vertex() { X = point.X, Y = point.Z, Z = point.Y }; } Thread thread = new Thread(() => { var tri = new Delaunay(points); tri.PointSelected += (o, p) => gui.UpdateObjectText("label", "Loaded LAS File" + Environment.NewLine + "Triangulating point " + p.PointNum.ToString()); Stopwatch sw = new Stopwatch(); sw.Start(); tris = (List <Triangle>)tri.CalculateTriangles(); sw.Stop(); elapsed = sw.ElapsedMilliseconds; }); thread.IsBackground = true; thread.Start(); firstLoad = false; } if (tris != null) { uint[] indices = Triangulate.TriangleListToIndexArray(tris); GenerateNormals(verts, indices, true); VertexBuffer buffer = new VertexBuffer(verts, indices); this.points = new Geometry(BeginMode.Triangles, buffer); gui.UpdateObjectText("label", "Loaded LAS File" + Environment.NewLine + "Filename: " + file.Filename + Environment.NewLine + "Signature: " + file.Signature + Environment.NewLine + "Total Points: " + file.NumPoints.ToString() + Environment.NewLine + "Triangles: " + (buffer.NumIndices / 3).ToString() + Environment.NewLine + "Triangulation Time: " + elapsed.ToString() + "ms"); tris = null; verts = null; } }