List<Point> p1 = new List<Point> {
                new Point(10,10),
                new Point(10,100),
                new Point(100,100),
                new Point(100,10),
                new Point(10,10)
            };
            List<Point> p2 = new List<Point> {
                new Point(20,20),
                new Point(20,90),
                new Point(90,90),
                new Point(90,20),
                new Point(20,20)
            };
            List<Point> p3 = new List<Point> {
                new Point(30,30),
                new Point(30,80),
                new Point(80,80),
                new Point(80,30),
                new Point(30,30)
            };
            List<Point> pa = new List<Point>();
            pa.AddRange(p1);
            pa.AddRange(p2);
            pa.AddRange(p3);
            pa.Add(new Point(80, 30));
            pa.Add(new Point(90, 20));
            pa.Add(new Point(100, 10));
            Graphics g = this.CreateGraphics();
            g.FillPolygon(new SolidBrush(Color.Red), pa.ToArray());
这个算法的思路有没有问题,虽然画出的图形是想要的,但总感觉逻辑不对,请高手们指点一下

解决方案 »

  1.   

    没啥问题,除了这句Graphics g = this.CreateGraphics();可以修改        List<Point> pa = new List<Point>();
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Graphics g = e.Graphics;
                g.FillPolygon(new SolidBrush(Color.Red), pa.ToArray());
            }        private void button1_Click(object sender, EventArgs e)
            {
                List<Point> p1 = new List<Point> {
                    new Point(10,10),
                    new Point(10,100),
                    new Point(100,100),
                    new Point(100,10),
                    new Point(10,10)
                };
                List<Point> p2 = new List<Point> {
                    new Point(20,20),
                    new Point(20,90),
                    new Point(90,90),
                    new Point(90,20),
                    new Point(20,20)
                };
                List<Point> p3 = new List<Point> {
                    new Point(30,30),
                    new Point(30,80),
                    new Point(80,80),
                    new Point(80,30),
                    new Point(30,30)
                };
                pa.RemoveAll();
                pa.AddRange(p1);
                pa.AddRange(p2);
                pa.AddRange(p3);
                pa.Add(new Point(80, 30));
                pa.Add(new Point(90, 20));
                pa.Add(new Point(100, 10));
                this.Refresh();
            }
      

  2.   

    有个比较完整的方法
    g.FillPolygon(new SolidBrush(Color.Red), pa.ToArray(),System.Drawing.Drawing2D.FillMode.Alternate);可能主要原理是GDI的XOR(异或绘图),可以自己MSDN上查查