public void StartTrackPoint(PointF rgPoint, Size uiFrame)
        {
            var clr = _displayedTransformation.GetPixelColor(rgPoint, Current, this);

            _trackPoint = new Tuple <Color, PointF, CPoint>(clr, rgPoint, CPoint.New(rgPoint, CProjection.C1C2));
            DrawTrackPointDynamics(0);
        }
        public override Color GetPixelColor(PointF ptF, RGScene scene, RGProcessor processor)
        {
            var cpt = CPoint.New(ptF, CProjection.C1C2);

            if (!cpt.IsNormal)
            {
                return(RGScene.BackgroundColr);
            }

            var rg  = cpt.RG(CProjection.C1C2);
            var clr = GetC1C2Color(cpt, rg, scene, processor);

            return(clr);
        }
        public void StartBoundaryAnalysis(RectangleF rgFrame, Size uiFrame)
        {
            var mid  = rgFrame.Y + rgFrame.Height / 2;
            var left = rgFrame.X;

            Tuple <Color, PointF, CPoint> pt1 = null;
            Tuple <Color, PointF, CPoint> pt2 = null;
            const float acc = 0.00001f;

            for (var x = left; x <= left + rgFrame.Width; x += acc)
            {
                var fpt1 = new PointF(x, mid);
                var clr1 = _displayedTransformation.GetPixelColor(fpt1, Current, this);
                var fpt2 = new PointF(x + acc, mid);
                var clr2 = _displayedTransformation.GetPixelColor(fpt2, Current, this);
                if (clr1 != clr2)
                {
                    pt1 = new Tuple <Color, PointF, CPoint>(clr1, fpt1, CPoint.New(fpt1, CProjection.C1C2));
                    pt2 = new Tuple <Color, PointF, CPoint>(clr2, fpt2, CPoint.New(fpt2, CProjection.C1C2));
                    break;
                }
            }

            if (pt1 != null && pt2 != null)
            {
                var curPt1  = pt1.Item2;
                var curClr1 = pt1.Item1;
                var curPt2  = pt2.Item2;
                var curClr2 = pt2.Item1;

                var acc1                       = 0.000001f;
                var accuracyChanged1           = false;
                var afterAccuracyChangedSteps1 = 0;
                while (true)
                {
                    var testPt  = new PointF(curPt1.X + acc1, curPt1.Y);
                    var testClr = _displayedTransformation.GetPixelColor(testPt, Current, this);
                    if (testClr != curClr1)
                    {
                        if (acc1 >= float.Epsilon * 2)
                        {
                            acc1                       = acc1 / 2;
                            accuracyChanged1           = true;
                            afterAccuracyChangedSteps1 = 0;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        curPt1 = testPt;
                        if (accuracyChanged1)
                        {
                            afterAccuracyChangedSteps1++;
                            if (afterAccuracyChangedSteps1 >= 4)
                            {
                                break;
                            }
                        }
                    }
                }
                _boundaryPointLeft = new Tuple <Color, PointF, CPoint>(pt1.Item1, curPt1, CPoint.New(curPt1, CProjection.C1C2));

                var acc2                       = 0.000001f;
                var accuracyChanged2           = false;
                var afterAccuracyChangedSteps2 = 0;
                while (true)
                {
                    var testPt  = new PointF(curPt2.X - acc2, curPt1.Y);
                    var testClr = _displayedTransformation.GetPixelColor(testPt, Current, this);
                    if (testClr != curClr2)
                    {
                        if (acc2 >= float.Epsilon * 2)
                        {
                            acc2                       = acc2 / 2;
                            accuracyChanged2           = true;
                            afterAccuracyChangedSteps2 = 0;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        curPt2 = testPt;
                        if (accuracyChanged2)
                        {
                            afterAccuracyChangedSteps2++;
                            if (afterAccuracyChangedSteps2 >= 4)
                            {
                                break;
                            }
                        }
                    }
                }

                _boundaryPointRight = new Tuple <Color, PointF, CPoint>(pt2.Item1, curPt2, CPoint.New(curPt2, CProjection.C1C2));
            }

            DrawBoundaryPointDynamics(0);
        }