Тестовое задание 3dShapes – 2012

Продолжаем обсуждение тестовых заданий предлагаемых различными организациями для проверки уровня кандидатов. Это задние предлагается формой 3dShapes. На первый взгляд задание довольно простое. На форме необходимо рисовать треугольники, круги и квадраты, по клику на фигуре она начинает вращаться. Ничего сверх естественного , но при выборе конкретной реализации возникает многообразие как сие можно сделать. Данное задание было реализовано в двух видах.

  1. Реализация при помощи стандартных TShape, которые отрисовывались на PaintBox и вращались вокруг свое оси.
  2. При помощи функции канвы которая отрисовывает многоугольник. Каждая фигура при этом реализуется как многоугольник, а при установки ее на форму генерируется множество точек которым она будет представлена. Вращение при этом происходит в плоскости формы.

Рассмотрим подробно первый случай.

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

Исходный код для первого случая. Скачать полный исходный код можно здесь


type

TMyShape = class(TShape)

private

FisRotate: Boolean;

procedure SetisRotate(const Value: Boolean);

protected

procedure Paint; override;

public

property isRotate: Boolean read FisRotate write SetisRotate;

procedure Rotate;

end;

{ TMyShape }

procedure TMyShape.Paint;

var

X, Y, W, H, S: Integer;

begin

inherited Paint;

with Canvas do

begin

Pen := Pen;

Brush := Brush;

X := Pen.Width div 2;

Y := X;

W := Width - Pen.Width + 1;

H := Height - Pen.Width + 1;

if Pen.Width = 0 then

begin

Dec(W);

Dec(H);

end;

if W < H then S := W else S := H;

if Shape in [stSquare, stRoundSquare, stCircle] then

begin

Inc(X, (W - S) div 2);

Inc(Y, (H - S) div 2);

W := S;

H := S;

end;

case Shape of

stRectangle, stSquare, stRoundRect, stRoundSquare, stCircle, stEllipse:;

else

Polygon([Point(x, y + H -1), Point(x+w-1, y+h-1),Point(x + Round(W/2),y)]);

end;

end;

end;

procedure TMyShape.Rotate;

begin

if (Width = 0) then begin

Tag:= 1;

end;

if (Width = 100) then begin

Tag:= -1;

end;

Left:= Left - Tag;

Width:= Width + Tag+ Tag;

end;

procedure TMyShape.SetisRotate(const Value: Boolean);

begin

FisRotate := Value;

end;
Share

Tags: , , , , ,

2 Responses to “Тестовое задание 3dShapes – 2012”

  1. Nicola пишет:

    Спасибо за пост и очень полезную информацию.

Leave a Reply