Компьютерная графика, мультимедиа и игры на Visual C#


         

Глава Расчет и изображение линий уровня на поверхности - часть 2


private void FindPointOnCurve(ref float x, ref float y,

float LevelCurves, float start_x, float start_y,

float tolerance)

{

      float dx = 0, dy = 0, dz, delta, f_xy;

      int direction = 0;

      //Начальная точка:

      x = start_x; y = start_y; delta = initial_delta;

      //В бесконечном цикле do-while выходим через break:

      int i = 0;

      do

      {

            f_xy = f(x, y); dz = LevelCurves - f_xy;

            if (Math.Abs(dz) < tolerance) break;

            //Анализируем направление:

            if (Math.Sign(dz) != direction)

            {

                  //Изменяем направление. Уменьшаем delta:

                  delta = delta / 2;

                  direction = Math.Sign(dz);

            }

            //Рассчитываем градиент:

            Gradient(x, y, ref dx, ref dy);

            if ((Math.Abs(dx) + Math.Abs(dy)) < 0.001) break;

            //Перемещаемся направо:

            x = x + dx * delta * (float)direction;

            y = y + dy * delta * (float)direction;

      }

      while (i < 1);

}

//Рассчитываем градиент в этой точке:

private void Gradient(float x, float y,

                               ref float dx, ref float dy)

{

      float dist = 0;

      dx = df_dx(x, y); dy = df_dy(x, y);

      dist = Convert.ToSingle(Math.Sqrt(dx * dx + dy * dy));

      if (Math.Abs(dist) < 0.0001)

      {

            dx = 0; dy = 0;

      }

      else

      {

            dx = dx / dist; dy = dy / dist;

      }

}

//Рисуем линию уровня f(x, y) = LevelCurves:

private void PlotLevelCurve(Graphics g,

float LevelCurves, float x_min, float x_max, float y_min,

float y_max, float step_size,

float start_x, float start_y,

float tolerance)

{

      int num_points = 0;

      float x0 = 0, y0 = 0, x1, y1, x2, y2, dx = 0, dy = 0;

      //Находим точку (x0, y0) на линии уровня LevelCurves:

      FindPointOnCurve(ref x0, ref y0, LevelCurves,

      start_x, start_y, tolerance);

      //Начало:

      num_points = 1;




Содержание  Назад  Вперед