我正在尝试在.net中构建一个Windows应用程序,它在面板内绘制分形图像。它以行的终点作为下一行的起点。但问题是,图表是在面板之外。我怎么做修复面板内的绘图
static int start_x, start_Y;
static int end_x, end_Y;
static int my_angle = 0;
static int my_length = 0;
private void Canvas_Paint(object sender, PaintEventArgs e)
{
start_x = Canvas.Width / 2;
start_Y = Canvas.Height / 2;
for (int i = 0; i < 400; i++)
{
draw_T();
}
}
public void draw_T()
{
Pen mypen = new Pen(Color.Green, 2F);
my_angle = my_angle + (45);
my_length = 100 + (1);
end_x = (int)(start_x + Math.Cos(my_angle * .0174539676) * my_length);
end_Y = (int)(start_Y + Math.Sin(my_angle * .0174539676) * my_length);
Point[] points =
{
new Point (start_x,start_Y),
new Point (end_x,end_Y)
};
Point[] points1 =
{
new Point ((end_x+start_x)/2,(end_Y+start_Y)/2),
new Point (end_x+50,end_Y-100)
};
start_x = end_x;
start_Y = end_Y;
Graphics g = Canvas.CreateGraphics();
g.DrawLines(mypen, points);
g.DrawLines(mypen, points1);
}
答案 0 :(得分:0)
我不确定你的图形应该如何看,但我可以给你一些提示。
一般来说,首先:请使用e.Graphics
参数!改变
public void draw_T()
到
public void draw_T(Graphics g)
并删除该行。
Graphics g = Canvas.CreateGraphics();
将通话更改为
draw_T(e.Graphics);
您正在通过创建处理它们的所有Graphcs来泄漏GDI资源,并且当您已经拥有Paint事件中的那个时,通过创建它们来浪费时间。
接下来,您应该添加NumericUpDown
来测试您的算法并编写如下脚本:
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
Canvas.Invalidate();
}
要工作,现在将循环更改为
for (int i = 0; i < numericUpDown1.Value; i++)
观看你的图形发展。
另一个测试可能是为第二个系列点引入第二笔颜色。
要进一步发挥作用,您可以添加另一个NumericUpDown
并将my_length
绑定到它..
最后你会看到长度需要小于101,否则画布需要大到700像素。
BTW:my_angle
和my_length
都不需要在类级别声明,因为它们总是在方法中设置并且在其他任何地方都没有使用,其他变量也不需要static
,at至少从你向我们展示的......