private Boolean LOP(Delaunay3 sj1, Delaunay3 sj2) { if (sj1.Ifggb(sj2) == true) //判断是否有公共线 { //1if ggb = sj1.Findggb(sj2); //找到公共线 for (j = 0; j < 3; j++) { //3for if (sj2.pt[j] != ggb.StartNode && sj2.pt[j] != ggb.EndNode) { pc = sj2.pt[j]; } }//3for 找出除公共线以外三角形上2的另一个点pc float dis = sj1.DisToCen(pc);//计算pc距离三角形1外接圆圆心的距离dis if (dis < sj1.r) {//2if return(false); }//2if 比较dis和半径的大小,dis<r代表pc在三角形1的外接圆内,不符合空圆规则 else { for (j = 0; j < 3; j++) { if (sj1.pt[j] != ggb.StartNode && sj1.pt[j] != ggb.EndNode) { pc = sj1.pt[j]; } } dis = sj2.DisToCen(pc); if (dis < sj2.r) { return(false); } } } else { return(false); } return(true); }
public void delaunay() { GISVertex v; updateview(); pt.Clear(); dlay.Clear(); for (i = 0; i < document.layers.Count; i++) { if (document.layers[i].ShapeType == SHAPETYPE.POINT) { for (j = 0; j < document.layers[i].Features.Count; j++) { v = new GISVertex(view.ToScreenPoint(document.layers[i].Features[j].spatialpart.centroid).X, view.ToScreenPoint(document.layers[i].Features[j].spatialpart.centroid).Y); pt.Add(new PointF(Convert.ToSingle(v.x), Convert.ToSingle(v.y))); } ptA[0].X = this.Width / 2; ptA[0].Y = -Convert.ToSingle(ptA[0].X / Math.Sqrt(3) * 2); ptA[1].X = -ptA[0].X; ptA[1].Y = this.Height; ptA[2].X = this.Width + ptA[0].X; ptA[2].Y = this.Height - 10; dlay.Add(new Delaunay3(ptA[0], ptA[1], ptA[2])); for (q = 0; q < pt.Count; q++) { de = null; for (j = 0; j < dlay.Count; j++) { if (dlay[j].contain(pt[q])) { de = dlay[j]; break; } } if (de != null) { dlay.Remove(de); dlay.Add(new Delaunay3(de.pt[0], de.pt[1], pt[q])); dlay.Add(new Delaunay3(de.pt[0], de.pt[2], pt[q])); dlay.Add(new Delaunay3(de.pt[2], de.pt[1], pt[q])); } n1 = false; while (n1 == false) { n1 = true; for (m = 0; m < dlay.Count - 1; m++) { for (n = m + 1; n < dlay.Count; n++) { if (dlay[m].Ifggb(dlay[n]) && LOP(dlay[m], dlay[n]) == false) { de1 = dlay[m]; de2 = dlay[n]; n1 = false; ggb1 = de1.Findggb(de2); for (k = 0; k < 3; k++) { if (de1.pt[k] != ggb1.StartNode && de1.pt[k] != ggb1.EndNode) { p1 = de1.pt[k]; } if (de2.pt[k] != ggb1.StartNode && de2.pt[k] != ggb1.EndNode) { p2 = de2.pt[k]; } }//交换对角线 dlay.Add(new Delaunay3(ggb1.StartNode, p1, p2)); dlay.Add(new Delaunay3(ggb1.EndNode, p1, p2)); dlay.Remove(de1); dlay.Remove(de2); } if (n1 == false) { break; } } if (n1 == false) { break; } } } } break; } } }
public void delaunay() { GISVertex v; updateview(); pt.Clear(); dlay.Clear(); for (i = 0; i < document.layers.Count; i++) { if (document.layers[i].ShapeType == SHAPETYPE.POINT) { for (j = 0; j < document.layers[i].Features.Count; j++) { v = new GISVertex(view.ToScreenPoint(document.layers[i].Features[j].spatialpart.centroid).X, view.ToScreenPoint(document.layers[i].Features[j].spatialpart.centroid).Y); pt.Add(new PointF(Convert.ToSingle(v.x), Convert.ToSingle(v.y))); } //ptA[0].X = pictureBox1.Width / 2; //ptA[0].Y = -Convert.ToSingle(ptA[0].X / Math.Sqrt(3) * 2); //ptA[1].X = -ptA[0].X; //ptA[1].Y = pictureBox1.Height; //ptA[2].X = pictureBox1.Width + ptA[0].X; //ptA[2].Y = pictureBox1.Height - 5; float xmax, xmin, ymax, ymin, dx, dy, ddx, ddy; xmin = xmax = pt[0].X; ymin = ymax = pt[0].Y; for (j = 1; j < pt.Count; j++) { if (xmin > pt[j].X) { xmin = pt[j].X; } if (xmax < pt[j].X) { xmax = pt[j].X; } if (ymin > pt[j].Y) { ymin = pt[j].Y; } if (ymax < pt[j].Y) { ymax = pt[j].Y; } } dx = xmax - xmin; dy = ymax - ymin; ddx = dx / 100; ddy = dy / 100; xmin -= ddx; xmax += ddx; dx += 2 * ddx; ymin -= ddy; ymax += ddy; dy += 2 * ddy; ptA[0].X = xmin - dy * Convert.ToSingle(Math.Sqrt(3) / 3); ptA[0].Y = ymin; ptA[1].X = xmax + dy * Convert.ToSingle(Math.Sqrt(3) / 3); ptA[1].Y = ymin; ptA[2].X = (xmin + xmax) / 2; ptA[2].Y = xmax + dy * Convert.ToSingle(Math.Sqrt(3) / 2); dlay.Add(new Delaunay3(ptA[0], ptA[1], ptA[2])); for (q = 0; q < pt.Count; q++) { de = null; for (j = 0; j < dlay.Count; j++) { if (dlay[j].contain(pt[q])) { de = dlay[j]; break; } } if (de != null) { dlay.Remove(de); dlay.Add(new Delaunay3(de.pt[0], de.pt[1], pt[q])); dlay.Add(new Delaunay3(de.pt[0], de.pt[2], pt[q])); dlay.Add(new Delaunay3(de.pt[2], de.pt[1], pt[q])); } n1 = false; while (n1 == false) { n1 = true; for (m = 0; m < dlay.Count - 1; m++) { for (n = m + 1; n < dlay.Count; n++) { if (dlay[m].Ifggb(dlay[n]) && LOP(dlay[m], dlay[n]) == false) { de1 = dlay[m]; de2 = dlay[n]; n1 = false; ggb1 = de1.Findggb(de2); for (k = 0; k < 3; k++) { if (de1.pt[k] != ggb1.StartNode && de1.pt[k] != ggb1.EndNode) { p1 = de1.pt[k]; } if (de2.pt[k] != ggb1.StartNode && de2.pt[k] != ggb1.EndNode) { p2 = de2.pt[k]; } }//交换对角线 dlay.Add(new Delaunay3(ggb1.StartNode, p1, p2)); dlay.Add(new Delaunay3(ggb1.EndNode, p1, p2)); dlay.Remove(de1); dlay.Remove(de2); } if (n1 == false) { break; } } if (n1 == false) { break; } } } } } if (document.layers[i].ShapeType == SHAPETYPE.POINT) { break; } } }