Beispiel #1
0
 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);
 }
Beispiel #2
0
        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;
                }
            }
        }
Beispiel #3
0
        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;
                }
            }
        }