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

Версии с плавающей точкой

В С# поддерживается два типа данных с плавающей точкой: float и double. Тип данных double используется в Windows Forms и GDI+ редко, a float, наоборот, часто. Можно удивиться, зачем нужны координаты с плавающей точкой, когда рисование ведется в пикселах, но в главе 7 вы увидите, что можно использовать координатные системы, основанные не на пикселах, а на других единицах.

Структура PointF очень похожа на структуру Point — только свойства X и Y принимают значения типа float, а не int. Аналогично структура SizeF очень похожа на структуру Size за исключением того, что Width и Height имеют тип float. Структуры PointF и SizeF поддерживают операторы сложения, вычитания, равенства и неравенства точно так же, как Point и Size.

Вот ошибка, которую я допускаю примерно раз в неделю:

  PointF ptf = new PointF();
  ptf.X = 2.5;              // Ошибка!
  ptf.Y = 3E-2;             // Ошибка!

Компилятор предположит, что значения имеют тип double, а не float, и поэтому сообщит: «Literal of type double cannot be implicitly converted to type 'float'» (литерал типа double не может неявно преобразовываться в тип float). Одно из решений — привести значения к типу float:

  ptf.X = (float)2.5;
  ptf.Y = (float)3E-2;

Более легкий метод — поставить за литералом символ f, означающий float.

  ptf.X = 2.5f;
  ptf.Y = 3E-2f;

Как и у Point, у структуры PointF есть конструктор, позволяющий инициализировать ее в момент создания:

  PointF ptf = new PointF(2.5f, 3E-2f);

Структура PointF не содержит метода Offset.

Целые значения могут неявно приводиться к типу float, поэтому можно присваивать целые значения полям с плавающей точкой:

  PointF ptf = new PointF(127, 42);

Можно привести структуру Point к структуре PointF:

  ptf = (PointF)pt;

Однако нельзя привести структуру PointF к Point:

  pt = (Point)ptf;     // Ошибка!

Вместо преобразования PointF в Point можно использовать один из статических методов, предусмотренных для этой цели в структуре Point:


Статические методы Point



Point Round(PointF ptf)
Point Truncate(PointF ptf)
Point Ceiling(PointF ptf)


Например:

  pt = Point.Round(ptf);

Перед методом Round должно стоять имя структуры, так как это статический метод.

Метод Round округляет свойства Х и Y до ближайшего целого, если дробная часть равна 0.5, выполняется округление до ближайшего большего целого. Метод Truncate просто отбрасывает дробную часть. Например, координаты 0.9 и –0.9 станут равными 0. Метод Ceiling округляет величину до ближайшего целого числа, большего чем округляемое, т.е. 0.9 станет 1, а –0.9 — 0.

Аналогично можно неявно преобразовать Size в SizeF, но для преобразования SizeF в Size понадобятся следующие методы:


Статические методы Size



Size Round(SizeF sizef)
Size Truncate(SizeF sizef)
Size Ceiling(SizeF sizef)


Кроме того, структура SizeF содержит два следующих метода экземпляра. Это единственные методы экземпляра, которые SizeF не наследует и не переопределяет:


Методы экземпляра Size



PointF ToPointF()
Size ToSize()


Метод ToSize аналогичен методу Truncate.

Как ни странно, хотя можно приводить структуры Point и Size, приводить Point к PointF, Size к SizeF и SizeF к PointF, нельзя привести PointF к SizeF. Однако PointF имеет конструктор, принимающий параметр типа SizeF. Ниже для сравнения представлен полный список конструкторов четырех структур:


Сравнение конструкторов



Point PointF Size SizeF

() () () ()
(x, y) (x, y) (cx, cy) (cx, cy)
(size)   (point) (pointf)
(xyPacked)     (sizef)


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

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