Пример #1
0
        public void CalculatePoints(ViewportFoV viewport)
        {
            this.currentViewport = viewport;
            DetermineStepSizes();

            RAPoints.Clear();
            DecPoints.Clear();

            var raMin = nfmod(viewport.CalcRAMin - viewport.CalcRAMin % currentRAStep - currentRAStep, 360);
            var raMax = nfmod(viewport.CalcRAMax - viewport.CalcRAMax % currentRAStep + currentRAStep, 360);

            if (viewport.HFoVDeg == 360)
            {
                raMin = 0;
                raMax = 360 - currentRAStep;
            }

            if (raMin > raMax)
            {
                for (double ra = 0; ra <= raMax; ra += currentRAStep)
                {
                    CalculateRAPoints(ra);
                }
                for (double ra = raMin; ra < 360; ra += currentRAStep)
                {
                    CalculateRAPoints(ra);
                }
            }
            else
            {
                for (double ra = raMin; ra <= raMax; ra += currentRAStep)
                {
                    CalculateRAPoints(ra);
                }
            }

            var currentMinDec = Math.Max(-MAXDEC, Math.Min(viewport.CalcTopDec, viewport.CalcBottomDec));
            var currentMaxDec = Math.Min(MAXDEC, Math.Max(viewport.CalcTopDec, viewport.CalcBottomDec));

            if (currentMaxDec > 0)
            {
                var start = Math.Max(0, Math.Max(0, currentMinDec) % currentDecStep - currentDecStep);
                for (double dec = start; dec <= currentMaxDec; dec += currentDecStep)
                {
                    CalculateDecPoints(dec);
                }
            }

            if (currentMinDec < 0)
            {
                var start = Math.Min(0, Math.Min(0, currentMinDec) % currentDecStep + currentDecStep);
                for (double dec = start; dec >= currentMinDec; dec -= currentDecStep)
                {
                    CalculateDecPoints(dec);
                }
            }
        }
Пример #2
0
        public void CalculatePoints(ViewportFoV viewport)
        {
            // calculate the lines based on fov height and current dec to avoid projection issues
            // atan gnomoric projection cannot project properly over 90deg, it will result in the same results as prior
            // and dec lines will overlap each other

            var(raStep, decStep, raStart, raStop, decStart, decStop) = CalculateStepsAndStartStopValues(viewport);

            var pointsByDecDict = new Dictionary <double, FrameLine>();

            // if raStep is 30 and decStep is 1 just
            bool raIsClosed = RoundToHigherValue(viewport.AbsCalcTopDec, decStep) >= MAXDEC;

            for (double ra = Math.Min(raStart, raStop);
                 ra <= Math.Max(raStop, raStart);
                 ra += raStep)
            {
                List <PointF> raPointCollection = new List <PointF>();

                for (double dec = Math.Min(decStart, decStop);
                     dec <= Math.Max(decStart, decStop);
                     dec += decStep)
                {
                    var point  = new Coordinates(ra, dec, Epoch.J2000, Coordinates.RAType.Degrees).XYProjection(viewport);
                    var pointf = new PointF((float)point.X, (float)point.Y);
                    if (!pointsByDecDict.ContainsKey(dec))
                    {
                        pointsByDecDict.Add(dec, new FrameLine()
                        {
                            Closed = raIsClosed, Collection = new List <PointF> {
                                pointf
                            }, StrokeThickness = dec == 0 ? 3 : 1
                        });
                    }
                    else
                    {
                        pointsByDecDict[dec].Collection.Add(pointf);
                    }

                    raPointCollection.Add(pointf);
                }

                // those are the vertical lines
                RAPoints.Add(new FrameLine {
                    StrokeThickness = (ra == 0 || ra == 180) ? 3 : 1,
                    Closed          = false,
                    Collection      = raPointCollection
                });
            }

            // those are actually the circles
            foreach (KeyValuePair <double, FrameLine> item in pointsByDecDict)
            {
                DecPoints.Add(item.Value);
            }
        }
Пример #3
0
        /// <summary>
        /// Calculates the circles (or curved lines when not completely in view)
        /// </summary>
        /// <param name="viewport"></param>
        /// <param name="dec"></param>
        private void CalculateDecPoints(double dec)
        {
            var thickness   = dec == 0 ? 3 : 1;
            var coordinates = decCoordinateMatrix[dec];

            var center   = currentViewport.CenterCoordinates;
            var startRA  = coordinates.Aggregate((x, y) => Math.Abs(x.RADegrees - center.RADegrees) < Math.Abs(y.RADegrees - center.RADegrees) ? x : y);
            var startIdx = coordinates.FindIndex(x => startRA.RADegrees == x.RADegrees);
            var iterator = 0;
            var list     = new LinkedList <PointF>();

            if (currentViewport.ContainsCoordinates(startRA))
            {
                var pointF = Project(startRA);
                list.AddLast(pointF);

                do
                {
                    iterator++;

                    var rightCoordinate = coordinates[(int)nfmod((startIdx + iterator), coordinates.Count)];
                    var leftCoordinate  = coordinates[(int)nfmod((startIdx - iterator), coordinates.Count)];

                    var leftPointF  = Project(leftCoordinate);
                    var rightPointF = Project(rightCoordinate);

                    list.AddLast(leftPointF);
                    list.AddFirst(rightPointF);

                    if (!currentViewport.ContainsCoordinates(leftCoordinate) && !currentViewport.ContainsCoordinates(rightCoordinate))
                    {
                        break;
                    }
                } while (iterator <= coordinates.Count / 2d);
            }

            DecPoints.Add(new FrameLine()
            {
                Collection = new List <PointF>(list), StrokeThickness = thickness, Closed = false, Angle = Angle.ByDegree(dec)
            });
        }