已知一任意多边形的各点坐标
现在需要根据参数返回多边形内点的坐标
也就是说
如果传入3,就要返回3个坐标点的坐标
求高手解答

解决方案 »

  1.   

    那你返回值类型设置为List<Point>不就可以了吗?
      

  2.   

    应该很好弄啊,你那应该是凸多边形吧,根据参数坐标获取最小的x坐标为x1和最大x坐标为x2,最小的y坐标为y1和最大的y坐标为y2然后随机(x1~x2)范围的值作为x坐标,随机(y1~y2)范围的值作为y坐标,作为一个内点   private void Form1_Load(object sender, EventArgs e)
            {
                Point[] pParam = new Point[] { new Point(12, 34), new Point(3, 5), new Point(45, 56), new Point(126, 6) };
                Point[] pIn = GetPointInPolygon(2, pParam);                  }        /// <summary>
            /// 获取多边形内随机坐标点
            /// </summary>
            /// <param name="count">获取左边点数量</param>
            /// <param name="point">多边形的各个点</param>
            /// <returns></returns>
            public Point[] GetPointInPolygon(int count, Point[] point)
            {
                if (point.Length < 3)
                    return null; //不是多边形            int x1 = int.MaxValue;
                int x2 = int.MinValue;
                int y1 = int.MaxValue;
                int y2 = int.MinValue;            foreach (Point p in point)
                {
                    if (p.X < x1)
                        x1 = p.X;
                    if (p.X > x2)
                        x2 = p.X;
                    if (p.Y < y1)
                        y1 = p.Y;
                    if (p.Y > y2)
                        y2 = p.Y;
                }            Random rnd = new Random((int)DateTime.Now.Ticks);
                Point[] pointRet = new Point[count];
                for (int i = 0; i < count; i++)
                {
                    pointRet[i] = new Point(rnd.Next(x1, x2), rnd.Next(y1, y2));
                }
                return pointRet;
            }
      

  3.   

    把函数GetPointInPolygon改造了一下,加了个随机点是否在多边形内的判断,这回应该可以了
     /// <summary>
            /// 获取多边形内随机坐标点
            /// </summary>
            /// <param name="count">获取左边点数量</param>
            /// <param name="point">多边形的各个点</param>
            /// <returns></returns>
            public Point[] GetPointInPolygon(int count, Point[] point)
            {
                if (point.Length < 3)
                    return null; //不是多边形            int x1 = int.MaxValue;
                int x2 = int.MinValue;
                int y1 = int.MaxValue;
                int y2 = int.MinValue;            foreach (Point p in point)
                {
                    if (p.X < x1)
                        x1 = p.X;
                    if (p.X > x2)
                        x2 = p.X;
                    if (p.Y < y1)
                        y1 = p.Y;
                    if (p.Y > y2)
                        y2 = p.Y;
                }
                GraphicsPath myGraphicsPath = new GraphicsPath();
                Region myRegion = new Region();
                myGraphicsPath.Reset();
                myGraphicsPath.AddPolygon(pParam);
                myRegion.MakeEmpty();
                myRegion.Union(myGraphicsPath);            Random rnd = new Random((int)DateTime.Now.Ticks);
                Point[] pointRet = new Point[count];
                int n=0;
               while(n<count)
                {
                    Point p = new Point(rnd.Next(x1, x2), rnd.Next(y1, y2));
                    if (myRegion.IsVisible(p)) //在多边形内
                    {
                        pointRet[n] = p;
                        n++;
                    }            }
                return pointRet;
            }
      

  4.   

    呵呵,把myGraphicsPath.AddPolygon(pParam);
    改成
    myGraphicsPath.AddPolygon(point);
      

  5.   

    如果随机点没有条件限制的话,先计算出多边形的内接矩形rect,然后用Random取
    X [rect.Left,rect.Right]
    Y [rect.Top,rect.Bottom]
      

  6.   

    内接矩形算不出,可以算内切圆
    要加个条件 x,y要在圆内具体算法
    http://wenku.baidu.com/view/a6179d6527d3240c8447ef66.html
      

  7.   

    你按照我说的方法画图来观察特性,就知道比较各顶点连线是最好的做法了,不管是凸的凹的,都满足这个角度关系,唯独这个角度值的比较如何对应到正切值的比较(y1-y2)/(x1-x2),这个需要自己写一个函数来包装下,其中需要判断对应的角度是第几像素的。