Тема: Универсальные формулы

Формула для вычисления площади сложной фигуры по координатам точек выглядит следующим образом:
S=0.5[(X2Y1-X1Y2) + (X3Y2-X2Y3) + (X4Y3-X3Y4) +.....+ (X{n}Y{n-1}-X{n-1}Y{n}) + (X1Yn-XnY1)]
А существуют ли формулы для вычисления по координатам точек:
1) Объёма сложной фигуры
2) Центра тяжести плоской фигуры
3) Центра тяжести объёмной фигуры?
Где можно почитать литературу на эту тему?

Re: Универсальные формулы

Интересно, а эта формула для фигуры ограниченной прямыми линиями? Просто в AutoCad е есть фигуры ограниченные арками и сплайнами, как быть?
Может быть Вам поставть на этом форуме задачу, которую можно решить AutoCad овскими способами? О том же центре масс?

Re: Универсальные формулы

Вычислить площадь сложной фигуры по прямым измерениям (поперечное сечение грудной клетки детей), например, периметр правой и левой ее половин, толщина грудины, линейные размеры и т.д. с последующим расчетом центра масс (для начала - геометрического центра) для расчета моментов сил, виновных за ротацию позвонков при сколиозе. Маргарита Ивановна,  76 Интернат детей с заболеванием опорно-двигательного аппарата, Москва  Заранее благодарю за помощь.

Re: Универсальные формулы

Народ! Люди! Человеки! Помочь Маргарите Ивановне - святое дело. Предлагаю организовать широкое обсуждение.

Re: Универсальные формулы

Данная формула работает без ошибок для прямых. Вот пример кода:

   'Вычислить площадь по формуле:
   'S=0.5[(X2Y1-X1Y2) + (X3Y2-X2Y3) + (X4Y3-X3Y4) +.....+ (X{n}Y{n-1}-X{n-1}Y{n}) + (X1Yn-XnY1)]
   For intНомТочки = 1 To intКолвоТочек - 1
      vТочка1 = colТочкиКонтура(intНомТочки)
      vТочка2 = colТочкиКонтура(intНомТочки + 1)
      dblСлагаемое = vТочка2(0) * vТочка1(1) - vТочка1(0) * vТочка2(1)
      dblПлощадь = dblПлощадь + dblСлагаемое
   Next intНомТочки
   dblПлощадь = dblПлощадь / 2
   MsgBox "Площадь контура = " & dblПлощадь, vbInformation, strНазваниеПрограммы

Помогите решить проблему нахождения таким же не сложным способом центра тяжести фигуры ограниченной прямыми!!!!! Или дайте пожалуйста ссылку на сайты где об этом можно почитать. Помогите пожалуйста.

Re: Универсальные формулы

Эврика!
Я нашёл формулы вычисления координат центра тяжести плоской фигуры на основе формулы вычисления площади:

     [(X2-X1)/2*(X2Y1-X1Y2)+(X3-X2)/2*(X3Y2-X2Y3)+(X4-X3)/2*(X4Y3-X3Y4)+...+(X{n}-X{n-1})/2*(X{n}Y{n-1}-X{n-1}Y{n})+(Xn-X1)/2*(X1Yn-XnY1)]
Xцт=---------------------------------------------------------------------------------------------------------------------------------------
                       1.5*[(X2Y1-X1Y2) + (X3Y2-X2Y3) + (X4Y3-X3Y4) +...+ (X{n}Y{n-1}-X{n-1}Y{n}) + (X1Yn-XnY1)]
     [(Y2-Y1)/2*(X2Y1-X1Y2)+(Y3-Y2)/2*(X3Y2-X2Y3)+(Y4-Y3)/2*(X4Y3-X3Y4)+...+(Y{n}-Y{n-1})/2*(X{n}Y{n-1}-X{n-1}Y{n})+(Yn-Y1)/2*(X1Yn-XnY1)]
Yцт=---------------------------------------------------------------------------------------------------------------------------------------
                       1.5*[(X2Y1-X1Y2) + (X3Y2-X2Y3) + (X4Y3-X3Y4) +...+ (X{n}Y{n-1}-X{n-1}Y{n}) + (X1Yn-XnY1)]

Площадь фигуры вычисляется по формуле:
S=0.5[(X2Y1-X1Y2) + (X3Y2-X2Y3) + (X4Y3-X3Y4) +.....+ (X{n}Y{n-1}-X{n-1}Y{n}) + (X1Yn-XnY1)]
Следующий код на моём любимом языке VBA замечательно работает:

