2014-01-08 2 views
1

См. Мой код ниже.Как заполнить окно WPF треугольниками, которые не покрывают друг друга?

Я использую DispatcherTimer, чтобы заполнить сетку треугольниками. Моя проблема заключается в том, что некоторые из треугольников, созданных моим кодом, покрывают eavch other. Как изменить код, чтобы убедиться, что этого не произойдет? Я хочу, чтобы они находились рядом друг с другом и со временем охватывали все окно, но не закрывали друг друга.

Random rnd = new Random(); 

    DispatcherTimer Timer = new DispatcherTimer(); 

    List<Point> Points = new List<Point>(); 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     ((Button)(sender)).Visibility = Visibility.Hidden; 
     Timer.Interval = new TimeSpan(0,0,1); 
     Timer.Tick += Timer_Tick; 
     Timer.Start(); 

    } 

    void Timer_Tick(object sender, EventArgs e) 
    { 
     if (Points.Count == 0) 
     { 
      Point P1 = new Point(rnd.Next(1000), rnd.Next(800)); 
      Point P2 = new Point(rnd.Next(1000), rnd.Next(800)); 
      Points.Add(P1); 
      Points.Add(P2); 
     } 
     int First = rnd.Next(Points.Count); 
     int Second = rnd.Next(Points.Count); 
     while (Second==First) 
     { 
      Second = rnd.Next(Points.Count); 
     } 
     Point NewPoint = new Point(rnd.Next(1000), rnd.Next(800)); 
     Points.Add(NewPoint); 

     Polygon Poly = new Polygon(); 
     Poly.Points.Add(Points[First]); 
     Poly.Points.Add(Points[Second]); 
     Poly.Points.Add(NewPoint); 
     Poly.StrokeThickness = 1.5; 
     Poly.Stroke = Brushes.Black; 
     int FillColor = rnd.Next(3); 
     switch (FillColor) 
     { 
      case 0: 
       Poly.Fill = Brushes.Red; 
       break; 
      case 1: 
       Poly.Fill = Brushes.Yellow; 
       break; 
      default: 
       Poly.Fill = Brushes.Lime; 
       break; 
     } 
     G1.Children.Add(Poly); 

    } 

ответ

1

Я не думаю, что вы осознаете сложность своей проблемы. Вы хотите случайным образом триангулировать окно в дополнение к тому, чтобы получить только один треугольник за раз и быть соседним. Я думаю, что это вряд ли возможно с этим приложением. Я предпочел бы попробовать это:

  • генерировать случайное число точек (добавить углов в точках а)
  • триангуляции этих точек со algoritmth и хранить сосед треугольники INFO
  • выбрать случайный начальный треугольник и сделать его
  • выбрать случайный треугольник из вашего TIN, который сосед к любому уже нарисованному треугольнику и сделать его
  • продолжать до тех пор пока все треугольники были нарисованы
+0

Когда снова смотрит в эту проблему (и ваш ответ). Я не мог больше согласиться. Тем не менее, есть ли у кого-нибудь идеи для кода, которые разрешат проблему? Предоставление этого задания рисования треугольников, которые не будут сталкиваться или пересекаться, очень просто для человека. Почему это невозможно для компьютера? –

+0

Это не должно быть сложно с самого начала, но чем ближе вы к решению, тем труднее это будет. (остатки триангуляции, вероятно, потребуют другого алгоритма) плюс первые два стартовых пуаса для трайлинга не должны быть любыми пунктами, сделанными ранее (например, в половине края треугольника) – wondra

1

Вы просто создаете треугольники в случайных точках и надеетесь, что они не накладываются? Для того, чтобы убедиться, что они не перекрывают вам либо нужно:

  1. -

    создать их в обычном порядке (равносторонние треугольники могут быть размещены рядом друг с другом в регулярном программном пути, который может охватывать прямоугольная область полностью)

  2. -

    если треугольники будут совершенно разные размеры/типы, то удачи! Вам нужно будет сделать некоторые математические данные для обнаружения столкновений по объему или, возможно, что-то большее, чем ALife, и попытаться решить проблему размещения.

+0

А «весело» Whitepaper о 2d бен упаковка http://www2.warwick.ac.uk/fac/sci/dcs/people/maxim_sviridenko/Bansal-packing.pdf – Gusdor

1

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

Вам нужен другой алгоритм.

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

Теперь нам нужен разумный алгоритм для создания треугольников. Случайный будет просто усложняться по ходу дела. Вот несколько идей, основанных на том, что прямоугольник можно разбить на два треугольника.

  1. Возьмите прямоугольник. Разделите его по диагонали на два треугольника.Продолжайте разбивать треугольники на половину, вы думаете, что у вас достаточно.

  2. Для нерегулярного результата. Представьте, что сетка, которая по крайней мере одна ячейка больше, чем ваше окно, все вокруг, но раскачивает точки сетки, чтобы они перемещались на половину размера ячейки во всех направлениях. Случайно разделите каждую ячейку на два треугольника.

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