Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование лекции.doc
Скачиваний:
49
Добавлен:
12.11.2019
Размер:
5.53 Mб
Скачать

11.6. Построение геометрических фигур

Рассмотрим задачу построения треугольника с известными длинами сторон AB, AC, BC. Подобное построение вызывает большие трудности, поскольку непонятно, с чего же начать? Сделаем следующее. Зафиксируем на холсте одну вершину треугольника в точке с произвольными координатами a1,b1. Будем считать, что одна из сторон идет горизонтально, что сразу дает нам координаты второй точки (Рис. 11 .35).

Рис. 11.35 Построение треугольника.

Осталось найти координаты точки С. Найдем косинус угла CAB по теореме косинусов: . Рассмотрим прямоугольный треугольник ACC1. В нем нам известны все углы и одна сторона. Тогда по теореме синусов , откуда находим dy. Аналогично вычисляем и dx.

11.7. Обновление изображения

Помимо объекта Image, рисовать можно непосредственно на форме или панели. Например, проведем белые диагональные полосы на форме, превратив ее в подобие Андреевского флага. Для этого напишем следующий обработчик нажатия на кнопку:

procedure TForm1.Button1Click(Sender: TObject);

begin

with Self.Canvas do

begin

Pen.Color:=clWhite;

Pen.Width:=20;

MoveTo(0,0);

LineTo(Self.ClientWidth,Self.ClientHeight);

MoveTo(Self.ClientWidth,0);

LineTo(0,Self.ClientHeight)

end

end;

Данный фрагмент проводит две белые полосы шириной в 20 пикселов по диагонали формы. Точка (0,0) формы находится в ее левом верхнем углу. Обратите внимание, что для определения размеров формы используются свойства формы ClientWidth и ClientHeight, а не просто Width и Height. Дело в том, что свойства Width и Height содержат полный размер формы, включая полоску заголовка, а ClientWidth и ClientHeight – лишь размеры так называемой клиентской части формы, на которой можно размещать другие объекты.

Если запустить нашу программу и щелкнуть по кнопке, полосы действительно отрисуются (Рис. 11 .36, а). Но... Попробуем перетащить окно программы так, чтобы оно частично оказалось за пределами экрана, а потом вытащим его обратно. О, ужас! На части окна, побывавшей за границей экрана, линии стерлись! (Рис. 11 .36, б). Причем при использовании объекта Image подобный эффект не наблюдается.

а)

б)

Рис. 11.36 Потеря части изображения.

Как бороться с таким безобразием? Увы, единственный способ – перерисовывать картинку всякий раз, когда часть изображения затирается. Для этого вынесем все команды рисования в отдельную процедуру Draw:

procedure Draw;

begin

with Form1.Canvas do

begin

Pen.Color:=clWhite;

Pen.Width:=20;

MoveTo(0,0);

LineTo(Form1.ClientWidth,Form1.ClientHeight);

MoveTo(Form1.ClientWidth,0);

LineTo(0,Form1.ClientHeight)

end

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Draw

end;

procedure TForm1.FormPaint(Sender: TObject);

begin

Draw

end;

В данном фрагменте добавлен обработчик события формы OnPaint. Это событие происходит всякий раз, когда форму надо перерисовывать. Соответственно в такие моменты и вызывается процедура Draw. Теперь с исчезновениями частей изображения покончено.