Пример #1
0
 public Chains(List <PointListItem> originsList, PointListItem fPoint)
 {
     m_OriginsList = originsList;
     StartPoint    = fPoint;
     GraphChains   = new List <Graph>();
     FindChains(StartPoint);
 }
Пример #2
0
 private bool AddLink(PointListItem item)
 {
     if (m_LinkItems.Any(x => x.Id() == item.Id()))
     {
         return(false);
     }
     m_LinkItems.Add(item);
     return(true);
 }
Пример #3
0
 public Chain(PointListItem self, IEnumerable <PointListItem> orig)
 {
     this.m_Self = self;
     m_LinkItems = new List <PointListItem>();
     m_OrigItems = new List <PointListItem>();
     foreach (var itm in orig)
     {
         m_OrigItems.Add(itm);
     }
 }
Пример #4
0
        private void GenerateRecurse(PointListItem current)
        {
            var nbh = FindTouchedList(current);

            foreach (var itm in nbh)
            {
                var tmp = m_OrigItems.FirstOrDefault(x => x.Id() == itm);
                m_OrigItems.Remove(tmp);
                AddLink(tmp);
                GenerateRecurse(tmp);
            }
        }
Пример #5
0
 private void FindChains(PointListItem startItem)
 {
     while (m_OriginsList.Count > 0)
     {
         if (IsHaveNeighbors(startItem.Id()))
         {
             //var ch = new Chain(startItem);
         }
         else
         {
             m_OriginsList.Remove(startItem);
         }
     }
 }
Пример #6
0
        private IEnumerable <int> FindTouchedList(PointListItem self)
        {
            var res = new List <int>();

            if (self == null)
            {
                return(res);
            }

            var nbs = m_OrigItems.OrderBy(x => x.GetDistance(self.GetPoint())).Take(4).ToList();

            foreach (var itm in nbs)
            {
                if (self.IsTouched(itm))
                {
                    res.Add(itm.Id());
                }
            }

            return(res);
        }
