нарисовать несколько кривых в окне изображения WinForms

Я работаю над программой, в которой хочу рисовать диодные кривые в приложении WinForms. У меня есть список названий диодов и их точек, как вы можете видеть справа на картинке. Это напряжение как X и ток как Y (кривая содержит около 50 точек).

Что я хочу сделать, так это выбрать один или несколько диодов из списка, их кривая отображается на моем графике. То, что вы видите, это просто окно с изображением, в данный момент заполненное bmp. Я знаю, что это ненадежное решение, поэтому я спрашиваю вас, как лучше всего это сделать? Я не знаю ни одного хорошего компонента, который мог бы заставить меня сделать это. Так что мне просто нужно знать, что может быть лучшим подходом для этой задачи?

Быстрый просмотр того, что я хочу

Кривая диода выглядит примерно так:

Кривая диода

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

Так что же ты думаешь?

ОБНОВЛЕНИЕ

ТАКЖЕ важно то, что при отмене выбора булавки на кривой ее кривая должна быть удалена с графика!

Я рисую эту ось, которую вы видите, используя приведенный ниже код:

    Bitmap xyCords = new Bitmap(500, 500);
Graphics g = Graphics.FromImage(xyCords);
g.DrawLine(penAxis, 250, 0, 250, 500);
g.DrawLine(penAxis, 0, 250, 500, 250);
curveBox.Image = xyCords;

как это возможно позже, если я сделаю новую графику, я добавлю ее так:

curveBox.Image += newGraphic;

** Пожалуйста, дайте мне знать, если есть какой-либо компонент или что-то, что уже может делать то, что я хочу. или же покажите мне хороший подход! Спасибо!


person Saeid Yazdani    schedule 20.03.2011    source источник


Ответы (1)


Попробуйте использовать Graphics.DrawCurve. Вы просто помещаете все нужные точки в массив и передаете его и перо методу.

Изменить. Добавьте это после своего кода, чтобы доказать себе, что оба графика сосуществуют. Чтобы стереть одно или другое, просто нанесите те же точки, но фоновым цветом растрового изображения (протестируйте его, я не помню, что это такое).

Point[] ptarray = new Point[3];
ptarray[0] = new Point(250, 250);
ptarray[1] = new Point(300, 300);
ptarray[2] = new Point(350, 400);

Pen pengraph = new Pen(Color.Green, 0.75F);
g.DrawCurve(pengraph, ptarray);

Point[] ptarray2 = new Point[3];
ptarray2[0] = new Point(100, 100);
ptarray2[1] = new Point(200, 150);
ptarray2[2] = new Point(250, 250);

Pen pengraph2 = new Pen(Color.Yellow, 1.25F);
g.DrawCurve(pengraph2, ptarray2);
person jonsca    schedule 20.03.2011
comment
@jonsca Привет, мой вопрос: на каком основании я должен это сделать? Я думаю, что на картинке это нехорошо, так как, насколько я знаю, он может содержать только 1 изображение. Я имею в виду, что если вы добавляете только одну кривую, это просто, но как только у вас уже есть одна кривая на картинке в виде bmp, когда вы собираетесь добавить к ней вторую кривую, вам нужно снова добавить эти две одновременно. . Я прав? - person Saeid Yazdani; 20.03.2011
comment
Нет, потому что вы включите свой bmp в качестве графического объекта, и вы сможете делать все, что необходимо. Лично, если этот аспект не является всем вашим проектом, я бы рассмотрел готовые элементы управления, которые уже выполняют работу по построению графика (я не знаю никаких навскидку, но я уверен, что их много). - person jonsca; 20.03.2011
comment
@jonsca хорошо, я думаю, ты имеешь в виду, что я могу применить столько графики, сколько захочу, к картинке? В настоящее время я использую этот код, чтобы нарисовать только ось в моем окне изображения: Bitmap xyCords = new Bitmap(500, 500); Graphics g = Graphics.FromImage(xyCords); g.DrawLine(penAxis, 250, 0, 250, 500); g.DrawLine(penAxis, 0, 250, 500, 250); curveBox.Image = xyCords; но вы видите, что я не могу позже сделать новую графику и сделать как curveBox += newBMP это не компилируется. не могли бы вы привести небольшой пример кода, пожалуйста? - person Saeid Yazdani; 20.03.2011
comment
Да, позвольте мне проверить это на себе, чтобы убедиться, что я не ошибаюсь. Если то, что вы говорите, верно, вы можете сохранить зубчатый 2D-массив всех ваших массивов точек и каждый раз перекрашивать их. - person jonsca; 20.03.2011
comment
@jonsca Спасибо, я проверю и отчитаюсь! - person Saeid Yazdani; 20.03.2011
comment
@jonsca, я попробовал твой способ и создал класс для этой задачи, кажется, он работает: P, но я не уверен, что это лучший способ, но да, он работает! - person Saeid Yazdani; 20.03.2011
comment
Лучший способ начать исследовать более эффективный способ — это изучить проект с открытым исходным кодом (например, но не ограничиваясь этим, ZedGraph и посмотрите, как они работают. - person jonsca; 20.03.2011