Рисование графика на Panel или PictureBox
Здраствуйте! Нужно нарисовать график функции y=(1-х^2)(x-2) (-2<x<2). При этом нужно использовать Radiobutton и RadioGroup для выбора цветов и шрифтов надписей, а также для построения осей координат. График должен выводится в анимационном режиме с использованием компонента Timer. Я новичок в этом деле и не совсем понимаю как это делать. Сделал, что-то вроде такого, но при этом если я нажима на Radiobutton, ничего не рисует. Как только я сворачиваю окно и открываю заново, уже нарисовано. Может ли кто-то помочь в этом разобраться? Я очень много прошу, но хотел бы что-бы мне подсказали как правильно нарисовать график с использованием RadioButton и Timer. Буду очень признателен!
namespace WindowsFormsApp5
{
public partial class Form1 : Form
{
private int xMin = -15;
private int xMax = 15;
private int yMin = -15;
private int yMax = 15;
private int dx, dy;
private int x0, y0;
bool shouldPaint = false;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
}
private void panel1_Resize(object sender, EventArgs e)
{
panel1.Refresh();
panel1.Refresh();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
dx = panel1.Width / (xMax - xMin);
dy = panel1.Height / (yMax - yMin);
x0 = -dx * xMin;
y0 = dy * yMax;
//panel1.Controls.Add(radioButton10);
for (int x = xMin; x <= xMax; x++)
{
e.Graphics.DrawLine(Pens.LightBlue, x0 + x * dx, 0, x0 + x * dx, panel1.Height);
}
//panel1.Refresh();
if (radioButton10.Checked)
{
shouldPaint = true;
//if (!RenderOk) { return; }
Pen p = new Pen(Color.Blue, 2);
// ось абсцисс
e.Graphics.DrawLine(p, 0, y0, panel1.Width, y0);
}
}
}
}
Ответы (1 шт):
Новичкам давать такие задачи...
RadioGroup - панель для Radiobutton, чтобы когда нажимаешь на один Radiobutton - с другого снималась отметка в том-же RadioGroup. Сам по себе выбор Radiobutton не должен запускать никаких процессов, это настройка.
Должна быть отдельная кнопка, запускающая процесс рисования.
Что с таймером, что без таймера - вариантов ка это сделать - много, какая задача - такое решение, целенаправленно ищем самый тупой вариант.
Xmin и Xmax у вас в диапазоне [-2,2]
Pen p = new Pen(Color.Black, 1);
List<Point> points = new List<Point>(); //для хранения точек
int y(int x) => (1 - x * x)*(x - 2);
void Start(Control panel) //(-2 < x < 2)
{
if (paintactive) return;
paintactive = true;
//y=(1-х^2)(x-2) (-2<x<2)
points.Clear();
Timer timer = new Timer();
timer.Interval = 1000;
int x = -2;
timer.Tick += (s, a) =>
{
if (x <= 2)
{
var point = new Point(x, y(x));
//WriteLine(point);
points.Add(point);
x++;
panel.Invalidate();
}
else
{
timer.Enabled = false;
paintactive = false;
}
};
timer.Start();
}
void Panel_Paint(object s, PaintEventArgs a)
{
a.Graphics.DrawLines(p, points.ToArray());
}
Запуск рисования происходит командой:
Start(panel);