Консультация № 136554
12.05.2008, 21:46
30.00 руб.
0 4 2
Сдравствуйте уважаемые эксперты! Помогите пожалуйста с задачей : нужно написать программу, которая бы выдавала на экране пирамиду с квадратным основанием. Основание пирамиды параллельно плоскости XOZ. Одна из граней параллельна оси OZ. При этом, чтоб в пирамиде было заштрихованое сечение параллельное основанию. (Параметры задаваемые пользователем: h - высота пирамиды, hs - расстояние от основания до сечения, d - расстояние от плоскости XOZ до основания).
Зарание спасибо!

Обсуждение

давно
Старший Модератор
31795
6196
14.05.2008, 16:34
общий
это ответ
Здравствуйте, Якушев Алексей Павлович!

Программа в приложении. Выводятся оси координат, пирамида и сечение.
Один из углов основания пирамиды находится на оси ОY.
Удачи!

Приложение:
uses Graph,Crt;const a=5;{сторона основания пирамиды} k=15;{коэфициэнт}var a_x,a_y,b_x,b_y,c_x,c_y,d_x,d_y,e_x,e_y:integer;{координаты пирамиды} f_x,f_y,g_x,g_y,h_x,h_y,i_x,i_y:integer;{координаты сечения} d,h,hs,x_m,y_m:integer;{вводимые значения и размер экрана } x_y:real;{отношение размеров экрана}begin {вводим значения} write(‘h :‘);readln(h); write(‘hs:‘);readln(hs); write(‘d :‘);readln(d); {переходим в графический режим} x_m:=detect; InitGraph(x_m,y_m,‘‘); if GraphResult<>GrOk then Halt(1); {получаем размер экрана} x_m:=GetMaxX; y_m:=GetMaxY; x_y:=x_m/y_m; {считаем точки основания пирамиды} a_x:= x_m div 2; a_y:= y_m div 2; b_x:=a_x - k*round(a*x_y); b_y:=a_y + k*a+round(a / x_y); c_x:=b_x + k*round(a * x_y * x_y); c_y:=b_y; d_x:=a_x + k*round(a * x_y * x_y); d_y:=a_y; {считаем вершину пирамиды} e_x:=a_x + (abs(a_x - c_x) div 2); e_y:=a_y + (abs(a_y - c_y) div 2) -k*h; {считаем точки сечения} f_x:=e_x - round((h-hs)*(abs(a_x-c_x)div 2)/h); f_y:=e_y + k * (h - hs) - round((h-hs)*(abs(a_y-c_y)div 2)/h); g_x:=e_x - round(((h-hs)*(abs(b_x-d_x)div 2)/h)) ; g_y:=e_y + k * (h - hs) + round((h-hs)*(abs(b_y-d_y)div 2)/h); h_x:=e_x + round((h-hs)*(abs(a_x-c_x)div 2)/h); h_y:=e_y + k * (h - hs)+round((h-hs)*(abs(a_y-c_y)div 2)/h); i_x:=e_x + round(((h-hs)*(abs(b_x-d_x)div 2)/h)); i_y:=e_y + k * (h - hs) - round((h-hs)*(abs(b_y-d_y)div 2)/h); {выводим координатные оси} SetColor(1); MoveTo(a_x,a_y+k*d); LineRel(0,-3*k*a); MoveTo(a_x,a_y+k*d); LineRel(3*k*a,0); MoveTo(a_x,a_y+k*d); LineRel(-3*k*a,round(3*k*a/x_y)); {выводим координатную сетку по осям} for h:=0 to 3*a do begin SetColor(2); Circle(a_x,a_y+(d-h)*k,1); Circle(a_x+h*k,a_y+k*d,1); Circle(a_x-h*k,a_y+k*d+(round(k*h/x_y)),1);{} end; {выводим задний план пирамиды, который будет закрашиватся} SetColor(15); MoveTo(b_x,b_y); LineTo(a_x,a_y); lineTo(e_x,e_y); lineTo(d_x,d_y); LineTo(a_x,a_y); {выводим сечение и закрашиваем его} SetColor(13); MoveTo(f_x,f_y); LineTo(g_x,g_y); LineTo(h_x,h_y); LineTo(i_x,i_y); LineTo(f_x,f_y); SetFillStyle(5,13); FloodFill(f_x+5,f_y+5,13); {выводим передний план пирамиды} SetColor(15); MoveTo(d_x,d_y); LineTo(c_x,c_y); LineTo(b_x,b_y); LineTo(e_x,e_y); LineTo(c_x,c_y); {подписываем оси координат} OutTextXY(a_x-k,k*(1+d),‘Y‘); OutTextXY(a_x+3*k*a,a_y+k*(1+d),‘X‘); OutTextXY(a_x-3*a*k,a_y+k*round((d+3*a)/x_y),‘Z‘); {любуемся} ReadKey; CloseGraph;end.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
14.05.2008, 16:35
общий
Если будут вопросы, то обращайтесь сюда.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
14.05.2008, 16:49
общий
Вот такая <a href=http://rusfaq.ru/upload/665>картинка</a> у меня получилась.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
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.
Форма ответа