Exemplo n.º 1
0
        //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);
        }
Exemplo n.º 2
0
        //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);
        }