private void LoadGrid(List <GroundTruthPoint> points)
        {
            foreach (var pnt in points)
            {
                Point address = GetGridAddressFromPoint(pnt.X, pnt.Y);
                grid[address.X, address.Y] = pnt;
            }

            for (int y = 12; y < 24; y++)
            {
                for (int x = 20; x < 40; x++)
                {
                    if (grid[x, y] == null)
                    {
                        GroundTruthPoint gt = new GroundTruthPoint();
                        gt.X = x * 50 + 30.5 - 50;
                        gt.Y = y * 50 + 10.5 - 50;
                    }
                }
            }
        }
 public Constraint(SolveProjector projector, GroundTruthPoint point)
 {
     this.projector = projector;
     this.point = point;
 }
 public Constraint(SolveProjector projector, GroundTruthPoint point)
 {
     this.projector = projector;
     this.point     = point;
 }
        private void AddPointToTree()
        {
            if (PointTree.SelectedNode == null)
            {
                return;
            }

            if (Align.Selected)
            {
                // Code to build sets of points

                //if (Control.ModifierKeys == Keys.Alt || Control.ModifierKeys == (Keys.Alt | Keys.Shift))
                //{
                //    bool North = Control.ModifierKeys == (Keys.Alt | Keys.Shift);

                //    if (PointTree.SelectedNode.Tag is ProjectorEntry)
                //    {
                //        Random rnd = new Random();

                //        ProjectorEntry pe = PointTree.SelectedNode.Tag as ProjectorEntry;

                //        for (double alt = 0; alt < 90; alt+=15)
                //        {

                //            //double alt = alts[i];
                //            double steps = 25;

                //            //if (i == 3)
                //            //{
                //            //    steps = 5;
                //            //}

                //            for (double az = 0; az < 360; az += 360 / steps)
                //            {
                //                GroundTruthPoint pnt = new GroundTruthPoint();

                //                int cX = pe.Width / 2;
                //                int cY = pe.Height / 2;
                //                cY = 120;

                //                double rad = pe.Height / 2;
                //                rad = pe.Width / 2;

                //                double az2 = az - 90;
                //                pnt.X = cX + (float)Math.Cos(az2 / 180 * Math.PI) * ((90 - alt) / 90) * rad;
                //                pnt.Y = cY - (float)Math.Sin(az2 / 180 * Math.PI) * ((90 - alt) / 90) * rad;

                //                pnt.X += rnd.NextDouble() / 1000f;
                //                pnt.Y += rnd.NextDouble() / 1000f;
                //                //pnt.X = pe.Width / 2;
                //                //pnt.Y = pe.Height / 2;

                //                pnt.Alt = alt;
                //                pnt.Az = az;
                //                pnt.AxisType = AxisTypes.Both;

                //                if (pnt.Y > 0)
                //                {
                //                    pe.Constraints.Add(pnt);
                //                    pe.SelectedGroundTruth = pe.Constraints.Count - 1;

                //                    TreeNode child = PointTree.SelectedNode.Nodes.Add(pnt.ToString());
                //                    child.Tag = pnt;
                //                }

                //            }
                //        }
                //    }

                if (ModifierKeys == Keys.Alt || ModifierKeys == (Keys.Alt | Keys.Shift))
                {
                    if (PointTree.SelectedNode.Tag is ProjectorEntry)
                    {
                        var pe = PointTree.SelectedNode.Tag as ProjectorEntry;

                        for (var i = 0; i < 4; i++)
                        {

                            var alt = alts[i];
                            double steps = 25;

                            if (i == 3)
                            {
                                steps = 5;
                            }

                            for (var az = 7.2; az < 360; az += 360 / steps)
                            {
                                var pnt = new GroundTruthPoint
                                {
                                    X = pe.Width/2.0,
                                    Y = pe.Height/2.0,
                                    Alt = alt,
                                    Az = az,
                                    AxisType = AxisTypes.Both
                                };

                                if (altCenter[pe.ID - 1] < 70)
                                {
                                    if (((Math.Abs(az - centers[pe.ID - 1]) < 55) || (Math.Abs((az - 360) - centers[pe.ID - 1]) < 55)) && alt < 75)
                                    {
                                        pe.Constraints.Add(pnt);
                                        pe.SelectedGroundTruth = pe.Constraints.Count - 1;

                                        var child = PointTree.SelectedNode.Nodes.Add(pnt.ToString());
                                        child.Tag = pnt;
                                    }
                                }
                                else if (altCenter[pe.ID - 1] == 70)
                                {
                                    if (((Math.Abs(az - centers[pe.ID - 1]) < 95) || (Math.Abs((az - 360) - centers[pe.ID - 1]) < 95)) && alt > 25)
                                    {
                                        pe.Constraints.Add(pnt);
                                        pe.SelectedGroundTruth = pe.Constraints.Count - 1;

                                        var child = PointTree.SelectedNode.Nodes.Add(pnt.ToString());
                                        child.Tag = pnt;
                                    }
                                }

                            }
                        }
                    }

                    return;
                }

                if (PointTree.SelectedNode.Tag is ProjectorEntry)
                {
                    var pe = PointTree.SelectedNode.Tag as ProjectorEntry;

                    var props = new GroundTruthPointProperties();

                    var pnt = new GroundTruthPoint {X = pe.Width/2.0, Y = pe.Height/2.0};

                    props.Target = pnt;
                    if (props.ShowDialog() == DialogResult.OK)
                    {

                        pe.Constraints.Add(pnt);

                        pe.SelectedGroundTruth = pe.Constraints.Count - 1;

                        var child = PointTree.SelectedNode.Nodes.Add(pnt.ToString());
                        child.Tag = pnt;
                        PointTree.SelectedNode = child;
                    }
                    return;
                }
                var groundTruthPoint = PointTree.SelectedNode.Tag as GroundTruthPoint;
                if (groundTruthPoint != null)
                {
                    var pe = PointTree.SelectedNode.Parent.Tag as ProjectorEntry;

                    var props = new GroundTruthPointProperties();

                    var pnt = new GroundTruthPoint {X = pe.Width/2.0, Y = pe.Height/2.0};

                    props.Target = pnt;
                    if (props.ShowDialog() == DialogResult.OK)
                    {
                        var index = pe.Constraints.IndexOf(groundTruthPoint) + 1;

                        pe.Constraints.Insert(index, pnt);

                        var child = PointTree.SelectedNode.Parent.Nodes.Insert(PointTree.SelectedNode.Index + 1, pnt.ToString());
                        child.Tag = pnt;
                        PointTree.SelectedNode = child;
                    }
                    return;
                }

                if (PointTree.SelectedNode.Tag is Edge)
                {
                    var edge = PointTree.SelectedNode.Tag as Edge;

                    var ep = new EdgePoint {Left = new GroundTruthPoint(), Right = new GroundTruthPoint()};

                    ep.Left.X = CalibrationInfo.ProjLookup[edge.Left].Width / 2.0;
                    ep.Left.Y = CalibrationInfo.ProjLookup[edge.Left].Height / 2.0;
                    ep.Right.X = CalibrationInfo.ProjLookup[edge.Left].Width / 2.0;
                    ep.Right.Y = CalibrationInfo.ProjLookup[edge.Left].Height / 2.0;
                    edge.Points.Add(ep);
                    var child = PointTree.SelectedNode.Nodes.Add(ep.ToString());
                    child.Tag = ep;
                    PointTree.SelectedNode = child;
                    return;
                }
                if (PointTree.SelectedNode.Tag is EdgePoint)
                {
                    var edge = PointTree.SelectedNode.Parent.Tag as Edge;

                    var ep = new EdgePoint {Left = new GroundTruthPoint(), Right = new GroundTruthPoint()};

                    ep.Left.X = CalibrationInfo.ProjLookup[edge.Left].Width / 2.0;
                    ep.Left.Y = CalibrationInfo.ProjLookup[edge.Left].Height / 2.0;
                    ep.Right.X = CalibrationInfo.ProjLookup[edge.Left].Width / 2.0;
                    ep.Right.Y = CalibrationInfo.ProjLookup[edge.Left].Height / 2.0;

                    edge.Points.Insert(PointTree.SelectedNode.Index + 1, ep);
                    var child = PointTree.SelectedNode.Parent.Nodes.Insert(PointTree.SelectedNode.Index + 1, ep.ToString());
                    child.Tag = ep;
                    PointTree.SelectedNode = child;
                    return;
                }

                if (PointTree.SelectedNode.Text == "Edges")
                {
                    var edge = new Edge(-1, -1);
                    var props = new EdgeProperties {Edge = edge};
                    edge.Owner = CalibrationInfo;

                    if (props.ShowDialog() == DialogResult.OK)
                    {
                        if (edge.Left != -1 && edge.Right != -1 && edge.Right != edge.Left)
                        {
                            CalibrationInfo.AddEdge(edge);
                            ReloadPointTree();
                        }
                    }
                }
            }
            else
            {
                if (PointTree.SelectedNode.Tag is ProjectorEntry)
                {
                    var pe = PointTree.SelectedNode.Tag as ProjectorEntry;
                    var pnt = new BlendPoint {X = pe.Width/2.0, Y = pe.Height/2.0};

                    pe.BlendPolygon.Add(pnt);

                    pe.SelectedBlendPoint = pe.BlendPolygon.Count - 1;

                    var child = PointTree.SelectedNode.Nodes.Add(pnt.ToString());
                    child.Tag = pnt;
                    PointTree.SelectedNode = child;
                    return;

                }

                if (PointTree.SelectedNode.Parent != null && PointTree.SelectedNode.Parent.Tag is ProjectorEntry)
                {
                    var bp = (BlendPoint)PointTree.SelectedNode.Tag;

                    var pe = PointTree.SelectedNode.Parent.Tag as ProjectorEntry;
                    var pnt = new BlendPoint {X = pe.Width/2.0, Y = pe.Height/2.0};

                    var index = pe.BlendPolygon.IndexOf(bp) + 1;
                    pe.BlendPolygon.Insert(index, pnt);

                    pe.SelectedBlendPoint = index + 1;

                    var child = PointTree.SelectedNode.Parent.Nodes.Insert(index, pnt.ToString());
                    child.Tag = pnt;
                    PointTree.SelectedNode = child;
                }
            }
        }
        private void ReloadPointTree()
        {
            PointTree.Nodes.Clear();
            if (Align.Selected)
            {
                var constraints = PointTree.Nodes.Add(Language.GetLocalizedText(736, "Constraints"));
                // First all the Constraints
                foreach (var pe in CalibrationInfo.Projectors)
                {
                    var node = constraints.Nodes.Add(pe.Name);
                    node.Tag = pe;
                    // First all the Constraints

                    foreach (var pnt in pe.Constraints)
                    {
                        var pntNode = node.Nodes.Add(pnt.ToString());
                        pntNode.Tag = pnt;
                    }

                }
                constraints.Expand();
                // Not the Edges
                var edges = PointTree.Nodes.Add(Language.GetLocalizedText(737, "Edges"));
                // First all the Constraints
                foreach (var edge in CalibrationInfo.Edges)
                {
                    var node = edges.Nodes.Add(CalibrationInfo.GetEdgeDisplayName(edge));
                    node.Tag = edge;
                    foreach (var edgePoint in edge.Points)
                    {
                        var pntNode = node.Nodes.Add(edgePoint.ToString());
                        pntNode.Tag = edgePoint;
                    }
                }
                edges.Expand();
            }
            else
            {
                // First all the Constraints
                foreach (var pe in CalibrationInfo.Projectors)
                {
                    var node = PointTree.Nodes.Add(pe.Name);
                    node.Tag = pe;
                    foreach (var bp in pe.BlendPolygon)
                    {
                        var pntNode = node.Nodes.Add(bp.ToString());
                        pntNode.Tag = bp;
                    }
                }
            }
            MousePad.Invalidate();
            SliderTargetNode = null;
            ColorCorrectTarget = null;
            SliderTarget = null;
            WeightTrackBar.Visible = false;
            PointWeightLabel.Visible = false;
        }
        private void PointTree_AfterSelect(object sender, TreeViewEventArgs e)
        {
            SliderTargetNode = null;
            SliderTarget = null;
            ColorCorrectTarget = null;
            rightNode = -1;
            leftNode = -1;
            selectedEdge = null;
            if (e.Node != null && e.Node.Tag is Edge)
            {
                var edge = e.Node.Tag as Edge;
                selectedEdge = edge;
                leftNode = edge.Left;
                rightNode = edge.Right;
            }
            if (e.Node != null && e.Node.Tag is EdgePoint)
            {
                var edge = e.Node.Parent.Tag as Edge;
                var ep = e.Node.Tag as EdgePoint;
                if (edge != null)
                {
                    selectedEdge = edge;
                    leftNode = edge.Left;
                    rightNode = edge.Right;

                    SliderTarget = ep.Left;
                    SliderTargetNode = e.Node;
                    edge.SelectedPoint = edge.Points.IndexOf(ep);
                }
            }
            if (e.Node != null && e.Node.Tag is ProjectorEntry)
            {
                var pe = e.Node.Tag as ProjectorEntry;
                rightNode = -1;
                leftNode = pe.ID;
                ColorCorrectTarget = pe;
            }

            if (e.Node != null && e.Node.Parent != null && e.Node.Parent.Tag is ProjectorEntry)
            {
                var pe = e.Node.Parent.Tag as ProjectorEntry;
                rightNode = -1;
                leftNode = pe.ID;

                if (Align.Selected)
                {
                    var gt = e.Node.Tag as GroundTruthPoint;
                    if (gt != null)
                    {

                        var index = pe.Constraints.IndexOf(gt);

                        SliderTarget = gt;
                        SliderTargetNode = e.Node;
                        pe.SelectedGroundTruth = index;
                        SendAlignPointEditUpdate(pe, false);
                    }
                }
                else
                {
                    var bp = e.Node.Tag as BlendPoint;
                    if (bp != null)
                    {

                        var index = pe.BlendPolygon.IndexOf(bp);

                        pe.SelectedBlendPoint = index ;
                        SendBlendPointEditUpdate(pe);
                    }
                }

            }

            MousePad.Invalidate();
        }
        private void GenerateWarpMaps()
        {
            ProgressPopup.Show(this, Language.GetLocalizedText(747, "Building Maps"), Language.GetLocalizedText(748, "Building Warp Maps"));

            string path = String.Format("{0}\\ProjetorWarpMaps", Properties.Settings.Default.CahceDirectory);

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            int index = 0;

            foreach (ProjectorEntry pe in CalibrationInfo.Projectors)
            {
                List<GroundTruthPoint> gtPoints = new List<GroundTruthPoint>();
                //foreach (GroundTruthPoint gt in pe.Constraints)
                //{
                //    gtPoints.Add(gt);
                //}
                foreach (Edge edge in CalibrationInfo.Edges)
                {
                    bool isRight = edge.Right == pe.ID;
                    if (!isRight && edge.Left != pe.ID)
                    {
                        continue;
                    }
                    SolveProjector spRight = GetSolveProjector(edge.Right);

                    SolveProjector spLeft = GetSolveProjector(edge.Left);

                    foreach (EdgePoint ep in edge.Points)
                    {
                        Vector2d pntLeft = spLeft.GetCoordinatesForScreenPoint(ep.Left.X, ep.Left.Y);
                        Vector2d pntRight = spRight.GetCoordinatesForScreenPoint(ep.Right.X, ep.Right.Y);
                        Vector2d pntAvg = Vector2d.Average3d(pntLeft, pntRight);

                        GroundTruthPoint gt = new GroundTruthPoint();
                        gt.X = isRight ? ep.Right.X : ep.Left.X;
                        gt.Y = isRight ? ep.Right.Y : ep.Left.Y;
                        gt.AxisType = AxisTypes.Both;
                        gt.Az = pntAvg.X;
                        gt.Alt = pntAvg.Y;
                        gtPoints.Add(gt);
                    }

                }

                Bitmap bmp = WarpMapper.MakeWarpMap(pe, CalibrationInfo.DomeSize, UseRadial.Checked, gtPoints, (CalibrationInfo.ScreenType == ScreenTypes.Spherical) ? ScreenTypes.Spherical: ScreenTypes.Cylindrical);
                bmp.Save(string.Format("{0}\\distort_{1}.png", path, pe.Name.Replace(" ", "_")));
                bmp.Dispose();
                index++;
                ProgressPopup.SetProgress(index * 100 / CalibrationInfo.Projectors.Count, string.Format(Language.GetLocalizedText(749, "Warp") + " {0} / {1}.", index, CalibrationInfo.Projectors.Count));
            }
            ProgressPopup.Done();
        }