среда, 21 января 2015 г.

Коротко. "Вкусности" Delphi XE7. На примере TPointF и TPolygon

https://bitbucket.org/ingword/mindstream/src/1db98fbc5815c7da5a4f54d922add1d78fdf814a/AbstractShapes/msSVGShape.pas?at=B43

Смотрим код:

function TmsSVGShape.GetPolygon: TPolygon;
var
 l_PolygonSVG : TPolygon;
 l_SVG_String: string;
 l_PD: TPathData;
 {l_Point: TPointF;}
 l_R : TRectF;
 l_P : TPointF;
 l_Mid : TPointF;
 l_StartPoint : TPointF;
begin
 l_PD := TPathData.Create;
 try
  l_SVG_String := GetPolygonSVG;
  l_PD.Data := l_SVG_String;
  {l_Point:= }l_PD.FlattenToPolygon(l_PolygonSVG);
  l_R := PolygonBounds(l_PolygonSVG);

  l_StartPoint := StartPoint;
  Result := nil;
  for l_P in l_PolygonSVG do
  begin
   l_Mid := (l_R.BottomRight + l_R.TopLeft) / 2;
   Result := Result + [(l_P - l_Mid) + l_StartPoint];
  end;//for l_P in l_PolygonSVG
 finally
  FreeAndNil(l_PD);
 end;//try..finally
end;

Вроде код как код.

Но! Что тут "необычного"?

Во-первых строчка:

l_Mid := (l_R.BottomRight + l_R.TopLeft) / 2;

Тут складываются две ТОЧКИ (TPointF) и результат делится пополам. И ОПЯТЬ получается ТОЧКА (таким образом мы получаем точку, которая содержит перенос начала координат в середину начального прямоугольника).

Раньше такое делать было нельзя.

Теперь - МОЖНО. Приятно :-)

Во-вторых строчка:

Result := Result + [(l_P - l_Mid) + l_StartPoint];

В этой строчке - тоже есть - во-первых:

Создаётся динамический массив из одного элемента - [(l_P - l_Mid) + l_StartPoint]. В синтаксисе похожем на "множество" (set of).

И во-вторых:

Складываются ДВА ДИНАМИЧЕСКИХ массива:
Result := Result + ... Через операцию + (ПЛЮС).

Такого - ТОЖЕ раньше не было. И тоже - приятно:-)

Т.е. избавляемся от множества написания вызовов GetLength/SetLength/Item[i].

Т.е. динамические массивы всё больше и больше становятся похожими на строки.

"Синтаксический сахар"? Конечно! Но! Всё равно - приятно.

Комментариев нет:

Отправить комментарий