//Computes the graph area based on the scale bar definition public int ComputeScaleTransformation(CoordSettings coordSettings, NuGenPointSet pointSet) { double[][] r_graph = { new double[3], new double[3], new double[3] }; double[,] r_screen = new double[3, 3]; List <NuGenPoint> points = pointSet.Points; scalePointCount = 0; validScale = false; foreach (NuGenPoint point in points) { if (scalePointCount == 2) { throw new InvalidOperationException("Can not define more scale bar points"); } if (point.GraphCoordsAreDefined()) { double xGraph, yGraph; ConvertToCartesian(NuGenMath.mmUnitize(coordSettings), point.XThetaGraph, point.YRGraph, out xGraph, out yGraph); r_graph[0][scalePointCount] = xGraph; r_graph[1][scalePointCount] = yGraph; r_graph[2][scalePointCount] = 1.0; r_screen[0, scalePointCount] = point.XScreen; r_screen[1, scalePointCount] = point.YScreen; r_screen[2, scalePointCount] = 1.0; scalePointCount++; } } if (scalePointCount == 2) { // create virtual third point along a virtual axis which is just orthogonal to the virtual // axis between the other two points. assumes all points are in same z-value (which is 1.0) plane double[] axis1 = new double[3]; double[] axis2 = new double[3]; double[] z = { 0.0, 0.0, 1.0 }; axis1[0] = r_graph[0][1] - r_graph[0][0]; axis1[1] = r_graph[1][1] - r_graph[1][0]; axis1[2] = r_graph[2][1] - r_graph[2][0]; NuGenMath.VectorCrossProduct(z, axis1, axis2); r_graph[0][2] = r_graph[0][0] + axis2[0]; r_graph[1][2] = r_graph[1][0] + axis2[1]; r_graph[2][2] = 1.0; axis1[0] = r_screen[0, 1] - r_screen[0, 0]; axis1[1] = r_screen[1, 1] - r_screen[1, 0]; axis1[2] = r_screen[2, 1] - r_screen[2, 0]; NuGenMath.VectorCrossProduct(z, axis1, axis2); r_screen[0, 2] = r_screen[0, 0] + axis2[0]; r_screen[1, 2] = r_screen[1, 0] + axis2[1]; r_screen[2, 2] = 1.0; int rtnS2G = NuGenMath.ScreenToGraph(r_graph, r_screen, screenToGraph, graphToScreen); // log to linear transformation is not allowed when using scale bar since it would // be such an extremely rare special case that its benefit would be minimal, especially // since it would only confuse the majority of users who would not be expecting it validScale = (rtnS2G == NuGenMath.SUCCESS); switch (rtnS2G) { case NuGenMath.SUCCESS: return(NuGenMath.SUCCESS); case NuGenMath.BAD_GRAPH_COORDINATES: return(NuGenMath.BAD_GRAPH_COORDINATES); case NuGenMath.BAD_SCREEN_COORDINATES: return(NuGenMath.BAD_SCREEN_COORDINATES); } } return(NuGenMath.SUCCESS); }
//Computes the graph area based on the defined axis points, returns a value corresponding // to the result of the calculation public int ComputeAxesTransformation(CoordSettings coordSettings, NuGenPointSet pointSet) { double[][] r_graph = { new double[3], new double[3], new double[3] }; double[,] r_screen = new double[3, 3]; List <NuGenPoint> points = pointSet.Points; axisPointCount = 0; validAxes = false; foreach (NuGenPoint p in points) { if (axisPointCount == 3) { throw new InvalidOperationException("We have three axis points, can not compute more"); } if (p.GraphCoordsAreDefined()) { double xGraph, yGraph; ConvertToCartesian(NuGenMath.mmUnitize(coordSettings), p.XThetaGraph, p.YRGraph, out xGraph, out yGraph); r_graph[0][axisPointCount] = xGraph; r_graph[1][axisPointCount] = yGraph; r_graph[2][axisPointCount] = 1.0; r_screen[0, axisPointCount] = p.XScreen; r_screen[1, axisPointCount] = p.YScreen; r_screen[2, axisPointCount] = 1.0; axisPointCount++; } } if (axisPointCount == 3) { AdjustMidValuedLogCoords(coordSettings, r_graph); int rtnS2G = NuGenMath.ScreenToGraph(r_graph, r_screen, screenToGraph, graphToScreen); validAxes = false; if (rtnS2G == NuGenMath.SUCCESS) { int rtnL2L = ComputeLogToFromLinear(coordSettings, r_graph); switch (rtnL2L) { case NuGenMath.SUCCESS: break; case NuGenMath.NONPOSITIVE_COORDINATE: return(NuGenMath.NONPOSITIVE_COORDINATE); case NuGenMath.NO_SPREAD: return(NuGenMath.NO_SPREAD); } } validAxes = (rtnS2G == NuGenMath.SUCCESS); switch (rtnS2G) { case NuGenMath.SUCCESS: return(NuGenMath.SUCCESS); case NuGenMath.BAD_GRAPH_COORDINATES: return(NuGenMath.BAD_GRAPH_COORDINATES); case NuGenMath.BAD_SCREEN_COORDINATES: return(NuGenMath.BAD_SCREEN_COORDINATES); } } return(NuGenMath.SUCCESS); }