如何使用不相互覆盖的三角形填充WPF窗口?

时间:2014-01-08 13:43:31

标签: c# wpf collision

请参阅下面的代码。

我正在使用DispatcherTimer来填充带有三角形的网格。我的问题是我的代码创建的一些三角形覆盖其他。如何修改代码以确保不会发生这种情况?我希望它们彼此相邻并且有时间覆盖整个窗口,但没有相互遮盖。

    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);

    }

3 个答案:

答案 0 :(得分:1)

您只是在随机点创建三角形并希望它们不会叠加? 为了确保它们不叠加,您需要:

  1. -

    以常规方式创建它们(等边三角形可以以常规编程方式彼此相邻放置,完全覆盖矩形区域)

  2. -

    如果三角形将是完全不同的尺寸/类型,那么祝你好运!您需要为体积碰撞检测做一些数学运算,或者更喜欢更多的尝试来解决放置问题。

答案 1 :(得分:1)

我不认为你意识到问题的复杂性。你想要随机地对窗口进行三角测量,除了一次只得到一个三角形并且是邻居。我认为这个apporoach几乎不可能。我宁愿尝试这个:

  • 生成随机数点(也可将角点添加为点)
  • 使用algoritmth对这些点进行三角测量并存储邻居三角形信息
  • 选择随机起始三角形并绘制它
  • 从您的TIN中选择随机三角形,该三角形与任何已绘制的三角形相邻并绘制它
  • 继续直到绘制所有三角形

答案 2 :(得分:1)

此时你正在生成随机三角形。你似乎从目前为止的点列表中随机选取了两个先前的点,然后随机生成一个新的点来制作三角形。你的问题很明显,新的随机点需要考虑它是否会覆盖现有的三角形,随着时间的推移,这个决定变得越来越难。

您需要一个不同的算法。

首先在开发时,不要担心计时器滴答声部分。你想要预先生成整个三角形组合,然后只使用计时器勾选来绘制它们,但是当你开发它时,只需计算它们,然后立即绘制它。

现在我们需要一个合理的算法来创建三角形。当你继续随机时,随机会变得更加复杂。以下是基于矩形可以分成2个三角形这一事实的一些想法。

  1. 拿一个矩形。将其对角分成两个三角形。将三角形分成两半,你认为你已经足够了。

  2. 对于不规则的结果。想象一个网格至少比窗口大一个单元格,但是会使网格的点摆动,以便它们在所有方向上移动最多一半的单元格大小。随机将每个单元格划分为两个三角形。