2015-11-17 2 views
-2

Я студент, изучающий C# в школе и имеющий проект в нашем графическом подразделении. Я создал рождественскую елку, используя точки и заполнил ее. Теперь я ищу созданный орнамент из эллипса в пределах диапазона, который я уже объявил в дереве. Есть ли способ сделать эти эллипсы только внутри моего дерева и изменить их на основе генератора случайных чисел внутри дерева? Спасибо.Как нарисовать эллипс в случайных точках в пределах заданного диапазона?

Вот мой код для дерева. Эллипсы, которые я сделал, предназначены для снежинок. SolidBrush green = новый 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); 
    } 

Как я уже сказал, я очень неопытен в этой области C#. Спасибо

+2

Вы должны размещать код вашего дерева и/или то, что вы сделали для эллипсов. Да, это возможно, но нам нужно лучше понять, с чем мы работаем, чтобы помочь вам. –

+0

Что вы нацеливаете: Winforms? WPF? ASP? ... ?? __Always__ соответствующим образом помечайте свой вопрос! Если у вас есть многоугольный список точек, вы можете использовать графический путь, сделанный из него, и проверить GP.IsVisible (Point), чтобы увидеть, находится ли центр вашего эллипса в области дерева. – TaW

+0

Только что опубликовал мой код. Большое спасибо – CJH

ответ

0

попробовать что-то вроде этого:

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++; 
    } 
} 

вам нужно реализовать метод, который проверяет, если точка находится в вашем диапазоне. Без вашего кода я не могу с этим поделать.

0

Попробуйте это ...

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(); 
     } 
    } 
} 
+0

Почему бы не использовать функцию GraphicsPath.IsVisible? – TaW

Смежные вопросы