'Вычислить площадь по формуле:
'S=0.5[(X2Y1-X1Y2) + (X3Y2-X2Y3) + (X4Y3-X3Y4) +.....+ (X{n}Y{n-1}-X{n-1}Y{n}) + (X1Yn-XnY1)]
'Вычислить координаты центра тяжести по формулам:
'     [(X2-X1)/2*(X2Y1-X1Y2)+(X3-X2)/2*(X3Y2-X2Y3)+(X4-X3)/2*(X4Y3-X3Y4)+...+(X{n}-X{n-1})/2*(X{n}Y{n-1}-X{n-1}Y{n})+(Xn-X1)/2*(X1Yn-XnY1)]
'Xцт=---------------------------------------------------------------------------------------------------------------------------------------
'                       1.5*[(X2Y1-X1Y2) + (X3Y2-X2Y3) + (X4Y3-X3Y4) +...+ (X{n}Y{n-1}-X{n-1}Y{n}) + (X1Yn-XnY1)]
'
'     [(Y2-Y1)/2*(X2Y1-X1Y2)+(Y3-Y2)/2*(X3Y2-X2Y3)+(Y4-Y3)/2*(X4Y3-X3Y4)+...+(Y{n}-Y{n-1})/2*(X{n}Y{n-1}-X{n-1}Y{n})+(Yn-Y1)/2*(X1Yn-XnY1)]
'Yцт=---------------------------------------------------------------------------------------------------------------------------------------
'                       1.5*[(X2Y1-X1Y2) + (X3Y2-X2Y3) + (X4Y3-X3Y4) +...+ (X{n}Y{n-1}-X{n-1}Y{n}) + (X1Yn-XnY1)]
'Коллекция colТочкиКонтура состоит из точек n+1, т.е. замыкается начальной точкой
   dblСуммаX = 0: dblСуммаY = 0
   For intНомТочки = 1 To intКолвоТочек - 1
      vТочка1 = colТочкиКонтура(intНомТочки)
      vТочка2 = colТочкиКонтура(intНомТочки + 1)
      dblСлагаемое = vТочка2(0) * vТочка1(1) - vТочка1(0) * vТочка2(1)
      dblПлощадь = dblПлощадь + dblСлагаемое
      dblСуммаX = dblСуммаX + (vТочка1(0) + vТочка2(0)) / 2 * dblСлагаемое
      dblСуммаY = dblСуммаY + (vТочка1(1) + vТочка2(1)) / 2 * dblСлагаемое
   Next intНомТочки
   dblX = dblСуммаX / (1.5 * dblПлощадь)
   dblY = dblСуммаY / (1.5 * dblПлощадь)
   dblПлощадь = dblПлощадь / 2
   TextBox2_Площадь = CStr(dblПлощадь)
   TextBox3_Xцт = CStr(dblX)
   TextBox4_Yцт = CStr(dblY)
   MsgBox "Площадь контура = " & dblПлощадь & vbLf & vbLf & _
          "X ц.т.=" & dblX & vbLf & vbLf & _
          "Y ц.т.=" & dblY, vbInformation, strНазваниеПрограммы

Проверьте сами.
Теперь осталось понять как вычислять объём трёхмерной фигуры и координаты её центра тяжести.
Помогайте!

Re: Универсальные формулы

Мне как бы всё понятно если бы это дело обсуждалось например в форуме екселя.... Но други мои, что могет быть проще в автокаде!!! нарисовал регион, посмотрел свойства и все дела... какое програмирование?!
по поводу нахождения всего для 3Д тел... Та же фигня... строим и смотрим свойства...
Зачем такое вот мозгоклюйство?

Re: Универсальные формулы

Повтор ssn с небольшими дополнениями:
1. Строится либо область (region), либо 3D-тело (с использованием union, substract etc).
2. Дается команда _massprop и выделяется этот объект.
3. В текстовом окне списком будет выдано большое количество информации в текущих единицах чертежа (_units). В частности, площадь, периметр (для плоских фигур), объем (для объема), центр масс (для того и для другого) и т.п.
---
ИМХО

Re: Универсальные формулы

Как определить площадь произвольной фигуры, построенной различными сегментами (дугой, линиями), используя средствами AutoCAD (LIST или area)? Или подскажите где найти такую информацию.

Re: Универсальные формулы

> Vera
Будьте немного по-внимательней.
kpblc уже ответил на Ваш вопрос, нужно создать REGION и узнать его площадь с помощью команды LIST.

Re: Универсальные формулы

У меня получилась формула вычисления момента инерции любого контура ограниченого прямыми:

Public Function ВычислитьМоментИнерцииКонтура(vТочкиКонтура As Variant) As Double
'Подпрограмма вычисляет момент инерции контура относительно оси OY
'У контура начальные и конечные точки должны совпадать
Dim dblb As Double, dblh1 As Double, dblh2 As Double
Dim dblJ01 As Double, dblJ02 As Double, dblF1 As Double, dblF2 As Double
Dim dblYцт1 As Double, dblYцт2 As Double, dblJсум As Double
Dim intНомТочки As Integer, vТочка1 As Variant, vТочка2 As Variant
On Error GoTo ОбработкаОшибок
   For intНомТочки = 1 To vТочкиКонтура.Count - 1
      vТочка1 = vТочкиКонтура(intНомТочки)
      vТочка2 = vТочкиКонтура(intНомТочки + 1)
      dblb = vТочка2(0) - vТочка1(0)
      dblh1 = vТочка1(1): dblh2 = vТочка2(1) - vТочка1(1)
      dblJ01 = dblb * dblh1 ^ 3 / 12
      dblJ02 = dblb * dblh2 ^ 3 / 36
      dblF1 = dblb * dblh1
      dblF2 = dblb * dblh2 / 2
      dblYцт1 = dblh1 / 2
      dblYцт2 = dblh1 + dblh2 / 3
      dblJсум = dblJсум + dblJ01 + dblF1 * dblYцт1 ^ 2 + dblJ02 + dblF2 * dblYцт2 ^ 2
   Next intНомТочки
   ВычислитьМоментИнерцииКонтура = dblJсум
   Exit Function
ОбработкаОшибок:
Dim strСообщениеОбОшибке As String
   strСообщениеОбОшибке = "При вычислении момента инерции контура произошла непредвиденная ошибка!"
   MsgBox strСообщениеОбОшибке & vbLf & vbLf & _
          "Название ошибки: " & Err.Description & vbLf & vbLf & _
          "Номер ошибки = " & Err.Number, vbExclamation, gstrНазваниеПрограммы
   If gblnПризнакЗаписиВЛогФайл Then
      gobjЛогФайл.ДобавитьСообщениеОбОшибке strСообщениеОбОшибке, Err.Number, Err.Description
   End If
   Resume Next
End Function

Это для помощи детям при сколиозе Маргарите Ивановне> Кожевникова Маргарита Ивановна (2004-11-25 18:32:30)
Формула как мне кажется работает иногда точнее чем команда _massprop AutoCAD.

Re: Универсальные формулы

Извините в предыдущей подпрограмме получилась ошибка вместо OY надо писать OX, а вот подпрограмма вычисления момента инерции относительно горизонтальной центральной оси OX:

Public Function ВычислитьМоментИнерцииКонтура(vТочкиКонтура As Variant) As Double
'Подпрограмма вычисляет момент инерции контура относительно горизонтальной
'центральной оси OX проходящей через точку ЦТ контура
'У контура начальные и конечные точки должны совпадать
'Чтобы момент инерции был положительным точки контура должны быть указаны по часовой стрелке
Dim dblb As Double, dblh1 As Double, dblh2 As Double
Dim dblJ01 As Double, dblJ02 As Double, dblF1 As Double, dblF2 As Double
Dim dblYцт1 As Double, dblYцт2 As Double, dblJсум As Double
Dim intНомТочки As Integer, vТочка1 As Variant, vТочка2 As Variant
Dim dblF As Double, dblСуммаY As Double, dblСлагаемое, dblYцт As Double
On Error GoTo ОбработкаОшибок
   For intНомТочки = 1 To vТочкиКонтура.Count - 1
      vТочка1 = vТочкиКонтура(intНомТочки)
      vТочка2 = vТочкиКонтура(intНомТочки + 1)
      dblСлагаемое = vТочка2(0) * vТочка1(1) - vТочка1(0) * vТочка2(1)
      dblF = dblF + dblСлагаемое
      dblСуммаY = dblСуммаY + (vТочка1(1) + vТочка2(1)) / 2 * dblСлагаемое
      dblb = vТочка2(0) - vТочка1(0)
      dblh1 = vТочка1(1): dblh2 = vТочка2(1) - vТочка1(1)
      dblJ01 = dblb * dblh1 ^ 3 / 12
      dblJ02 = dblb * dblh2 ^ 3 / 36
      dblF1 = dblb * dblh1
      dblF2 = dblb * dblh2 / 2
      dblYцт1 = dblh1 / 2
      dblYцт2 = dblh1 + dblh2 / 3
      dblJсум = dblJсум + dblJ01 + dblF1 * dblYцт1 ^ 2 + dblJ02 + dblF2 * dblYцт2 ^ 2
   Next intНомТочки
   dblYцт = dblСуммаY / (1.5 * dblF)
   dblF = dblF / 2
   ВычислитьМоментИнерцииКонтура = dblJсум - dblYцт ^ 2 * dblF
   Exit Function
ОбработкаОшибок:
Dim strСообщениеОбОшибке As String
   strСообщениеОбОшибке = "При вычислении момента инерции контура произошла непредвиденная ошибка!"
   MsgBox strСообщениеОбОшибке & vbLf & vbLf & _
          "Название ошибки: " & Err.Description & vbLf & vbLf & _
          "Номер ошибки = " & Err.Number, vbExclamation, gstrНазваниеПрограммы
   If gblnПризнакЗаписиВЛогФайл Then
      gobjЛогФайл.ДобавитьСообщениеОбОшибке strСообщениеОбОшибке, Err.Number, Err.Description
   End If
   Resume Next
End Function

Всё для помощи детям.