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 | < Назад | Оглавление | Далее > |