1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
| Шушпанчик |
19.10.2004 18:03
Сообщение
#1
|
|
Гость |
Вообщем задача сформулирована следующим образом:
"Написать программу нахождения площади поверхности пирамиды по координатам ее вершин. Подготовить и использовать процедуру определения площади треугольника по известным вершинам". Задача простенькая с математической и логической т.з., но вот как её описывать в паскале - напрочь забыто. Желательно использовать базовый инструментарий, такой как: линейные, разветвляющиеся и циклические алгоритмы, массивы, процедуры и функции. Заранее большое человеческое спасибо! :p2: |
![]() ![]() |
| volvo |
20.10.2004 0:11
Сообщение
#2
|
|
Гость |
Цитата Теперь как это реализовать??? Вот так: программа вычисляет площадь пирамиды при любом числе точек в основании (только для выпуклого основания; для невыпуклого - нужно проводить триангуляцию...) Код Const { Это число точек в основании } basisPoints = 4; Epsilon = 0.0001; Type { Описываем тип Точка - с тремя координатами } TAxis = (axisX, axisY, axisZ); TPoint = Record Case Boolean Of True : (x, y, z: Real); False: (arr: Array[TAxis] Of Real); End; { и тип Пирамида - с основанием (basis) и отдельной точкой (other)} TPyramide = Record basis: Array[1 .. basisPoints] Of TPoint; other: TPoint; End; Var pyramide: TPyramide; { Площадь треугольника вычисляем по формуле Герона, но сам треугольник задаем не отдельными координатами, а вершинами } Function Plosh(p1, p2, p3: TPoint): Real; Var a, b, c, p: Real; Begin a:=sqrt(sqr(p2.y-p3.y)+sqr(p2.x-p3.x)+sqr(p2.z-p3.z)); b:=sqrt(sqr(p1.y-p3.y)+sqr(p1.x-p3.x)+sqr(p1.z-p3.z)); c:=sqrt(sqr(p1.y-p2.y)+sqr(p1.x-p2.x)+sqr(p1.z-p2.z)); p:=(a + b + c)/2; Plosh := Sqrt(p*(p-a)*(p-b)*(p-c)) End; Procedure SwapReal( Var a, b: Real ); Var T: Real; Begin T := a; a := b; b := T; End; Procedure SwapInt( Var a, b: Integer ); Var T: Integer; Begin T := a; a := b; b := T; End; { Эта процедура распределяет номера вершинам основания } Procedure CheckPolygon; Function isAxisEqual(axis: TAxis): Boolean; Var i: Integer; value: Real; Begin isAxisEqual := False; value := pyramide.basis[1].arr[axis]; For i := 2 To basisPoints Do If Abs(pyramide.basis[i].arr[axis] - value) > Epsilon Then Exit; isAxisEqual := True; End; Var mainAxisX, mainAxisY: TAxis; angle: Array[1 .. basisPoints] Of Real; DynamicArr: Array[1 .. basisPoints] Of TPoint; indexes: Array[1 .. basisPoints] Of Integer; max, minX: Real; i, j, maxIndex, minIndex: Integer; changed: Boolean; Begin MainAxisX := axisX; MainAxisY := axisY; If isAxisEqual( axisY ) Then MainAxisY := AxisZ Else If isAxisEqual( axisX ) Then Begin MainAxisX := axisY; MainAxisY := axisZ; End; minX := maxInt; For i := 1 To basisPoints Do If minX > pyramide.basis[i].X Then Begin minX := pyramide.basis[i].X; minIndex := i End; indexes[1] := minIndex; j := 0; For i := 2 To basisPoints Do Begin Inc(j); If j = minIndex Then Inc(j); indexes[i] := j; End; For i := 1 To basisPoints Do If i <> minIndex Then Begin If (pyramide.basis[i].arr[mainAxisY] - pyramide.basis[minIndex].arr[MainAxisY]) = 0 Then angle[i] := 0 Else angle[i] := ArcTan((pyramide.basis[i].arr[MainAxisX]-pyramide.basis[minIndex].arr[MainAxisX])/ (pyramide.basis[i].arr[MainAxisY]-pyramide.basis[minIndex].arr[MainAxisY]))* (180 / Pi); End; For i := 2 To basisPoints Do Begin changed := False; max := angle[i]; For j := i To basisPoints Do If max < angle[j] Then Begin max := angle[j]; maxIndex := j; changed := True; End; If changed Then Begin SwapInt(indexes[maxIndex], indexes[i]); SwapReal(angle[maxIndex], angle[i]) End; End; For i := 1 To basisPoints Do Move( pyramide.basis[ indexes[i] ], DynamicArr[i], SizeOf(TPoint) ); Move( DynamicArr, pyramide.basis, basisPoints*SizeOf(TPoint) ); End; Var s: Real; i, j: Integer; Begin { заносим в массив координаты вершин основания пирамиды } For i := 1 To basisPoints Do With pyramide.basis[i] Do Begin WriteLn( 'Вершина основания #', i ); Write( 'X = ' ); ReadLn(X); Write( 'Y = ' ); ReadLn(Y); Write( 'Z = ' ); ReadLn(Z); End; WriteLn( 'Верхняя точка пирамиды:' ); With pyramide.other Do Begin Write( 'X = ' ); ReadLn(X); Write( 'Y = ' ); ReadLn(Y); Write( 'Z = ' ); ReadLn(Z); End; { Устанавливает порядок прохождения вершин основания } CheckPolygon; s := 0; For i := 1 To basisPoints Do With pyramide Do Begin { считаем сумму площадей боковых граней } If i <> basisPoints Then j := Succ(i) Else j := 1; s := s + Plosh(basis[i], basis[j], other); End; { Этот способ нахождения площади основания - для тех оснований, которые являются выпуклыми многоугольниками из basisPoints вершин } For i := 2 To Pred(basisPoints) Do s := s + Plosh(pyramide.basis[1], pyramide.basis[i], pyramide.basis[Succ(i)]); WriteLn( 'Площадь пирамиды s = ', s:10:3 ) End. |
Шушпанчик Найти площадь пирамиды 19.10.2004 18:03
Amro А число вершин может быть любым??? т.е оно тоже за... 19.10.2004 18:27
Amro Процедуру вычисления площади треугольника по коорд... 19.10.2004 18:39
GoodWind Amro, если не ошибаюсь, пирамида - трехмерный объе... 19.10.2004 18:48
Amro GoodWind Так точно!!!! ошибочка вы... 19.10.2004 18:55
GoodWind
ну не в армии же : )
а кол-во граней, если мне не... 19.10.2004 19:03
Amro GoodWind
В принципе кол-во граней в этой задаче н... 19.10.2004 19:08
GoodWind
площадь трехмерной фигуры - сумма площадей всех е... 19.10.2004 19:55
Amro
Ну это само собой!!!
Просто я о чём ... 19.10.2004 20:12
GoodWind
да, мой косяк...мне на ночь глядя показалось, что... 19.10.2004 20:28
Amro Ещё одно но о том же дне ... там мадо найти тоже ... 19.10.2004 20:36
GoodWind я думаю делить на две части, и каждую часть на 2 ч... 19.10.2004 20:40
Guest Ладно, делать нечего, придётся ради сохранения соб... 19.10.2004 21:25
Guest Вообщем вот полный код.
Проблема в одном : после ... 20.10.2004 13:54
volvo можешь дать мне координаты всех вершин ? 20.10.2004 14:02
zx1024 Это не площадь 4-угольника.
s := s + Plosh(x[1], ... 20.10.2004 14:33
zx1024 После минутных размышлений...
Не всегда можно сраз... 20.10.2004 14:44
Atos Была недавно в чём-то похожая тема http://pascalne... 20.10.2004 14:55
volvo Так в случае выпуклого основания проблемы нет. А в... 20.10.2004 14:58
Atos Наверное, следует уточнить условие... Имхо, всё-та... 20.10.2004 15:13
Amro
Видать придётся!!!
Вообщето другого ... 20.10.2004 15:14
volvo
Если это действительно только выпуклый многоугол... 20.10.2004 15:31
zx1024
Только задавать вершины основания придётся в одно... 20.10.2004 23:21
volvo zx1024
Мне это казалось само собой разумеющимся...... 20.10.2004 23:34
Amro volvo Гений!!! Админы должны прибавлят... 20.10.2004 23:49
Guest volvo:
ну к примеру я взял такие :
1 - (1,1,1);
2... 21.10.2004 9:39
volvo Сделал динамическое распределение вершин... Програ... 21.10.2004 12:23![]() ![]() |
|
Текстовая версия | 13.12.2025 17:00 |