简体   繁体   中英

How to draw an ellipse at random points within a set range?

I am a student learning C# at school and have a project due in our Graphics Unit. I have created a Christmas tree using points and filled it in. Now I'm looking to created ellipse ornaments within the range I have already declared in the tree. Is there a way to make these ellipses only within my tree, and to have them change based on a random number generator within the tree? Thank you.

Here is my code for the tree. The ellipses I made are for snowflakes. SolidBrush green = new SolidBrush(Color.Green);

    Pen greentree = new Pen(Color.Green);

    Point[] christmastree = new Point[11];
    christmastree[0] = new Point(518, 400);
    christmastree[1] = new Point(620, 300);
    christmastree[2] = new Point(549, 300);
    christmastree[3] = new Point(645, 185);
    christmastree[4] = new Point(607, 185);
    christmastree[5] = new Point(673, 102);
    christmastree[6] = new Point(744, 185);
    christmastree[7] = new Point(706, 185);
    christmastree[8] = new Point(793, 300);
    christmastree[9] = new Point(720, 300);
    christmastree[10] = new Point(835, 400);
    g.DrawPolygon(greentree, christmastree);
    g.FillPolygon(green, christmastree);

    //Snow
    Random r = new Random();
    SolidBrush snowsb = new SolidBrush(Color.White);
    for(int i = 1; i <= 40; i++)
    {
        int snowflake_x = r.Next(1000);
        int snowflake_y = r.Next(500);
        g.FillEllipse(snowsb, snowflake_x, snowflake_y, 4,4);
    }

Like I said, I very inexperienced in this area of C#. Thank you

Try something like that:

Random r = new Random();

// Number of ellipses
int ellipseCount = 0;

// Loop for setting a specified amount of ellipses
while (ellipseCount < 10)
{

    // New random point 
    Point p = new Point(r.Next(0, 300), r.Next(0,300));
    // check if point is in my range
    if (p.IsInMyRange())
    {
         Ellipse e = new Ellipse {Width = 10, Height = 10};
         // Implement: set coordinates to ellipse

         ellipseCount++;
    }
}

you need to implement a method which tests if your point is in your range. With no code of you I can't help you with that.

Try this...

namespace Baum
{
    using System;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

            PointF[] tree = new PointF[]
            {
                new PointF(12, 0),
                new PointF(16, 4),
                new PointF(13, 4),
                new PointF(19, 11),
                new PointF(13, 11),
                new PointF(21, 20),
                new PointF(3, 20),
                new PointF(11, 11),
                new PointF(5, 11),
                new PointF(11, 4),
                new PointF(8, 4)
            };

            PointF[] stump = new PointF[]
            {
                new PointF(10, 20),
                new PointF(14, 20),
                new PointF(14, 27),
                new PointF(19, 27),
                new PointF(19, 30),
                new PointF(6, 30),
                new PointF(6, 27),
                new PointF(10, 27)
            };

            using (GraphicsPath path = new GraphicsPath())
            {
                path.AddPolygon(tree);
                Matrix m = new Matrix();
                m.Scale(20, 20);
                path.Transform(m);
                e.Graphics.FillPath(Brushes.Green, path);

                foreach (PointF p in path.PathPoints)
                {
                    int s = 15;
                    PointF q = p;
                    q.X -= (s / 2);
                    q.Y -= (s / 2);

                    if (new Random(Guid.NewGuid().GetHashCode()).Next(0, tree.Length) > tree.Length / 2)
                    {
                        e.Graphics.FillEllipse(Brushes.Red, new RectangleF(q.X, q.Y, s, s));
                    }
                }
            }

            using (GraphicsPath path = new GraphicsPath())
            {
                path.AddPolygon(stump);
                Matrix m = new Matrix();
                m.Scale(20, 20);
                path.Transform(m);
                e.Graphics.FillPath(Brushes.Brown, path);
            }

            System.Threading.Thread.Sleep(500);
            Refresh();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM