/// <summary> /// 一个多边形和另外一个多边形之间的关系 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void PolygonInsideTestBtn_Click(object sender, RoutedEventArgs e) { List <Geometry2D> gss = this.drawingKernel.GeometryShapes; List <List <Line2D> > lines = new List <List <Line2D> >(); foreach (var g in gss) { if (g is PolygonGeometry) { List <Line2D> nlines = new List <Line2D>(); PolygonGeometry poly = g as DrawingKernel.Geometries.Primitives.PolygonGeometry; g.FillColor = Colors.Azure; g.Opacity = 0.3; poly.Update(); nlines.AddRange(poly.Lines); lines.Add(nlines); } if (g.GeometryId == "tp") { this.drawingKernel.RemoveGeometryShape(g); } } //计算多边形和多边形之间的关系 if (lines.Count == 2) { List <List <Line2D> > ins = new List <List <Line2D> >(); var result = GraphicAlgorithm.PolygonInsideOfRegion(lines[0], lines[1], ins); if (result == 1) { ins.ForEach(x => { PolygonGeometry pg = new PolygonGeometry(); x.ForEach(y => { pg.PPoints.Add(y.Start); }); pg.FillColor = Colors.Green; pg.GeometryId = "tp"; this.drawingKernel.AddShape(pg); }); } else if (result == 0) { ins.ForEach(x => { PolygonGeometry pg = new PolygonGeometry(); x.ForEach(y => { pg.PPoints.Add(y.Start); }); pg.FillColor = Colors.Red; pg.GeometryId = "tp"; this.drawingKernel.AddShape(pg); }); } else { MessageBox.Show("相离"); } } else { MessageBox.Show("不表现多个多边形的情况"); } }
/// <summary> /// 线和多边形的关系 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void PInsideTestBtn_Click(object sender, RoutedEventArgs e) { List <Geometry2D> gss = this.drawingKernel.GeometryShapes; List <Line2D> lines = new List <Line2D>(); List <Line2D> vts = new List <Line2D>(); foreach (var g in gss) { if (g is PolygonGeometry) { PolygonGeometry poly = g as DrawingKernel.Geometries.Primitives.PolygonGeometry; g.FillColor = Colors.Azure; g.Opacity = 0.3; poly.Update(); lines.AddRange(poly.Lines); } if (g is DrawingKernel.Geometries.Primitives.LineGeometry) { DrawingKernel.Geometries.Primitives.LineGeometry l = g as DrawingKernel.Geometries.Primitives.LineGeometry; vts.Add(Line2D.Create(l.Start, l.End)); } if (g.GeometryId == "tp") { this.drawingKernel.RemoveGeometryShape(g); } } if (vts != null) { for (int i = 0; i < vts.Count; i++) { var rs = GraphicAlgorithm.LineInsideOfRegion(vts[i], lines, null); if (rs == 1) { DrawingKernel.Geometries.Primitives.LineGeometry lg = new DrawingKernel.Geometries.Primitives.LineGeometry(); lg.Start = vts[i].Start; lg.End = vts[i].End; lg.PenColor = Colors.Blue; lg.GeometryId = "tp"; this.drawingKernel.AddShape(lg); } else if (rs == 0) { DrawingKernel.Geometries.Primitives.LineGeometry lg = new DrawingKernel.Geometries.Primitives.LineGeometry(); lg.PenColor = Colors.Red; lg.Start = vts[i].Start; lg.End = vts[i].End; lg.GeometryId = "tp"; this.drawingKernel.AddShape(lg); } else { DrawingKernel.Geometries.Primitives.LineGeometry lg = new DrawingKernel.Geometries.Primitives.LineGeometry(); lg.PenColor = Colors.Black; lg.Start = vts[i].Start; lg.End = vts[i].End; lg.GeometryId = "tp"; this.drawingKernel.AddShape(lg); } } } }
/// <summary> /// 检测一个点是否在一个多边形内部 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void InsideTestBtn_Click(object sender, RoutedEventArgs e) { List <Geometry2D> gss = this.drawingKernel.GeometryShapes; List <Line2D> lines = new List <Line2D>(); List <Vector2D> vts = new List <Vector2D>(); foreach (var g in gss) { if (g is PolygonGeometry) { PolygonGeometry poly = g as DrawingKernel.Geometries.Primitives.PolygonGeometry; g.FillColor = Colors.Azure; g.Opacity = 0.3; poly.Update(); lines.AddRange(poly.Lines); } if (g is DrawingKernel.Geometries.Primitives.LineGeometry) { DrawingKernel.Geometries.Primitives.LineGeometry l = g as DrawingKernel.Geometries.Primitives.LineGeometry; vts.Add(l.Start); vts.Add(l.End); } if (g.GeometryId == "tp") { this.drawingKernel.RemoveGeometryShape(g); } } if (vts != null) { int resultP = 0; for (int i = 0; i < vts.Count; i++) { resultP = GraphicAlgorithm.InsideOfRegion(vts[i], lines); if (resultP == 0) { CircleGeometry c = new DrawingKernel.Geometries.Primitives.CircleGeometry(); c.FillColor = Colors.Red; c.Start = vts[i]; c.End = Vector2D.Create(vts[i].X + 5, vts[i].Y); c.GeometryId = "tp"; this.drawingKernel.AddShape(c); } else if (resultP == 1) { CircleGeometry c = new DrawingKernel.Geometries.Primitives.CircleGeometry(); c.FillColor = Colors.Green; c.Start = vts[i]; c.End = Vector2D.Create(vts[i].X + 5, vts[i].Y); c.GeometryId = "tp"; this.drawingKernel.AddShape(c); } else { CircleGeometry c = new DrawingKernel.Geometries.Primitives.CircleGeometry(); c.FillColor = Colors.Yellow; c.Start = vts[i]; c.End = Vector2D.Create(vts[i].X + 5, vts[i].Y); c.GeometryId = "tp"; this.drawingKernel.AddShape(c); } } } }