Консультация № 155013
19.12.2008, 21:40
0.00 руб.
0 2 1
1. Построить закрашенный шестиугольник. Построить вписанную в него окружность. Подписать диаметр окружности. Найти площадь шестиугольника и подписать ее.

Обсуждение

давно
Старший Модератор
9
677
20.12.2008, 01:48
общий
Уважаемый посетитель!
На нашем ресурсе принято здороваться, задавая вопрос или отвечая. Здесь живые люди находятся, а не роботы, и люди эти на вопросы в приказном тоне отвечать тем более не обязаны. Прошу это учитывать.
давно
Профессионал
153662
1070
20.12.2008, 14:51
общий
это ответ
Здравствуйте, Puma666!
Предлагаю свой вариант решения Вашей задачи. Исходник в приложении, а весь проект у меня на сайте вот здесь. При выполнения задания были использованы материалы сайта Delphi Word.

Приложение:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
PaintBox1: TPaintBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}


procedure DrawFigura(Canvas: TCanvas; Center, Pos: TPoint);
{
Рисование шестиугольника и круга внутри шестиугольника

Center - центр фигуры;
Pos - точка, лежащая на внешнем радиусе;
}

function Max(A, B: Integer): Integer;
begin
if A > B then
Result := A
else
Result := B;
end;

function ArcTan2(Y, X: Extended): Extended;
asm
FLD Y
FLD X
FPATAN
FWAIT
end;

const
Rad = Pi / 180;
var
R, r2, rd, len: Word;
i: Integer;
MemBS: TBrushStyle;
p: array of TPoint;
MemC: TColor;
a, ad: Double;

I1, J, HP: Integer;
plosh: Double;
begin
{начальный угол:}
a := ArcTan2(Center.y - Pos.y, Pos.x - Center.x) * (180 / Pi);
R := Max(Abs(Center.x - Pos.x), Abs(Center.y - Pos.y));
If R = 0 then
R:= 20;
SetLength(p, 6); {устанавливаем длину массива точек}
ad := 360 / 6; {угол между рядом стоящими точками}
rd := R;
for i := 0 to 5 do
begin
p[i].x := Trunc(Cos(a * Rad) * rd) + Center.x;
p[i].y := Trunc(Sin(a * Rad) * rd) + Center.y;
a := a + ad; {увеличиваем угол}
end;

{рисуем многоугольник}
Canvas.Brush.Color:= clred;
Canvas.Polygon(p);

{Вычисляем площадь шестиугольника}
plosh:= 0;
HP:= High(p);
for I1:= Low(p) to HP do
begin
if I1 = HP then
J:= 0
else
J:= I1 + 1;
plosh:= plosh + (p[I1].X + p[J].X) * (p[I1].Y - p[J].Y);
end;
plosh:= Abs(plosh) / 2;
Canvas.TextOut(Center.X - 80, Center.Y - 25, 'Площадь шестиугольника ' + FloatToStr(plosh));

{Рисуем окружность}
R:= 124;
Canvas.Pen.Color:= clblack;
Canvas.Pen.Width:= 2;
MemC := Canvas.Brush.Color;
MemBS := Canvas.Brush.Style;
Canvas.Brush.Style := bsClear;
Canvas.Ellipse(Center.x - R, Center.y - R, Center.x + R, Center.y + R);
Canvas.Brush.Color := MemC;
Canvas.Brush.Style := MemBS;
Canvas.TextOut(Center.X - 50, Center.Y, 'Диаметр окружности ' + InttoStr(r * 2));
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
PaintBox1.Canvas.Pen.Color:= clREd; // Цвет контура
DrawFigura(PaintBox1.Canvas, Point(PaintBox1.Width div 2, (PaintBox1.Height div 2)),
Point(PaintBox1.Width div 2, 0));
end;

end.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа