public Color GetColor(double averageValue, double minData, double maxData, int dataIndex) { Dictionary <int, Color> colorDictionary; colors.TryGetValue(ColorUtility.ColouringFunction, out colorDictionary); if (colorDictionary == null) { colorDictionary = new Dictionary <int, Color>(); //Calculate Color Color value = ColorUtility.CalculateColor(averageValue, minData, maxData); colorDictionary.Add(dataIndex, value); colors.Add(ColorUtility.ColouringFunction, colorDictionary); return(value); } else { if (colorDictionary.ContainsKey(dataIndex)) { return(colors[ColorUtility.ColouringFunction][dataIndex]); } Color value = ColorUtility.CalculateColor(averageValue, minData, maxData); colorDictionary.Add(dataIndex, value); colors[ColorUtility.ColouringFunction] = colorDictionary; return(value); } }
public static void CalculateContour(this Edge self, Zone zone, double contourValue, int dataIndex, double globalMin, double globalMax, ref LineContour lineContour) { Vertex startVertex = zone.Vertices[self.Start]; Vertex endVertex = zone.Vertices[self.End]; double startData = startVertex.Data[dataIndex]; double endData = endVertex.Data[dataIndex]; if (Mathf.Ranges(contourValue, startData, endData)) { double alpha = Mathf.Lerp(contourValue, startData, endData); Point3 finalPoint = Mathf.Lerp(alpha, startVertex.Position, endVertex.Position); Color contourColor = ColorUtility.CalculateColor(contourValue, globalMin, globalMax); lineContour.AddPoint(finalPoint); lineContour.Color = contourColor; } }
public static List <IsoSurface> CalculateIsoSurface(this Mesh self, double numberOfSurfaces, int dataIndex) { double minOfData = self.GetMinimumBounds(dataIndex); double maxOfData = self.GetMaximumBounds(dataIndex); double interval = Mathf.SliceInterval(numberOfSurfaces, minOfData, maxOfData); List <IsoSurface> meshSurface = new List <IsoSurface>(); if (interval == 0) { return(meshSurface); } for (double isoValue = minOfData + interval / 2; isoValue <= maxOfData; isoValue += interval) { IsoSurface finalSurface = new IsoSurface(); foreach (Zone zone in self.Zones) { foreach (Element element in zone.Elements) { double[] dataArray = new double[8]; for (int index = 0; index < element.VertInOrder.Length; index++) { uint vertex = element.VertInOrder[index]; dataArray[index] = (zone.Vertices[vertex].Data[dataIndex]); } byte caseNumber = ISOSurface.GetElementCase(dataArray, isoValue); int[] caseEdges = ISOSurface.GetCaseEdges(caseNumber); for (int i = 0; i < caseEdges.Length - 1; i += 3) { if (caseEdges[i] != -1 && caseEdges[i + 1] != -1 && caseEdges[i + 2] != -1) { Edge firstEdge = ISOSurface.GetEdgePoints(caseEdges[i]); Point3 firstEdgeFinalPoint = firstEdge.GetIsoValuePoint(zone, element, isoValue, dataIndex); Edge secondEdge = ISOSurface.GetEdgePoints(caseEdges[i + 1]); Point3 secondEdgeFinalPoint = secondEdge.GetIsoValuePoint(zone, element, isoValue, dataIndex); Edge thirdEdge = ISOSurface.GetEdgePoints(caseEdges[i + 2]); Point3 thirdEdgeFinalPoint = thirdEdge.GetIsoValuePoint(zone, element, isoValue, dataIndex); IsoTriangle resultTriangle = new IsoTriangle(firstEdgeFinalPoint, secondEdgeFinalPoint, thirdEdgeFinalPoint) { Color = ColorUtility.CalculateColor(isoValue, minOfData, maxOfData) }; finalSurface.AddTriangle(resultTriangle); } } } } meshSurface.Add(finalSurface); } return(meshSurface); }