netlib.narod.ru< Назад | Оглавление | Далее >

Коллинеарные точки и кривые Безье

Хотя у соединенных кривых Безье общие конечные точки, возможны ситуации, в которых переход одной кривой в другую не будет плавным. Говоря математическим языком, составная кривая считается плавной, только если ее первая производная непрерывна, т.е. не меняет резко направление.

При рисовании нескольких кривых Безье, соединенных вместе, часто желательно получить в результате плавную составную кривую, т.е. чтобы один сегмент кривой плавно переходил в другой. Но такая задача стоит не всегда. Например, стрелки часов — это совокупность плавных и прерывистых переходов. В точке встречи двух кривых Безье, рисующих кончик стрелки, первая производная результирующей кривой будет разорвана. Аналогичный разрыв будет и в точке соединения прямой части стрелки с фигурным контуром ее кончика. Но прямые, которыми нарисованы стрелки, плавно переходят в закругленную линию в центре циферблата.

Если нужен плавный переход между соединенными кривыми Безье, следующие три точки должны быть коллинеарными (лежать на одной прямой):

Вот программа, рисующая четыре кривых Безье, соединенных плавными переходами. Конец четвертой кривой соединяется с началом первой, образуя замкнутый криволинейный контур.

Infinity.cs

  //-----------------------------------------
  // Infinity.cs (C) 2001 by Charles Petzold
  //-----------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class Infinity: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new Infinity());
      }
      public Infinity()
      {
          Text = "Infinity Sign Using Bezier Splines";
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          cx--;
          cy--;

          Point[] apt = 
          {
              new Point(0,          cy / 2),     // Начальная
              new Point(0,          0),          // Управляющая
              new Point(    cx / 3, 0),          // Управляющая
              new Point(    cx / 2, cy / 2),     // Конечная/начальная
              new Point(2 * cx / 3, cy),         // Управляющая
              new Point(    cx,     cy),         // Управляющая
              new Point(    cx,     cy / 2),     // Конечная/начальная
              new Point(    cx,     0),          // Управляющая
              new Point(2 * cx / 3, 0),          // Управляющая
              new Point(    cx / 2, cy / 2),     // Конечная/начальная
              new Point(    cx / 3, cy),         // Управляющая
              new Point(0,          cy),         // Управляющая
              new Point(0,          cy / 2)      // Конечная
          };
          grfx.DrawBeziers(new Pen(clr), apt);
      }
  }

Каждая точка помечена в массиве как начальная, конечная/начальная или управляющая, любая точка коллинеарна двум соседним точкам. В результате эти четыре кривые образуют фигуру, похожую на символ бесконечности:


Рис. 13.7.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz