Показать сообщение отдельно
Старый 04.06.2011, 15:21   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ну, вообще-то, ежели без аксонометрии, то не так уж это и сложно. На верхнем рисунке изображен произвольный прямоугольник, лежащий в основании призмы. Пусть секущая плоскость проходит через ребро АВ. Систему координат XYZ выберем так: Х параллелен ребру АВ, Y перпендикулярна X, тоже лежит в плоскости рисунка и смотрит вниз, Z (направление боковых ребер призмы) перпендикулярна плоскости рисунка и смотрит на нас. Все размеры при расчете заданы в пикселах графического DOS-экрана (640х480). Если за начало координат принять, как обычно, левый верхний угол экрана, то координаты вершин четырехугольника XY будут: A(100,150), B(200,150), C(240,50) и D(70,100). Так мне захотелось. Координаты вспомогательных точек E и F будут E(70,150) и F(240,150).
Теперь найдем координаты Z точек пересечения плоскости с боковыми ребрами, проходящими через C и D. Обозначим эти точки пересечения С1 и D1. Координаты составят ZC1=CF*tg30°, ZD1=DE*tg30°.
Осталось теперь путем простейших манипуляций с теоремой Пифагора построить фигуру, лежащую в секущей плоскости. Что и сделано (нижний рисунок).
Код:
Uses Graph, CRT;
VAR
 ZD,ZC:Real;

Function Tan(x:Real):Real;
begin
 Tan:=Sin(x)/Cos(x);
end;

BEGIN
 InitGraph(..);{ПАРАМЕТРЫ ФУНКЦИИ ПОДСТАВЬТЕ САМИ}   
 
 SetLineStyle(SolidLn,0,ThickWidth);
 Line(100,150,70,100);
 Line(70,100,240,50);
 Line(240,50,200,150);
 Line(200,150,100,150);
 SetLineStyle(SolidLn,0,NormWidth);
 Line(50,150,100,150);
 Line(200,150,260,150);
 SetLineStyle(DottedLn,0,NormWidth);
 Line(70,100,70,150);
 Line(240,50,240,150);
 SetTextJustify(CenterText,TopText);
 OutTextXY(70,155,'E');
 OutTextXY(100,155,'A');
 OutTextXY(200,155,'B');
 OutTextXY(240,155,'F');
 SetTextJustify(RightText,CenterText);
 OutTextXY(65,100,'D');
 SetTextJustify(LeftText,CenterText);
 OutTextXY(245,50,'C');

 ZC:=100*tan(Pi/6);
 ZD:=50*tan(Pi/6);
 SetLineStyle(SolidLn,0,ThickWidth);
 Line(100,400,70,400-Round(SQRT(SQR(50)+SQR(ZD))));
 Line(70,400-Round(SQRT(SQR(50)+SQR(ZD))),240,
                 400-Round(SQRT(SQR(100)+SQR(ZC))));
 Line(240,400-Round(SQRT(SQR(100)+SQR(ZC))),200,400);
 Line(200,400,100,400);
 SetTextJustify(CenterText,TopText);
 OutTextXY(100,405,'A');
 OutTextXY(200,405,'B');
 SetTextJustify(RightText,CenterText);
 OutTextXY(65,400-Round(SQRT(SQR(50)+SQR(ZD))),'D1');
 SetTextJustify(LeftText,CenterText);
 OutTextXY(245,400-Round(SQRT(SQR(100)+SQR(ZC))),'C1');
 SetFillStyle(3,white);
 FloodFill(150,350,white);
 ReadKey;
 CloseGraph;
END.
Если у Вас Windows-Pascal и рисование идет черным по белому, то в SetFillStyle и FloodFill нужно, вероятно, заменить white на black.
Изображения
 
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070