请参阅下面的代码。
我正在使用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);
}
答案 0 :(得分:1)
您只是在随机点创建三角形并希望它们不会叠加? 为了确保它们不叠加,您需要:
-
以常规方式创建它们(等边三角形可以以常规编程方式彼此相邻放置,完全覆盖矩形区域)
-
如果三角形将是完全不同的尺寸/类型,那么祝你好运!您需要为体积碰撞检测做一些数学运算,或者更喜欢更多的尝试来解决放置问题。
答案 1 :(得分:1)
我不认为你意识到问题的复杂性。你想要随机地对窗口进行三角测量,除了一次只得到一个三角形并且是邻居。我认为这个apporoach几乎不可能。我宁愿尝试这个:
答案 2 :(得分:1)
此时你正在生成随机三角形。你似乎从目前为止的点列表中随机选取了两个先前的点,然后随机生成一个新的点来制作三角形。你的问题很明显,新的随机点需要考虑它是否会覆盖现有的三角形,随着时间的推移,这个决定变得越来越难。
您需要一个不同的算法。
首先在开发时,不要担心计时器滴答声部分。你想要预先生成整个三角形组合,然后只使用计时器勾选来绘制它们,但是当你开发它时,只需计算它们,然后立即绘制它。
现在我们需要一个合理的算法来创建三角形。当你继续随机时,随机会变得更加复杂。以下是基于矩形可以分成2个三角形这一事实的一些想法。
拿一个矩形。将其对角分成两个三角形。将三角形分成两半,你认为你已经足够了。
对于不规则的结果。想象一个网格至少比窗口大一个单元格,但是会使网格的点摆动,以便它们在所有方向上移动最多一半的单元格大小。随机将每个单元格划分为两个三角形。