14.05.2008, 19:28
общий
это ответ
Здравствуйте, Якушев Алексей Павлович!
Программа с комментариями в приложении.
Все геометрические вычисления делал на бумаге - если они будут нужны, могу передать.
Если будут какие-либо вопросы, пишите в мини-форум.
Удачи!
Приложение:
Uses crt,graph;const x0 = 300; { левая нижняя координата основания } y0 = 300; L = 80; { длина стороны основания } ds = 5; { расстояние между линиями штриховки }Var i,driver,mode:integer; d, h, hs : integer; { параметры пирамиды, вводимые пользователем } dx, dx1 : integer; xs, ys : integer; { левая нижняя координата сечения } L2 : integer; { длина стороны сечения }begin{ d := 50; h := 100; hs := 30;} Write(‘ВВедите высоту пирамиды: h=‘); ReadLn(h); Write(‘ВВедите расстояние от плоскости основания до сечения пирамиды: hs=‘); ReadLn(hs); Write(‘ВВедите расстояние от плоскости XOZ до основания пирамиды: d=‘); ReadLn(d); ClrScr; DetectGraph(driver,mode); InitGraph(driver,mode,‘BGI\‘);{ устанавливаем белый цвет } setcolor(15);{ рисуем ось OX } MoveTo(x0+round(sqrt(2)*L/2), y0-round(sqrt(2)*L/2) + d); LineTo(x0+L*2, y0-round(sqrt(2)*L/2) + d);{ рисуем стрелочку } LineTo(x0+L*2 -5, y0-round(sqrt(2)*L/2) + d-round(5*cos(pi/3))); LineTo(x0+L*2 -5, y0-round(sqrt(2)*L/2) + d+round(5*cos(pi/3))); LineTo(x0+L*2, y0-round(sqrt(2)*L/2) + d);{ рисуем ось OY } MoveTo(x0+round(sqrt(2)*L/2), y0-round(sqrt(2)*L/2) + d); LineTo(x0+round(sqrt(2)*L/2), y0-round(sqrt(2)*L/2) - h - 10);{ рисуем стрелочку } LineTo(x0+round(sqrt(2)*L/2)-round(5*cos(pi/3)), y0-round(sqrt(2)*L/2) - h - 10 +5); LineTo(x0+round(sqrt(2)*L/2)+round(5*cos(pi/3)), y0-round(sqrt(2)*L/2) - h - 10 +5); LineTo(x0+round(sqrt(2)*L/2), y0-round(sqrt(2)*L/2) - h - 10);{ рисуем ось OZ } MoveTo(x0+round(sqrt(2)*L/2), y0-round(sqrt(2)*L/2) + d); LineTo(x0-round(L*sqrt(2)/4), y0+round(sqrt(2)*L/4) + d);{ рисуем стрелочку } LineTo(x0-round(L*sqrt(2)/4)+2, y0+round(sqrt(2)*L/4) + d - 5); LineTo(x0-round(L*sqrt(2)/4)+5, y0+round(sqrt(2)*L/4) + d-2); LineTo(x0-round(L*sqrt(2)/4), y0+round(sqrt(2)*L/4) + d);{ подписываем оси } setcolor(10); OutTextXY(x0+round(sqrt(2)*L/2), y0-round(sqrt(2)*L/2) + d+5, ‘0‘); OutTextXY(x0+L*2+5, y0-round(sqrt(2)*L/2) + d,‘x‘); OutTextXY(x0+round(sqrt(2)*L/2)+5, y0-round(sqrt(2)*L/2) - h - 10,‘y‘); OutTextXY(x0-round(L*sqrt(2)/4)+5, y0+round(sqrt(2)*L/4) + d,‘z‘);{ устанавливаем желтый цвет } setcolor(14);{ рисуем квадратное основание } MoveTo(x0,y0); SetLineStyle(1, 0, 2); { устанавливаем стиль линии (пунктирная) } LineTo(x0+round(sqrt(2)*L/2), y0-round(sqrt(2)*L/2)); LineTo(x0+round(sqrt(2)*L/2)+L, y0-round(sqrt(2)*L/2)); SetLineStyle(0, 0, 2); { устанавливаем стиль линии (обычная) } LineTo(x0+L, y0); LineTo(x0, y0);{ вершиной будем считать точку, которая проецируется с середину первого ребра} { рисуем все боковые ребра пирамиды (вершины квадрата, лежащего в основании) } MoveTo(x0+round(sqrt(2)*L/4), y0-round(sqrt(2)*L/4)-h); LineTo(x0, y0); MoveTo(x0+round(sqrt(2)*L/4), y0-round(sqrt(2)*L/4)-h); SetLineStyle(1, 0, 1); { устанавливаем стиль линии (пунктирная) } LineTo(x0+round(sqrt(2)*L/2), y0-round(sqrt(2)*L/2)); SetLineStyle(0, 0, 1); { устанавливаем стиль линии (обычная) } MoveTo(x0+round(sqrt(2)*L/4), y0-round(sqrt(2)*L/4)-h); LineTo(x0+round(sqrt(2)*L/2)+L, y0-round(sqrt(2)*L/2)); MoveTo(x0+round(sqrt(2)*L/4), y0-round(sqrt(2)*L/4)-h); LineTo(x0+L, y0);{ устанавливаем цвет } setcolor(12);{ рассчитываем точки, в которых сечение пересекает ребра пирамиды } dx := round(hs*L*sqrt(2)/4/h); { расстояние, на которое надо сдвинуться по оси Ox вправо относительно левой нижней точки основания пирамиды } dx1 := round( hs*L*sqrt(5)/2/h/sqrt(2) ); { расстояние, на которое надо сдвинуться по оси Ox влево относительно правой нижней точки основания пирамиды } L2 := L - round(dx1*cos(pi/6)) - dx; { длина стороны квадрата в сечении }{ рисуем сечение } xs := x0 + dx; { координата x левой нижней точки сечения } ys := y0 - dx - hs; { координата x левой нижней точки сечения } MoveTo(xs, ys ); LineTo(xs + L2, ys ); LineTo(xs + L2 + round(L2/sqrt(2)), ys - round(L2/sqrt(2))); SetLineStyle(1, 0, 1); { устанавливаем стиль линии (пунктирная) } LineTo(xs + round(L2/sqrt(2)), ys - round(L2/sqrt(2))); LineTo(xs, ys);{ заштриховываем сечение } SetLineStyle(0, 0, 2); { устанавливаем стиль линии (обычная, толщина = 2) } for i := 0 to (L2 div ds*2) div 2 do begin MoveTo(xs + ds*i, ys ); LineTo(xs + ds*i + round(L2/sqrt(2)), ys - round(L2/sqrt(2))); end; ReadLn;end.