/// <summary> /// Draws the numberical labels on the axis. /// </summary> /// <param name="_corners"></param> private void DrawAxisLabels(VertexFormat[] _corners) { pSBatch.Begin(); List<int> hidelist = new List<int>(); //Finds the center point of the 3d dimensional shape. float dist = (float)Math.Sqrt(Math.Pow((pBounds[1].X - pBounds[0].X), 2) + Math.Pow((pBounds[1].Y - pBounds[0].Y), 2)); //Uses fancy math to find optimal camera placement. float pos = ((float)Math.Sin(Math.PI / 4) * dist) / (2.0f * (float)Math.Tan(Math.PI / 8)); Vector3 vector3_pos = new Vector3(pos, pos, pos); float[] distance = new float[_corners.Length]; Vector3[] WorldCorners = new Vector3[_corners.Length]; for (int i = 0; i < distance.Length; i++) { WorldCorners[i] = Vector3.Transform(_corners[i].Position, GetWorldMatrix()); distance[i] = Vector3.Distance(WorldCorners[i], vector3_pos); } float mindist = distance.Min(); float maxdist = distance.Max(); for (int i = 0; i < _corners.Length; i++) { if ((distance[i] == mindist) || (distance[i] == maxdist)) { hidelist.Add(i); } } for (int i = 0; i < _corners.Length; i++) { if (!hidelist.Contains(i)) { Vector2 trans = Get3Dto2DTranslation(_corners[i].Position); pSBatch.DrawString(pFont, "(" + Math.Round(_corners[i].Position.X, 1) + "," + Math.Round(_corners[i].Position.Y, 1) + "," + Math.Round(_corners[i].Position.Z, 1) + ")", trans, Color.Black); } } pSBatch.End(); }
private pPlaneInfo CreateBoundsPlane(Vector3 unit, float depth) { Vector3 op_vec = Vector3.One - unit; List<VertexFormat> Vertex = new List<VertexFormat>(); List<Vector3> unitvectors = new List<Vector3>(); unitvectors.AddRange(new Vector3[3] { Vector3.UnitX, Vector3.UnitY, Vector3.UnitZ }); unitvectors.Remove(unit); foreach (Vector3 vec in pBounds) { Vertex.Add(new VertexFormat(Vector3.Multiply(vec, op_vec), Color.Black)); } Vertex.Add(new VertexFormat(Vector3.Add(Vector3.Multiply(Vertex[0].Position, unitvectors[0]), Vector3.Multiply(Vertex[1].Position, unitvectors[1])), Color.Black)); Vertex.Add(new VertexFormat(Vector3.Add(Vector3.Multiply(Vertex[0].Position, unitvectors[1]), Vector3.Multiply(Vertex[1].Position, unitvectors[0])), Color.Black)); List<int> Index = new List<int>(); for (int i = 0; i < Vertex.Count; i++) { VertexFormat VF = Vertex[i]; for (int x = 0; x < Vertex.Count; x++) { Vector3 TestVector = Vector3.Normalize(Vector3.Subtract(Vertex[x].Position, VF.Position)); if (unitvectors.Contains(Vector3.Multiply(TestVector, TestVector))) { Index.AddRange(new int[] { i, x }); } } Vertex[i] = new VertexFormat(Vector3.Add(VF.Position, Vector3.Multiply(unit, depth)), VF.Color); } pPlaneInfo PInfo = new pPlaneInfo(); PInfo.Vertex = Vertex.ToArray(); PInfo.Index = Index.ToArray(); return PInfo; }
/// <summary> /// Get the corner points on the axis grid. /// </summary> /// <returns></returns> private VertexFormat[] GetCornerPoints() { VertexFormat[] axisform = new VertexFormat[8]; Vector3[] unitvec = new Vector3[3] { Vector3.UnitX, Vector3.UnitY, Vector3.UnitZ }; axisform[0] = new VertexFormat(pBounds[0], Color.Black); axisform[1] = new VertexFormat(pBounds[1], Color.Black); int count = 2; //Get the box vertex for (int i = 0; i < unitvec.Length; i++) { Vector3 unit = unitvec[i]; Vector3 mulvec = Vector3.Subtract(Vector3.One, unit); axisform[count] = new VertexFormat(Vector3.Add(Vector3.Multiply(pBounds[0], mulvec), Vector3.Multiply(pBounds[1], unit)), Color.Black); axisform[count + 1] = new VertexFormat(Vector3.Add(Vector3.Multiply(pBounds[0], unit), Vector3.Multiply(pBounds[1], mulvec)), Color.Black); count += 2; } return axisform; }
/// <summary> /// Load point data into vertices and apply gradient. /// </summary> /// <param name="_args">The _args.</param> private void pSetUpVertices() { VertexFormat[] pVertexInfo; Console.WriteLine("Loading Data"); pVertexInfo = new VertexFormat[pDataPoints.Count]; for (int i = 0; i < pDataPoints.Count; i++) { pVertexInfo[i].Position = new Vector3(pDataPoints[i][0], pDataPoints[i][1], pDataPoints[i][2]); float colourz = 60 + MathHelper.Clamp(120 * ((pVertexInfo[i].Position.Z - pBounds[0].Z) / (pBounds[1].Z - pBounds[0].Z)), 0, 140); if (float.IsNaN(pVertexInfo[i].Position.Z) || float.IsInfinity(pVertexInfo[i].Position.Z)) { Color colour = new Color(0, 0, 0, 0); pVertexInfo[i].Color = colour; } else { Color colour = HSLtoRGB(0f, 73f / 256f, colourz / 256); pVertexInfo[i].Color = colour; } } pVertexBuffer = new VertexBuffer(pDevice, VertexFormat.VertexDeclaration, pVertexInfo.Length, BufferUsage.WriteOnly); pVertexBuffer.SetData(pVertexInfo); pDataPoints = null; }