весна как рисование в С#

Как нарисовать форму пружины, используя класс рисования С#

замещающий текст http://img812.imageshack.us/img812/373/spring.jpg< /а>


person Spen D    schedule 05.08.2010    source источник
comment
С какой-то конкретной частью у вас проблемы?   -  person Oded    schedule 05.08.2010
comment
нет, я не знаю, как начать и с чего начать.   -  person Spen D    schedule 05.08.2010


Ответы (2)


Это скорее математическая задача, чем задача C#. Вам нужно вывести параметрическое уравнение для кривой, которую вы хотите нарисовать.

При этом заполните массив объектов Point значениями для параметрического уравнения на определенном интервале с определенным шагом (чем меньше шаг, тем больше окончательный рисунок будет похож на реальную форму). Затем вы можете использовать g.DrawLines (MSDN: DrawLines) для рисования фактическая кривая на поверхности.

Вы можете изменить ширину, цвет и другие свойства линии, изменив параметры объекта Pen.

Ваш фактический код будет выглядеть так:

void DrawSpring (Graphics g)
{
    List<Point> points = new List<Point>();

    double step = 0.01;
    for(double t = -2; t < 2; t += step)
    {
        Point p = new Point();
        p.X = XPartOfTheEquation(t);
        p.Y = YPartOfTheEquation(t);

        points.Add(p);
     }

    g.DrawLines(new Pen(new SolidBrush(Color.Black), 2f), points.ToArray());
}
person David Božjak    schedule 05.08.2010

Прежде всего, вам нужно придумать формулу, которая будет представлять пружину. Вы можете нарисовать круг, и по мере того, как вы будете его обходить, пусть X немного увеличится. Например:

        for (double i = 0; i < 50; i += 0.01)
        {
            int x = (int)(Math.Sin(i) * 10 + i * 3);
            int y =(int)(Math.Cos(i) * 10 + 50);
        }

См. переменную i там как время, а результат x и y координаты для отрисовки; вы пройдете путь весны маленькими шажками.

Затем вы можете создать новый Bitmap и использовать метод SetPixel для этих координат, а в методе OnPaint вашей формы нарисовать на нем растровое изображение.

Если вы хорошо разбираетесь в математике (у меня нет :P), вы можете отображать только пиксели внутри растрового изображения - приведенный выше пример не решает проблему минимального и максимального значений для i.

person C.Evenhuis    schedule 05.08.2010
comment
При подходе setPixel шаг должен быть очень маленьким, чтобы создать непрерывный рисунок (пружина), и потребуется некоторая настройка, чтобы избежать пиксельной графики :) При подходе с линиями рисования (см. Мой ответ) шаг будет больше. достаточно для создания убедительной формы. - person David Božjak; 05.08.2010
comment
Согласен :] Есть много вещей, с которыми можно поиграть, я мог представить, что вычисляю только один круг и копирую его, чтобы ускорить процесс. - person C.Evenhuis; 05.08.2010