public Chains(List <PointListItem> originsList, PointListItem fPoint) { m_OriginsList = originsList; StartPoint = fPoint; GraphChains = new List <Graph>(); FindChains(StartPoint); }
private bool AddLink(PointListItem item) { if (m_LinkItems.Any(x => x.Id() == item.Id())) { return(false); } m_LinkItems.Add(item); return(true); }
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); } }
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); } }
private void FindChains(PointListItem startItem) { while (m_OriginsList.Count > 0) { if (IsHaveNeighbors(startItem.Id())) { //var ch = new Chain(startItem); } else { m_OriginsList.Remove(startItem); } } }
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); }
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(); } } } }
public AngleItem(PointListItem a, PointListItem b, PointListItem c) { A = a; B = b; C = c; }
public bool IsTouched(PointListItem a) { return(GetDistance(a.GetPoint()) - (m_Radius + a.GetRadius()) < 5); }