private void SetCurrentPoint() { var SnapPoints = this.GetSnapPoints(); if (SnapPoints.Length > 0) { SnapPoint p = FindClosestPoint(SnapPoints); this.CurrentPoint = p; _SwapBufferRequired = true; } else { if (this.Snapping != null) { this.Snapping(new SnapEventArgs()); } else { ScreenToPlane(CurrentLocation, this.Camera.NearPlane, out CurrentPoint); } } }
private SnapPoint FindClosestPoint(SnapPoint[] snapPoints) { double minDist = double.MaxValue; int i = 0; int index = 0; foreach (SnapPoint vertex in snapPoints) { Point3D vertexScreen = WorldToScreen(vertex); Point2D currentScreen = new Point2D(CurrentLocation.X, Size.Height - CurrentLocation.Y); double dist = Point2D.Distance(vertexScreen, currentScreen); if (dist < minDist) { index = i; minDist = dist; } i++; } SnapPoint snap = (SnapPoint)snapPoints.GetValue(index); //DisplaySnappedVertex(snap); return(snap); }
private void DisplaySnappedVertex(SnapPoint snap) { renderContext.SetLineSize(2); // white color renderContext.SetColorWireframe(System.Drawing.Color.Yellow); renderContext.SetState(depthStencilStateType.DepthTestOff); Point2D onScreen = WorldToScreen(snap); switch (snap.Type) { case SnapState.SnapType.POINT: DrawCircle(new System.Drawing.Point((int)onScreen.X, (int)(onScreen.Y))); DrawCross(new System.Drawing.Point((int)onScreen.X, (int)(onScreen.Y))); break; case SnapState.SnapType.CENTER: DrawCircle(new System.Drawing.Point((int)onScreen.X, (int)(onScreen.Y))); break; case SnapState.SnapType.END: DrawQuad(new System.Drawing.Point((int)onScreen.X, (int)(onScreen.Y))); break; case SnapState.SnapType.MID: DrawTriangle(new System.Drawing.Point((int)onScreen.X, (int)(onScreen.Y))); break; case SnapState.SnapType.QUAD: renderContext.SetLineSize(3.0f); DrawRhombus(new System.Drawing.Point((int)onScreen.X, (int)(onScreen.Y))); break; } renderContext.SetLineSize(1); }