![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Шушпанчик |
![]() ![]()
Сообщение
#1
|
Гость ![]() |
Вообщем задача сформулирована следующим образом:
"Написать программу нахождения площади поверхности пирамиды по координатам ее вершин. Подготовить и использовать процедуру определения площади треугольника по известным вершинам". Задача простенькая с математической и логической т.з., но вот как её описывать в паскале - напрочь забыто. Желательно использовать базовый инструментарий, такой как: линейные, разветвляющиеся и циклические алгоритмы, массивы, процедуры и функции. Заранее большое человеческое спасибо! :p2: |
Amro |
![]()
Сообщение
#2
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
А число вершин может быть любым??? т.е оно тоже задаётся?
-------------------- Закон иудеев: Семь раз отмерь, один отрежь.
Закон экономии: Семь раз отмерь, семь раз отрежь. Закон программиста: Семь раз отрежь, ошибся, отмерь. |
Amro |
![]()
Сообщение
#3
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
Процедуру вычисления площади треугольника по координатам его вершин мона сделать так (используя формулу Герона):
Код Procedure plosh (x1,y1,z1,x2,y2,z2,x3,y3,z3:real; var S:real;); var a,b,c,p:real begin a:=sqrt(sqr(y2-y3)+sqr(x2-x3)+sqr(z2-z3)); b:=sqrt(sqr(y1-y3)+sqr(x1-x3)+sqr(z1-z3)); c:=sqrt(sqr(y1-y2)+sqr(x1-x2)+sqr(z1-z2)); p:=(a+b+c)/2; S:=p*sqrt((p-a)*(p-b)*(p-c)); end; Если число вершин любое, тогда нужно находить всевозможные сочетания трёх вершин, посылать их координаты в процедуру и в основно части проги находить общую сумму!!! Сообщение отредактировано: Amro - -------------------- Закон иудеев: Семь раз отмерь, один отрежь.
Закон экономии: Семь раз отмерь, семь раз отрежь. Закон программиста: Семь раз отрежь, ошибся, отмерь. |
GoodWind |
![]()
Сообщение
#4
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Amro, если не ошибаюсь, пирамида - трехмерный объект, следовательно
Код a:=sqrt(sqr(y2-y3)+sqr(x2-x3)+sqr(z2-z3)); и т.д. -------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
Amro |
![]()
Сообщение
#5
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
GoodWind Так точно!!!! ошибочка вышла ... щас исправим!!!
-------------------- Закон иудеев: Семь раз отмерь, один отрежь.
Закон экономии: Семь раз отмерь, семь раз отрежь. Закон программиста: Семь раз отрежь, ошибся, отмерь. |
GoodWind |
![]()
Сообщение
#6
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Цитата Так точно!!!! ну не в армии же : ) а кол-во граней, если мне не изменяет склероз - (кол-во вершин-1) -------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
Amro |
![]()
Сообщение
#7
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
GoodWind
В принципе кол-во граней в этой задаче не требуется ![]() -------------------- Закон иудеев: Семь раз отмерь, один отрежь.
Закон экономии: Семь раз отмерь, семь раз отрежь. Закон программиста: Семь раз отрежь, ошибся, отмерь. |
GoodWind |
![]()
Сообщение
#8
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Цитата В принципе кол-во граней в этой задаче не требуется площадь трехмерной фигуры - сумма площадей всех её граней, значит для пирамиды это сумма площадей всех боковых граней + площадь дна -------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
Amro |
![]()
Сообщение
#9
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата площадь трехмерной фигуры - сумма площадей всех её граней, значит для пирамиды это сумма площадей всех боковых граней + площадь дна Ну это само собой!!! Просто я о чём хочу сказать?! Любую грань составляют три вершины пирамиды, если пирамида неправильная то площади граней разные! О дне: дно также можно разбить на треугольники, типа на мнимые грани .... т.е нам необходимо найти всевозможные сочетания вершин, как я уже писал, а площадь дна будет равна сумме площадей её составляющих треугольников к примеру у нас вершины А Б В Г Д Е Ж сочетания (ну это уже комбинаторика попёрла) АБВ БВГ ВГД ЕЖА ЕДГ и т.д это треугольники сумма площадей которых и есть площадь пирамиды............... Теперь как это реализовать??? -------------------- Закон иудеев: Семь раз отмерь, один отрежь.
Закон экономии: Семь раз отмерь, семь раз отрежь. Закон программиста: Семь раз отрежь, ошибся, отмерь. |
GoodWind |
![]()
Сообщение
#10
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Цитата Любую грань составляют три вершины пирамиды, если пирамида неправильная то площади граней разные! да, мой косяк...мне на ночь глядя показалось, что пирамида обязательно равнобедренная ![]() Цитата О дне: дно также можно разбить на треугольники, не можно, а в любом случае придется.... ![]() Цитата Теперь как это реализовать??? завтра подумаю, щас туплю уже... ээх.... надо было в школе стереометрию не прогуливать ![]() -------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
Amro |
![]()
Сообщение
#11
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 146 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ещё одно но о том же дне ... там мадо найти тоже определенные треугольники, т.е какие то сочетания вершин надо исключить, а то дно получится как паутина!!!!
-------------------- Закон иудеев: Семь раз отмерь, один отрежь.
Закон экономии: Семь раз отмерь, семь раз отрежь. Закон программиста: Семь раз отрежь, ошибся, отмерь. |
GoodWind |
![]()
Сообщение
#12
|
![]() Автооответчик ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 188 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
я думаю делить на две части, и каждую часть на 2 части, пока все вершины не окажутся задействованы.
сам прочитал, ниче не понял ![]() усё, спать пошел... -------------------- Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
|
Guest |
![]()
Сообщение
#13
|
Гость ![]() |
Ладно, делать нечего, придётся ради сохранения собственных нервных клеток сокращать сущности, а то так придётся из примитивной курсовой диссертацию писать. ;)
Вообщем попробуем сузить круг условий: пирамида имеет пять вершин. Но и тогда у меня возникают непонятки. Во-первых, если измерять площадь всех сочетаний, то тогда, как правильно сказал Amro, возникает перебор с количеством необходимых площадей. Как реализовывать правильную калькуляцию площадей краней? Во-вторых, как реализовывать выбор вершины, которая не лежит в основании. Наверное придётся тупо указывать z[2-4] значение, равное z[1]. Ну и вот собсно половина кода. Вторую половину, а именно как подсчитывать площадь я не знаю. Может подскажите? Код Var S: real; x: Array [1..5] of Real; y: Array [1..5] of Real; z: Array [1..5] of Real; i,n,m: Integer; {процедура вычисления площади треугольника} procedure plosh(x_1,y_1,z_1,x_2,y_2,z_2,x_3,y_3,z_3:real); var a,b,c,p,t:real; begin a:=sqrt(sqr(y_2-y_3)+sqr(x_2-x_3)+sqr(z_2-z_3)); b:=sqrt(sqr(y_1-y_3)+sqr(x_1-x_3)+sqr(z_1-z_3)); c:=sqrt(sqr(y_1-y_2)+sqr(x_1-x_2)+sqr(z_1-z_2)); p:=(a+b+c)/2; t:=p*sqrt((p-a)*(p-b)*(p-c)); end; {заносим в массив координаты вершин} for i:=1 to 5 do begin if i:=1 or 5 then begin write('X',i,' -> '); readln(x[i]); write('Y',i,' -> '); readln(y[i]); write('Z',i,' -> '); readln(z[i]); end; else begin write('X',i,' -> '); readln(x[i]); write('Y',i,' -> '); readln(y[i]); z[i]:=z[1] writeln; end; end; end; {начинаем перебор всех вариантов сочетания вершин, создающих треугольник} for i:=1 to 5 do for n:=1 to 5 do for m:=1 to 5 do begin if ((i<>n) and ((n<>m) and (i<>m))) then begin plosh(x[i],y[i],z[i],x[n],y[n],z[n],x[m],y[m],z[m]); end; end; |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Цитата Теперь как это реализовать??? Вот так: программа вычисляет площадь пирамиды при любом числе точек в основании (только для выпуклого основания; для невыпуклого - нужно проводить триангуляцию...) Код 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. |
Guest |
![]()
Сообщение
#15
|
Гость ![]() |
Вообщем вот полный код.
Проблема в одном : после процедуры в значениях выходят нули. var |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
можешь дать мне координаты всех вершин ?
|
zx1024 |
![]()
Сообщение
#17
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата s := s + Plosh(x[1], y[1], z[1], x[2], y[2], z[2], x[3], y[3], z[3]); s := s + Plosh(x[1], y[1], z[1], x[2], y[2], z[2], x[3], y[3], z[3]); - вот это больше похоже. |
zx1024 |
![]()
Сообщение
#18
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: ![]() ![]() ![]() |
После минутных размышлений...
Не всегда можно сразу сказать как расположены 4 точки (из 3D) на плоскости, которая по ним строится. Поэтому сначала надо составить из 4 точек два непересекающихся треугольника. |
Atos |
![]()
Сообщение
#19
|
![]() Прогрессор ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 602 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Была недавно в чём-то похожая тема http://pascal.net.ru/forum/index.php?showtopic=2717
А вообще-то в чём здесь проблема? Можно вычислять площадь опнования так: выделить первую же точку, а затем суммировать площади треугольников, получающихся перебором остальных вершин. То есть одной из вершин всех треугольников будет выбранная точка, другой - i-я точка, третьей - (i+1)я точка . И увеличиваем i от 2 до (basicPoints-1) |
volvo |
![]()
Сообщение
#20
|
Гость ![]() |
Так в случае выпуклого основания проблемы нет. А вот если многоугольник в основании НЕвыпуклый -
![]() А может быть в основании пирамиды может быть только выпуклый многоугольник? Сообщение отредактировано: volvo - |
![]() ![]() |
![]() |
Текстовая версия | 9.09.2025 7:29 |