Esempio n. 1
0
        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();
                }));
            });
        }
Esempio n. 2
0
        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;
            }
        }