Пример #7
0
        private void PbOnePict_Click(object sender, EventArgs e)
        {
            var t     = (MouseEventArgs)e;
            var pInfo = pbOnePict.GetType().GetProperty("ImageRectangle",
                                                        BindingFlags.Public |
                                                        BindingFlags.NonPublic |
                                                        BindingFlags.Instance);

            if (pInfo == null)
            {
                return;
            }
            var rectangle = (Rectangle)pInfo.GetValue(pbOnePict, null);

            if (cbChains.Checked)
            {
                // var res = chain.Generate();
            }
            if (cbAngles.Checked)
            {
                var cp  = new PointF(t.X - rectangle.X, t.Y);
                var et  = m_ListCircles.OrderBy(x => x.GetDistance(cp)).FirstOrDefault();
                var opt = m_OriginalCircles.FirstOrDefault(x => et != null && x.Id() == et.Id());

                var chain = new Chain(opt, m_OriginalCircles);
                var res   = chain.Generate();
                var angls = chain.GetAngles();
                foreach (var angl in angls.GetGollection())
                {
                    AddToAngleList(angl);
                }
            }
            else if (cbBranched.Checked)
            {
                if (t.Button == MouseButtons.Left)
                {
                    var cp = new PointF(t.X - rectangle.X, t.Y);
                    var et = m_ListCircles.OrderBy(x => x.GetDistance(cp)).FirstOrDefault();
                    if (et == null)
                    {
                        return;
                    }
                    gMarker.DrawEllipse(Pens.Orange, rectangle.X + et.GetPoint().X - et.GetRadius() / 2,
                                        et.GetPoint().Y - et.GetRadius() / 2, et.GetRadius(), et.GetRadius());
                    var opt = m_OriginalCircles.FirstOrDefault(x => x.Id() == et.Id());
                    m_Branched.Add(opt);
                }
                else
                {
                    var brOverage = m_Branched.Average(x => x.GetRadius()) * 2;

                    Clipboard.Clear();
                    var forCb = $"{tbSingleFile.Text}\r\nСредний диаметр\t{brOverage}\r\nНомер\tX\tY\tРадиус\r\n";
                    foreach (var pt in m_Branched)
                    {
                        //var currentStr = $"{pt.GetPoint().X}\t{ pt.GetPoint().Y}\t{pt.Id()}\r\n";
                        var currentStr = $"{pt.Id()}\t{pt.GetPoint().X}\t{ pt.GetPoint().Y}\t{pt.GetRadius()}\r\n";
                        forCb += currentStr;
                    }
                    Clipboard.SetText(forCb);
                    Debug.WriteLine($"b={brOverage}");

                    //var ballElements = m_Branched.OrderByDescending(x => x.GetRadius()).Select(circle => new BallElement(circle.GetPoint().X, circle.GetPoint().Y, circle.GetRadius())).ToList();

                    //var ranges = new List<float>();
                    //foreach (var circle in ballElements)
                    //{
                    //    foreach (var dCircle in ballElements)
                    //    {
                    //        if (!(Math.Abs(circle.GetX() - dCircle.GetX()) < 0.000001 && Math.Abs(circle.GetY() - dCircle.GetY()) < 0.000001))
                    //        {
                    //            ranges.Add(circle.Range(dCircle.GetX(), dCircle.GetY()));
                    //        }
                    //    }
                    //}
                    //Debug.WriteLine($"Average={ranges.Average()}");
                    //var angles = new AngleCollection();
                    //foreach (var fr in m_Branched)
                    //    foreach (var sc in m_Branched)
                    //        foreach (var th in m_Branched)
                    //            angles.Add(new AngleItem(fr, sc, th));
                    //foreach (var itm in angles.GetGollection())
                    //{
                    //    var ids = itm.GetIds();
                    //    var angl = itm.Angle_point();
                    //    Debug.WriteLine($"{ids.Item1} : {ids.Item2} : {ids.Item3} : {angl.Item1} : {angl.Item2}");
                    //}
                    m_Branched.Clear();
                }
            }
            else
            {
                if (t.Button == MouseButtons.Left)
                {
                    try
                    {
                        var cp = new PointF(t.X - rectangle.X, t.Y);
                        var et = m_ListCircles.OrderBy(x => x.GetDistance(cp)).FirstOrDefault();
                        if (et == null)
                        {
                            return;
                        }
                        m_Polygon.Add(m_Circles[et.Id()].Center);
                        m_ClickedPoint.Add(et.Id());
                    }
                    catch (Exception ex)
                    {
                        // ignored
                        Debug.WriteLine(ex.Message);
                    }
                }
                else
                {
                    using (var g = pbOnePict.CreateGraphics())
                    {
                        for (var i = 1; i < m_Polygon.Count; i++)
                        {
                            g.DrawLine(Pens.Blue, new PointF(m_Polygon[i].X * m_XScale + rectangle.X, m_Polygon[i].Y * m_YScale), new PointF(m_Polygon[i - 1].X * m_XScale + rectangle.X, m_Polygon[i - 1].Y * m_YScale));
                        }
                        g.DrawLine(Pens.Blue, new PointF(m_Polygon[0].X * m_XScale + rectangle.X, m_Polygon[0].Y * m_YScale), new PointF(m_Polygon[m_Polygon.Count - 1].X * m_XScale + rectangle.X, m_Polygon[m_Polygon.Count - 1].Y * m_YScale));
                    }

                    m_CanArea = m_Polygon.ToArray();
                    var fi = new FileInfo(tbSingleFile.Text);
                    if (cbArea.Checked)
                    {
                        foreach (var cp in m_ClickedPoint)
                        {
                            var cir    = m_Circles[cp];
                            var lvItem = new ListViewItem(cp.ToString());
                            lvItem.SubItems.Add(cir.Radius.ToString("F6"));
                            lvItem.SubItems.Add(cir.Center.X.ToString("F6"));
                            lvItem.SubItems.Add(cir.Center.Y.ToString("F6"));

                            lvItem.SubItems.Add(fi.Name);
                            lvArea.Items.Add(lvItem);
                        }

                        for (var i = 0; i < m_Circles.Length; i++)
                        {
                            var cir = m_Circles[i];
                            var ts  = PointInArea.IsPointInside(m_Polygon.ToArray(), cir.Center);
                            if (!ts)
                            {
                                continue;
                            }
                            if (m_ClickedPoint.Any(x => x == i))
                            {
                                continue;
                            }
                            var lvItem = new ListViewItem(i.ToString());
                            lvItem.SubItems.Add(cir.Radius.ToString("F6"));
                            lvItem.SubItems.Add(cir.Center.X.ToString("F6"));
                            lvItem.SubItems.Add(cir.Center.Y.ToString("F6"));
                            m_ClickedPoint.Add(i);
                            //var fi = new FileInfo(tbSingleFile.Text);
                            lvItem.SubItems.Add(fi.Name);
                            lvArea.Items.Add(lvItem);
                        }
                        PrepareLinks(m_ClickedPoint.Select(c => new PointListItem(c, m_Circles[c].Center, m_Circles[c].Radius)).ToList());
                        lbAvgRad.Text =
                            $@"Средний радиус: {
                                    m_ClickedPoint.Select(c => m_Circles[c].Radius).ToList().Average(x => x)
                                :F5}";
                        m_Polygon.Clear();
                        m_ClickedPoint.Clear();
                    }
                    else if (cbChains.Checked)
                    {
                        if (m_ClickedPoint.Count <= 2)
                        {
                            return;
                        }
                        var chItem = new ListViewItem(lvChains.Items.Count.ToString());
                        var dList  = new List <double>();
                        chItem.SubItems.Add(fi.Name);
                        var pList = m_ClickedPoint[0].ToString();
                        var avgR  = 0.0d;
                        for (var i = 1; i < m_ClickedPoint.Count; i++)
                        {
                            var itm  = m_ClickedPoint[i];
                            var pItm = m_ClickedPoint[i - 1];
                            var cti  = new PointListItem(i, m_Circles[itm].Center, m_Circles[itm].Radius);
                            var dist = cti.GetDistance(m_Circles[pItm].Center);
                            dList.Add(dist);
                            avgR  += dist;
                            pList += ", " + itm;
                            //Debug.WriteLine($"{pItm}<=>{itm}:{cti.GetDistance(m_Circles[pItm].Center)}; R1={m_Circles[pItm].Radius}; R2={m_Circles[itm].Radius}");
                        }
                        chItem.SubItems.Add(pList);
                        chItem.SubItems.Add(m_ClickedPoint.Count.ToString());
                        chItem.SubItems.Add(dList.Average().ToString("F5"));
                        Debug.WriteLine($"Average:{dList.Average()} or {avgR / m_ClickedPoint.Count - 1}");
                        var lR = (new PointListItem(0, m_Circles[m_ClickedPoint[0]].Center, m_Circles[m_ClickedPoint[0]].Radius)).GetDistance(m_Circles[m_ClickedPoint[m_ClickedPoint.Count - 1]].Center);
                        chItem.SubItems.Add(lR.ToString("F5"));
                        chItem.SubItems.Add((m_Polygon.Count - m_Polygon.Distinct().Count()).ToString());
                        lvChains.Items.Add(chItem);
                        m_Polygon.Clear();
                        m_ClickedPoint.Clear();
                    }
                }
            }
        }
Пример #8
0
 public AngleItem(PointListItem a, PointListItem b, PointListItem c)
 {
     A = a;
     B = b;
     C = c;
 }
Пример #9
0
 public bool IsTouched(PointListItem a)
 {
     return(GetDistance(a.GetPoint()) - (m_Radius + a.GetRadius()) < 5);
 }