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

Формирвания линейчатого тела "грань-грань" в диалоге
можно выполнить, например, по следующей схеме:

1) задать в CorelDraw сразу  две линии справа и слева.
2) Импортировать в "Вектор" обе линии из одного файла .dxf.
3) Сделать дубли первой линии и поместить в группу (1-я группа линий).
4) Сделать дубли второй линии и поместить в группу (2-я группа линий).
5) Сделать разброс линии по z в той и другой группах.
6) Задать полиповрхности в той и другой группах.
7) Задать линейчатое тело.

Чтобы сформировать грани для тела "грань-грань" в МК импортировали правую и левую линии (образующие) по отдельности и далее по отдельности сделали правую полиповерхность и левую, и только затем,  линейчатое тело.

Рис. Для задания данного тела* были импортированы (по отдельности) две образующие, которые были сначала размножены (с помощью операции "dubl"  см. МК), затем помещены в группы, где разбросаны в направлении оси z с шагом равным 1, далее по линиям построены полиповерхности  (при t=0 и t=1) и только после этого задано (в диалоге) линейчатое тело. Задание граней тела через полиповерхности имеет большое значение для моделирования судовых помещений и их расчетов.
*Примечание. Данное тело было бы проще задать через ближнюю и заднюю грани (см. рис. ниже и МК), однако в этом случае не было бы примера формирования линейчатого тела через полиповерхности.

Рассмотрим примеры формирования носовой и кормовой частей корпуса судна через импортируемые линии, подготовленные в CorelDraw.


Генерирование носовой МК и кормовой МК частей корпуса судна по КВЛ

1) Сначала импортируем MK линии (шпангоуты полукорпуса), подготовленные в CorelDraw или AutoCad в формате .dxf




2) Строим полиповерхности
 
Каркас  на кормовую и носовую части судна


3) Через две грани строим линейчатое тело

 
Носовая часть каркас и как тело
 
"Тело" и каркас  кормовой  части  корпуса судна

Можно строить тело и по преобразованным полиповерхностям (в том числе и в МК) строить линейчатое тело

   
Примечание. Верхняя и нижняя грани выше тела строились с ошибкой, которая исправлена (см. рис. ниже)


Две исходные грани квадратичные поверхности

Формирования линий контура для квадратичных граней в МК.

Метода формирования квадратичной поверхности пока нет, поэтому строим их в диалоге (см. меню) по следующей схеме:
1) Открываем МК задания линий контура. В стркутуре появляются 8 линий. Первая 4-ка линии для правой поверхности, вторая 4-ка линии - для левой поверхности.
2) Задаем квадратичные поверхности.
3) По квадратичным граням строим линейчатое тело (меню).
   
На рис. представлено тело, построенное по двум граням - квадратичным поверхностям.
  
В телах "грань-грань" можно удалять грани, менять яркость внешей и внутренней частей, задавать  каркас.


 

Исследования задания линейчатого тела с помощью МК (выполнялись до реализации подхода в диалоге - см. выше)


1. Проектирование линейчатого тела "грань-грань"
Пусть заданы (см. МК) правая и левая грани (при t=0 и t=1)

   
Поверхности 4-х боковых граней (верх, низ, дальняя, ближняя) формируем по линейному закону, т.е. все они линейчатые поверхности, которые строятся (в МК) через методы .
Вот полученное тело между двумя гранями, у которого 4 боковых грани  линейчатые поверхности
поверхности

 Чтобы грани были изображены яркой стороной, порядок задание ребер для линейчатых поверхностей в МК кое-где изменен.

В системе "Вектор" (см. меню), чтобы изменить яркость (внутренность на внешность и наоборот), надо порядок задания граней (t0-поверхность и t1-поверхность) поменять местами.


Задание тела: "грань-плоскость"

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

Решение. Для построения проекции точки не плоскость используем метод построения точки на плоскости на наикратчаешем расстоянии от заданной:
Set G2 = PointPointPlane (p71, p72, p73, G1)
Массив проекций точек формируем в полилинии - линий контура второй  (t=1) грани. Определив таким образом линии контура, задача сводится к первой - построение линейчатого тела "грань-грань"
Или другой пример (МК). Построить линейчатое тело "Грань-плоскость", где поверхность взята из примера 1, а плоскость yz.
  
На первом рисунке показана проекция линии u0 на плоскость yz. Также строим проеции линии u1 и v0, v1
Следующий шаг - формирование 5 поверхностей (противоположной первой - на плоскости и 4-х боковушек)
  



Для расчетов (структурированного представления объема тела в виде тетраэдров), грани обозначим так:

Грань  Gr_u1 находится снизу и ее не видно

Перед тем как перейти к вычислению площади граней, объема и центра тяжести тел, выполним разбивку граней на 4-угольники и треугольники; тел на 8-гранники.

1) Триангуляция и вычисление площади граней (поверхности)

Алгоритм решения. Двигаясь по поверхности (МК), вичисляем 4 точки, образующих 4-угольник или два треугольника:
z0= f(u,v)
z1= f(u,0)
z2= f(0,v)
z3= f(u,v)

Площадь передней грани (как и задней) равна 42


2) Разбивка тел на 6-гранники (см. МК)

Алгоритм решения. Параметризация  от передней грани до задней выолняем по линейному закону
Gr_ti = (1-t)*Gr_t0 + t* Gr_t1
Также будут изменяться и текущие точки z0, z1, z2, z3
Z0_ti = (1-t)*Z0_t0 + t* z0_t1
Z1_ti = (1-t)*Z1_t0 + t* z1_t1
Z2_ti = (1-t)*Z2_t0 + t* z2_t1
Z3_ti = (1-t)*Z3_t0 + t* z3_t1
Первая 4-ка искомых точек определяется при t=0. Вторая 4-ка искомых точек определяется при t=шаг - по которым строится первая серия кубиков.
Далее, переприсваивая начало в конец, строим другие ряды и столбцы кубиков.


Для вычислений объема тел 8-гранники разбиеня,  в свою очередь разбить на тетраэдры (в каждом 6-граннике - 6 тетрадров) с соответсвующим в них   расчетами.
 

3) Вычисление объема тетраэдра

Метода вычнсления пока нет, поэтому оформир расчет в виде отдельной программки (суброутины

Есть несколько формул расчета объема тетраэда:
1)  Через векторное смешанное произведение (Корн, с.79)
2) Через матрицу (Бронштейн, с.282 )
3) V = 1/3 * s*h, где s- площадь основания, h - высота (справочник Рывкина с. 187).
Центр же тяжести тетраэдра (пирамиды) лежин на отрезке, соединяющим вершину с центром тяжести основания и отстоит от основания на расстоянии h/4.
А самая простая формула расчета центра Pc тетраэдра будет
xc=(p1.x+p2.x+p3.x+p4.x)/4
yc=(p1.y+p2.y+p3.y+p4.y)/4
zc=(p1.z+p2.z+p3.z+p4.z)/4
Set Pc = p(xc,yc,zc)

Пример. Задан тетраэдр. Требуется вычислить объем и центр тяжести (см. в одной МК).
 



Объем 6-гранника будет (см. МК )складываться из 6 тетраэдров, центр тяжести 6-гранника -  надо сложить координаты 8 точек вершин и разделить на 8.

Вычисление объема и ц.т. произвольного тела "грань-грань" (МК)


На рис. 8 центров для 8 кубиков и общий центр тяжести.

Здесь важно посчитать сумму координат всех точек (в МК сделано для кубиков) и число кубиков
 n=n+1 -  счетчик числа
 xcc=(xcc+pcc.x) - суммирование по х
 ycc=(ycc+pcc.y) - суммирование по y
 zcc=(zcc+pcc.z) - суммирование по z
 xcc=xcc/n - деление на число точек локальных центров тяжести отдельных кубиков
 ycc=ycc/n - деление на число точек локальных центров тяжести кубиков
 zcc=zcc/n - деление на число точек локальных центров тяжести кубиков



Вычисление длины полилинии (см. текст МК)
Алгоритм  решения. Вычисляем две точки: текущую pi и последующую pj с шагом nt - через обращение к методу вычисления точки на полилинии, длина же отрезка между точками также определяется через соответствующий метод.
Set pi = Polyline.P (t)
if t < 1 Then
  Set pj = Polyline.P (t+nt)
  si=DlinaOtr (pi,pj)
  s=s+si
 end if

Двумерная область между линией и произвольной плоскостью

1. Структурное представление области между линий и плоскостью

Рассмотрим еще одну полезную задачу: задать линейчатую  поверхность между произвольной линией и ее проекцией на произвольную плоскость. Данная задача особенно полезна в расчетах по корпусу судна.
Пусть задан 3-й шпангоут правого и левого бортов.

Требуется структурировать (МК) область (плоскость) между шпангоутом и ватерлинией. Плоскость ватерлинии может быть расположено как угодно:

  
Задать крен на правый или левый борт можно вращением шпангоута на тот или иной угол


2. Вычисление площади структурированной области между линий и плоскостью
 
Следующая  задача вычислить площадь МК между шпангоутом и плоскостью ватерлинии

На рис. часть плоскости между плоскостью ватерлинии разбита на треугольники и вычислена площадь, которая равна

В случае, если  плоскость ватерлинии пересекает шпангоут в общем случае происходит вычисление под ватерленией и над ней (вычисляется и площадь крылышек).

Будем крылышки не треангулировать и их площадь крылышек  не считать, поставив условие: если h структированной области больше высоты плоскости ватерлинии, то площадь треугольников равна нулю (МК), и если h меньше, то треугольники рисуем.
Точность расчета площади будет зависеть от того, на сколько треугольников мы разобьем область под ватерлинией. Хотя видно, что МК работает не совсем верно: слева треугольники выходят за ватерлинию, справа - не доходят.
Пусть шаг разбивки равен по u и v равен 0.1

Время расчета и вывода рисунка меньше секунды
Площадь под ватерлинией 4.983431...

Пусть шаг разбивки по u и v равен 0.01
В этом случае время работы программы (за счет изображения треугольников и из размещения в структуру) значительно возрастает ( t = 2 мин ). Видно, что треугольники лежат более точно под ватерлинией. отсюда возрастает и точность вычислений: 

Если треугольники не изображать, то время расчета площади значительно сокращается ( t=10 сек )
Аналогочно вычиляется площадь смоченной области шпангоута и в случае крена.

Шаг по u и v равен 0.05, площадь под рабочей ватерлинией равна 5.6883... Время расчета и вывода изображений = 0.15 сек


3. Вычисление центра тяжести структурированной области между линий и плоскостью

Решение.
Поставить счетчик (МК), сколько точек и треугольников в структурированной области
Сначала проверим на простом случае. Пусть шаг по u,v =0.25


Все правильно.
Теперь вычислим сколько точек-узлов (для их вычисления в МК создадим отдельный цикл)?


Все правильно
Далее суммируем координаты точек и делим их на число точек (так вычисляется центр тяжести). Центр тяжести изобразим окружность красного цвета.
 


Второй подход - через треугольники - будет заведома неправильный, поэтому его использовать не будем.
 
Центр тяжести под ватерлинией при h=2 и шагом u,v=0.05
 


 
Центр тяжести "смоченной" области шпангоута при крене -20 градусов:



Макрокоманды

МК построения двух бортов и боковушек между ними
Set p1 = p(4.6,6.4,0)
Set p2 = p(3.5,-12,0)
Set p3 = p(2,3,5)
Set p4 = p(0.8,-8,5)

Set p12 = p(14,0,0) ' характ. точка для построения кривой 2-го порядка
Set p34 = p(8,0,3) ' характ. точка для построения кривой 2-го порядка

s=0.7
Kvadr.ss p1, p2, p12, s' Линии u0
Polyline.FromCurrObj 10
n_u0 = LastNmb
Kvadr.ss p3, p4, p34, s ' Линии u1
Polyline.FromCurrObj 10
n_u1 = LastNmb
Otrezok.ss p1,p3 ' Линии v0
 Polyline.FromCurrObj 10
n_v0 = LastNmb
Otrezok.ss p2,p4 ' Линии v1
 Polyline.FromCurrObj 10
n_v1 = LastNmb
 

LinPov.BaseNmbU0 = n_u1
LinPov.BaseNmbU1 = n_u0
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t0 = LastNmb    ' исходная грань при t=0
 

Set p1 = p(-4.6,6.4,0)
Set p2 = p(-3.5,-12,0)
Set p3 = p(-2,3,5)
Set p4 = p(-0.8,-8,5)

Set p12 = p(-14,0,0)
Set p34 = p(-8,0,3)

s=0.7
Kvadr.ss p1, p2, p12, s' Линии u10
Polyline.FromCurrObj 10
n_u10 = LastNmb
Kvadr.ss p3, p4, p34, s ' Линии u11
Polyline.FromCurrObj 10
n_u11 = LastNmb
Otrezok.ss p1,p3 ' Линии v10
Polyline.FromCurrObj 10
n_v10 = LastNmb
Otrezok.ss p2,p4 ' Линии v11
Polyline.FromCurrObj 10
n_v11 = LastNmb
 

LinPov.BaseNmbU0 = n_u10
LinPov.BaseNmbU1 = n_u11
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t1 = LastNmb  ' исходная грань при t=1

' далее идут боковушки

LinPov.BaseNmbU0 = n_u10
LinPov.BaseNmbU1 = n_u0
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_u0 = LastNmb

LinPov.BaseNmbU0 = n_u11
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_u1 = LastNmb

LinPov.BaseNmbU0 = n_v0
LinPov.BaseNmbU1 = n_v10
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_v0 = LastNmb
 

LinPov.BaseNmbU0 = n_v1
LinPov.BaseNmbU1 = n_v11
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_v1 = LastNmb

' масштаб
obj.All = True
obj.scale=0.5
obj.SetH


Тело поверхность-плоскость
' Плоскость задаем тремя точками
Set p71 = P(0,-4,0)
Set p72 = P(0,7,0)
Set p73 = P(0,0,10)
Trian.ss p71, p72, p73
' борт
Set p1 = p(4.6,6.4,0)
Set p2 = p(3.5,-12,0)
Set p3 = p(2,3,5)
Set p4 = p(0.8,-8,5)
' ХТ
Set p12 = p(14,0,0)
Set p34 = p(8,0,3)

s=0.7
Kvadr.ss p1, p2, p12, s' Линии u0
Polyline.FromCurrObj 10
n_u0 = LastNmb
Kvadr.ss p3, p4, p34, s ' Линии u1
Polyline.FromCurrObj 10
n_u1 = LastNmb
Otrezok.ss p1,p3 ' Линии v0
 Polyline.FromCurrObj 10
n_v0 = LastNmb
Otrezok.ss p2,p4 ' Линии v1
 Polyline.FromCurrObj 10
n_v1 = LastNmb

LinPov.BaseNmbU0 = n_u1
LinPov.BaseNmbU1 = n_u0
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t0 = LastNmb    ' исходная грань при t=0

' Задаем проекции линий контура на плоскость
' Проекция линии U0

  Polyline.Reset
  Polyline.SaveInDoc ( -1 )
  n99 = LastNmb
   For u=0 To 1 Step 0.2
   CurrObjNmb  = n_u0
    Set G1=Polyline.P (u)
    Set G2 = PointPointPlane (p71, p72, p73, G1)
    ' сбросим точки в полилинию
    CurrObjNmb = n99
     Polyline.AddP  G2
    UpdateCurrObj  ' завершаю
  Next
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
    n_u0_2 = LastNmb

  Polyline.Reset
  Polyline.SaveInDoc ( -1 )
  n99 = LastNmb
   For u=0 To 1 Step 0.2
   CurrObjNmb  = n_u1
    Set G1=Polyline.P (u)
    Set G2 = PointPointPlane (p71, p72, p73, G1)
    ' сбросим точки в полилинию
    CurrObjNmb = n99
     Polyline.AddP  G2
    UpdateCurrObj  ' завершаю
  Next
    Polyline.SaveInDoc ( ngroup )
    Polyline.Draw
    n_u1_2 = LastNmb

  Polyline.Reset
  Polyline.SaveInDoc ( -1 )
  n99 = LastNmb
   For u=0 To 1 Step 0.2
   CurrObjNmb  = n_v0
    Set G1=Polyline.P (u)
    Set G2 = PointPointPlane (p71, p72, p73, G1)
    ' сбросим точки в полилинию
    CurrObjNmb = n99
     Polyline.AddP  G2
    UpdateCurrObj  ' завершаю
  Next
    Polyline.SaveInDoc ( ngroup )
    Polyline.Draw
    n_v0_2 = LastNmb

  Polyline.Reset
  Polyline.SaveInDoc ( -1 )
  n99 = LastNmb
   For u=0 To 1 Step 0.2
   CurrObjNmb  = n_v1
    Set G1=Polyline.P (u)
    Set G2 = PointPointPlane (p71, p72, p73, G1)
    ' сбросим точки в полилинию
    CurrObjNmb = n99
     Polyline.AddP  G2
    UpdateCurrObj  ' завершаю
  Next
    Polyline.SaveInDoc ( ngroup )
    Polyline.Draw
    n_v1_2 = LastNmb

' Теперь строим грань как линейчатая поверхность
LinPov.BaseNmbU0 = n_u0_2
LinPov.BaseNmbU1 = n_u0
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
 

LinPov.BaseNmbU0 = n_u1_2
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw

LinPov.BaseNmbU0 = n_v0
LinPov.BaseNmbU1 = n_v0_2
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw

LinPov.BaseNmbU0 = n_v1
LinPov.BaseNmbU1 = n_v1_2
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw



Треангуляция и вычисление площади
' Тело kub
Set p1 = p(0,6,7)
Set p2 = p(7,6,7)
Set p3 = p(0,0,7)
Set p4 = p(7,0,7)

Set p11 = p(0,6,0)
Set p12 = p(7,6,0)
Set p13 = p(0,0,0)
Set p14 = p(7,0,0)

Otrezok.ss p1,p2 ' Линии u0
Polyline.FromCurrObj 10
n_u0 = LastNmb
Otrezok.ss p3,p4 ' Линии u1
Polyline.FromCurrObj 10
n_u1 = LastNmb
Otrezok.ss p1,p3 ' Линии v0
 Polyline.FromCurrObj 10
n_v0 = LastNmb
Otrezok.ss p2,p4 ' Линии v1
 Polyline.FromCurrObj 10
n_v1 = LastNmb

Otrezok.ss p11,p12 ' Линии u10
Polyline.FromCurrObj 10
n_u10 = LastNmb
Otrezok.ss p13,p14 ' Линии u11
Polyline.FromCurrObj 10
n_u11 = LastNmb
Otrezok.ss p11,p13 ' Линии v10
Polyline.FromCurrObj 10
n_v10 = LastNmb
Otrezok.ss p12,p14 ' Линии v11
Polyline.FromCurrObj 10
n_v11 = LastNmb
 

LinPov.BaseNmbU0 = n_u0
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t0 = LastNmb

LinPov.BaseNmbU0 = n_u10
LinPov.BaseNmbU1 = n_u11
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t1 = LastNmb

' вычисляем массив точек

' Триангуляция

nu=0.5
nv=0.5

CurrObjNmb = Gr_t0

For v=0 To 1 Step nv
  For u=0 To 1 Step nu
  CurrObjNmb = Gr_t0
   Set z0_t0 = LinPov.P (u,v)
   if u < 1 Then Set z1_t0 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t0 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t0 = LinPov.P (u+nu,v+nv)
   if u < 1 and v < 1 Then Trian.ss z0_t0,z1_t0, z2_t0
   if u < 1 and v < 1 Then Trian.ss z3_t0,z1_t0, z2_t0
   Sp1_t0 = NvTrian (z0_t0,z1_t0,z2_t0)
   Sp2_t0 = NvTrian (z3_t0,z1_t0,z2_t0)
   Sp_t0=Sp1_t0+Sp2_t0
   S_t0=S_t0 + sp_t0
  CurrObjNmb = Gr_t1
   Set z0_t1 = LinPov.P (u,v)
   if u < 1 Then Set z1_t1 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t1 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t1 = LinPov.P (u+nu,v+nv)
   if u < 1 and v < 1 Then Trian.ss z0_t1,z1_t1, z2_t1
   if u < 1 and v < 1 Then Trian.ss z3_t1,z1_t1, z2_t1
   Sp1_t1 = NvTrian (z0_t1,z1_t1,z2_t1)
   Sp2_t1 = NvTrian (z3_t1,z1_t1,z2_t1)
   Sp_t1=Sp1_t1+Sp2_t1
   S_t1=S_t1 + sp_t1
 Next
Next

VBSMsg "Площадь передней грани = " & S_t0
VBSMsg "Площадь задней грани = " & S_t1



Разбивка тела на 6-гранники (в частности, кубики)
' Тело kub
Set p1 = p(0,6,7)
Set p2 = p(7,6,7)
Set p3 = p(0,0,7)
Set p4 = p(7,0,7)

Set p11 = p(0,6,0)
Set p12 = p(7,6,0)
Set p13 = p(0,0,0)
Set p14 = p(7,0,0)

Otrezok.ss p1,p2 ' Линии u0
Polyline.FromCurrObj 10
n_u0 = LastNmb
Otrezok.ss p3,p4 ' Линии u1
Polyline.FromCurrObj 10
n_u1 = LastNmb
Otrezok.ss p1,p3 ' Линии v0
 Polyline.FromCurrObj 10
n_v0 = LastNmb
Otrezok.ss p2,p4 ' Линии v1
 Polyline.FromCurrObj 10
n_v1 = LastNmb

Otrezok.ss p11,p12 ' Линии u10
Polyline.FromCurrObj 10
n_u10 = LastNmb
Otrezok.ss p13,p14 ' Линии u11
Polyline.FromCurrObj 10
n_u11 = LastNmb
Otrezok.ss p11,p13 ' Линии v10
Polyline.FromCurrObj 10
n_v10 = LastNmb
Otrezok.ss p12,p14 ' Линии v11
Polyline.FromCurrObj 10
n_v11 = LastNmb
 

LinPov.BaseNmbU0 = n_u0
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t0 = LastNmb

LinPov.BaseNmbU0 = n_u10
LinPov.BaseNmbU1 = n_u11
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t1 = LastNmb

' вычисляем массив точек

'  Грани Gr_u0, Gr_u1, Gr_v0, Gr_t0, Gr_t1

' Триангуляция

nu=0.5
nv=0.5
nt=0.5

CurrObjNmb = Gr_t0

For v=0 To 1 Step nv
  For u=0 To 1 Step nu
   CurrObjNmb = Gr_t0
   Set z0_t0 = LinPov.P (u,v)
   if u < 1 Then Set z1_t0 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t0 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t0 = LinPov.P (u+nu,v+nv)
'   if u < 1 and v < 1 Then Trian.ss z0_t0,z1_t0, z2_t0
'   if u < 1 and v < 1 Then Trian.ss z3_t0,z1_t0, z2_t0
   Set z10 = p(z0_t0.x,z0_t0.y,z0_t0.z)
   Set z11 = p(z1_t0.x,z1_t0.y,z1_t0.z)
   Set z12 = p(z2_t0.x,z2_t0.y,z2_t0.z)
   Set z13 = p(z3_t0.x,z3_t0.y,z3_t0.z)

   CurrObjNmb = Gr_t1
   Set z0_t1 = LinPov.P (u,v)
   if u < 1 Then Set z1_t1 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t1 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t1 = LinPov.P (u+nu,v+nv)
 
    For t=0 To 1 Step nt
' z0
     z0x = (1-t)*z0_t0.x + t*z0_t1.x
     z0y = (1-t)*z0_t0.y + t*z0_t1.y
     z0z = (1-t)*z0_t0.z + t*z0_t1.z
     Set z0 = p(z0x,z0y,z0z)
' z1
     z1x = (1-t)*z1_t0.x + t*z1_t1.x
     z1y = (1-t)*z1_t0.y + t*z1_t1.y
     z1z = (1-t)*z1_t0.z + t*z1_t1.z
     Set z1 = p(z1x,z1y,z1z)

' z2
     z2x = (1-t)*z2_t0.x + t*z2_t1.x
     z2y = (1-t)*z2_t0.y + t*z2_t1.y
     z2z = (1-t)*z2_t0.z + t*z2_t1.z
     Set z2 = p(z2x,z2y,z2z)

' z3
     z3x = (1-t)*z3_t0.x + t*z3_t1.x
     z3y = (1-t)*z3_t0.y + t*z3_t1.y
     z3z = (1-t)*z3_t0.z + t*z3_t1.z
     Set z3 = p(z3x,z3y,z3z)
   'if u < 1 and v < 1 Then Trian.ss z0,z1, z2
   'if u < 1 and v < 1 Then Trian.ss z3,z1, z2
   'if v < 1 Then Trian.ss z0,z10, z2
   'if v < 1 Then Trian.ss z10,z12, z2
   'if v < 1 Then Trian.ss z1,z3, z11
   'if v < 1 Then Trian.ss z11,z13, z3
   ' Или Построим 6-гранники
   if u < 1 and v < 1 Then
   C6sides.ss z0,z1,z3,z2, z10,z11,z13,z12 ' строим 6-гранники
   End if
' переприсвоение начало в конец
   Set z10 = p(z0.x,z0.y,z0.z)
   Set z11 = p(z1.x,z1.y,z1.z)
   Set z12 = p(z2.x,z2.y,z2.z)
   Set z13 = p(z3.x,z3.y,z3.z)

    Next
 Next
Next



Объем тетраэдра и центр тяжести
' Тело kub
a=10
b=10
c=10

Set k1 = p(0,0,c)
Set k2 = p(a,0,c)
Set k4 = p(0,0,0)
Set k11 = p(0,b,c)
Otrezok.ss k1,k2
Otrezok.ss k2,k4
Otrezok.ss k4,k1
Otrezok.ss k1,k11
Otrezok.ss k2,k11
Otrezok.ss k4,k11

' Объем тетраэдра обращение к суброутине
Tetraedr k1,k2,k4, k11, v
VBSMsg "Объем тетраэдра = " & v

' Центр тяжести обращение к суброутине
Cttetraedr k1,k2,k4, k11, Pct
krug.ss Pct,0.2, p(0,0,0.1)

' вычисление объема
Sub Tetraedr (p1, p2, p3, p4, ssvt)
s = NvTrian (p1, p2, p3)
' VBSMsg "Площадь треугольника s = " & s
' длина перпендикуляра на основание
h=DistPointPlane (p1,p2,p3, p4)
' объем тетраэдра
ssvt=1/3*h*s
End Sub

' вычисление центра тяжести
Sub Cttetraedr (t1, t2, t3, t4, xc)
' для проверки проведем медианы
' Сначала ишем середины сторон основания
Set kK1 = PointOtr(t1, t2, 0.5)
krug.ss kK1,0.1, p(0,0,0.1)
Set kK2 = PointOtr(t2, t3, 0.5)
krug.ss kK2,0.1, p(0,0,0.1)
Set kK3 = PointOtr(t3, t1, 0.5)
krug.ss kK3,0.1, p(0,0,0.1)
Otrezok.ss t1,kk2
Otrezok.ss t3,kk1
Otrezok.ss t2,kk3
' центр тяжести основания (т. пересечения медиан)
xc1=(t1.x+t2.x+t3.x)/3
yc1=(t1.y+t2.y+t3.y)/3
zc1=(t1.z+t2.z+t3.z)/3
Set xc1 = p(xc1,yc1,zc1)
' вот сам расчет центра тяжести тетраэдра
xc=(t1.x+t2.x+t3.x+t4.x)/4
yc=(t1.y+t2.y+t3.y+t4.y)/4
zc=(t1.z+t2.z+t3.z+t4.z)/4
Set xc = p(xc,yc,zc)
krug.ss xc1,0.2, p(0,0,0.1)
krug.ss xc,0.2, p(0,0,0.1)
Otrezok.ss xc1,t4
End Sub



Вычисление объема и центра тяжести 6-гранника
' Тело kub
a=10
b=10
c=10
Set p1 = p(0,0,c)
Set p2 = p(a,0,c)
Set p3 = p(a,0,0)
Set p4 = p(0,0,0)
Set p11 = p(0,b,c)
Set p12 = p(a,b,c)
Set p13 = p(a,b,0)
Set p14 = p(0,b,0)

C6sides.ss p1, p2, p3, p4, p11, p12, p13, p14

' Вычисление объема 6-гранника через суброутину
grannik6 p1, p2, p3, p4, p11, p12, p13, p14, allsumma
VBSMsg "Объем 6-гранника allsumma = " & allsumma

Sub grannik6 (p1, p2, p3, p4, p11, p12, p13, p14, summa)
Tetraedr p1,p2,p4, p11, svt1
Tetraedr p11,p12,p14, p4, svt2
Tetraedr p11,p12,p2, p4, svt3
Tetraedr p2,p3,p4, p12, svt4
Tetraedr p12,p13,p14, p4, svt5
Tetraedr p3,p13,p12, p4, svt6
summa = svt1+svt2+svt3+svt4+svt5+svt6
End Sub

' вычисление объема тетраэдра
Sub Tetraedr (p1, p2, p3, p4, ssvt)
s = NvTrian (p1, p2, p3)
' VBSMsg "Площадь треугольника s = " & s
' длина перпендикуляра на основание
h=DistPointPlane (p1,p2,p3, p4)
' объем тетраэдра
ssvt=1/3*h*s
End Sub

' вычисление центра тяжести
xc=(p1.x+p2.x+p3.x+p4.x+p11.x+p12.x+p13.x+p14.x)/8
yc=(p1.y+p2.y+p3.y+p4.y+p11.y+p12.y+p13.y+p14.y)/8
zc=(p1.z+p2.z+p3.z+p4.z+p11.z+p12.z+p13.z+p14.z)/8
Set Pc = p(xc,yc,zc)
krug.ss Pc, 0.2, p(0,0,0.1)



Тело из 8 кубиков - поиск Центра тяжести
' Тело kub
a=10
b=10
c=10
Set p1 = p(0,6,7)
Set p2 = p(7,6,7)
Set p3 = p(0,0,7)
Set p4 = p(7,0,7)

Set p11 = p(0,6,0)
Set p12 = p(7,6,0)
Set p13 = p(0,0,0)
Set p14 = p(7,0,0)

Set p1 = p(0,b,c)
Set p2 = p(a,b,c)
Set p3 = p(0,0,c)
Set p4 = p(a,0,c)

Set p11 = p(0,b,0)
Set p12 = p(a,b,0)
Set p13 = p(0,0,0)
Set p14 = p(a,0,0)
 

Otrezok.ss p1,p2 ' Линии u0
Polyline.FromCurrObj 10
n_u0 = LastNmb
Otrezok.ss p3,p4 ' Линии u1
Polyline.FromCurrObj 10
n_u1 = LastNmb
Otrezok.ss p1,p3 ' Линии v0
 Polyline.FromCurrObj 10
n_v0 = LastNmb
Otrezok.ss p2,p4 ' Линии v1
 Polyline.FromCurrObj 10
n_v1 = LastNmb

Otrezok.ss p11,p12 ' Линии u10
Polyline.FromCurrObj 10
n_u10 = LastNmb
Otrezok.ss p13,p14 ' Линии u11
Polyline.FromCurrObj 10
n_u11 = LastNmb
Otrezok.ss p11,p13 ' Линии v10
Polyline.FromCurrObj 10
n_v10 = LastNmb
Otrezok.ss p12,p14 ' Линии v11
Polyline.FromCurrObj 10
n_v11 = LastNmb
 

LinPov.BaseNmbU0 = n_u0
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t0 = LastNmb

LinPov.BaseNmbU0 = n_u10
LinPov.BaseNmbU1 = n_u11
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t1 = LastNmb

' вычисляем массив точек

'  Грани Gr_u0, Gr_u1, Gr_v0, Gr_t0, Gr_t1

' Триангуляция

nu=0.5
nv=0.5
nt=0.5

CurrObjNmb = Gr_t0

For v=0 To 1 Step nv
  For u=0 To 1 Step nu
   CurrObjNmb = Gr_t0
   Set z0_t0 = LinPov.P (u,v)
   if u < 1 Then Set z1_t0 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t0 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t0 = LinPov.P (u+nu,v+nv)
'   if u < 1 and v < 1 Then Trian.ss z0_t0,z1_t0, z2_t0
'   if u < 1 and v < 1 Then Trian.ss z3_t0,z1_t0, z2_t0
   Set z10 = p(z0_t0.x,z0_t0.y,z0_t0.z)
   Set z11 = p(z1_t0.x,z1_t0.y,z1_t0.z)
   Set z12 = p(z2_t0.x,z2_t0.y,z2_t0.z)
   Set z13 = p(z3_t0.x,z3_t0.y,z3_t0.z)

   CurrObjNmb = Gr_t1
   Set z0_t1 = LinPov.P (u,v)
   if u < 1 Then Set z1_t1 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t1 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t1 = LinPov.P (u+nu,v+nv)
 
    For t=nt To 1 Step nt
' самая текущая точка
' z0
     z0x = (1-t)*z0_t0.x + t*z0_t1.x
     z0y = (1-t)*z0_t0.y + t*z0_t1.y
     z0z = (1-t)*z0_t0.z + t*z0_t1.z
     Set z0 = p(z0x,z0y,z0z)
' z1
     z1x = (1-t)*z1_t0.x + t*z1_t1.x
     z1y = (1-t)*z1_t0.y + t*z1_t1.y
     z1z = (1-t)*z1_t0.z + t*z1_t1.z
     Set z1 = p(z1x,z1y,z1z)

' z2
     z2x = (1-t)*z2_t0.x + t*z2_t1.x
     z2y = (1-t)*z2_t0.y + t*z2_t1.y
     z2z = (1-t)*z2_t0.z + t*z2_t1.z
     Set z2 = p(z2x,z2y,z2z)

' z3
     z3x = (1-t)*z3_t0.x + t*z3_t1.x
     z3y = (1-t)*z3_t0.y + t*z3_t1.y
     z3z = (1-t)*z3_t0.z + t*z3_t1.z
     Set z3 = p(z3x,z3y,z3z)
'   if u < 1 and v < 1 Then Trian.ss z0,z1, z2
'   if u < 1 and v < 1 Then Trian.ss z3,z1, z2
'   if v < 1 Then Trian.ss z0,z10, z2
'   if v < 1 Then Trian.ss z10,z12, z2
'   if v < 1 Then Trian.ss z1,z3, z11
'   if v < 1 Then Trian.ss z11,z13, z3
' Построим сначала 6-гранники
 if u < 1 and v < 1 Then
  C6sides.ss z0,z1,z3,z2, z10,z11,z13,z12 ' строим 6-гранники
  ' И сразу вычисляем объем каждого 6-гранника
  grannik6 z0, z1, z3, z2, z10, z11, z13, z12, summ
  allsumma=allsumma+summ
  ' Вычисляем центр тяжести
  Ct6grannik z0, z1, z3, z2, z10, z11, z13, z12, Pcc
  krug.ss Pcc, 0.2, p(0,0,0.1)
 n=n+1
 xcc=(xcc+pcc.x)
 ycc=(ycc+pcc.y)
 zcc=(zcc+pcc.z)
 End if
 
   Set z10 = p(z0.x,z0.y,z0.z)
   Set z11 = p(z1.x,z1.y,z1.z)
   Set z12 = p(z2.x,z2.y,z2.z)
   Set z13 = p(z3.x,z3.y,z3.z)
   Next
 Next
Next
 xcc=xcc/n
 ycc=ycc/n
 zcc=zcc/n

VBSMsg "Объем 6-гранника allsumma = " & allsumma
Krug.ss p(xcc,ycc,zcc), 1, p(0,0,1)  ' центр тяжести
VBSMsg "xcc = " & xcc
VBSMsg "ycc = " & ycc
VBSMsg "zcc = " & zcc
VBSMsg "n = " & n

' субрутина вычисления объема 6-гранника
Sub grannik6 (p1, p2, p3, p4, p11, p12, p13, p14, summa)
Tetraedr p1,p2,p4, p11, svt1
Tetraedr p11,p12,p14, p4, svt2
Tetraedr p11,p12,p2, p4, svt3
Tetraedr p2,p3,p4, p12, svt4
Tetraedr p12,p13,p14, p4, svt5
Tetraedr p3,p13,p12, p4, svt6
summa = svt1+svt2+svt3+svt4+svt5+svt6
End Sub

' субрутина вычисления объема тетраэдра
Sub Tetraedr (p1, p2, p3, p4, ssvt)
' Вычисляем длины сторон основания
a=DlinaOtr (p1, p2)
b=DlinaOtr (p2, p3)
c=DlinaOtr (p3, p1)
' полупериметр
pp = (a+b+c)/2
' Площадь треугольника
s = sqr(pp*(pp-a)*(pp-b)*(pp-c))
' Сначала вычисляем длину перпендикуляра на основание
h=DistPointPlane (p1,p2,p3, p4)
' Вычисляем объем тетраэдра
ssvt=1/3*h*s
' VBSMsg "Объем тетраэдра ssvt = " & ssvt
End Sub
 

Sub Ct6grannik (m1, m2, m3, m4, m11, m12, m13, m14, Pc)

xc=(m1.x+m2.x+m3.x+m4.x+m11.x+m12.x+m13.x+m14.x)/8
yc=(m1.y+m2.y+m3.y+m4.y+m11.y+m12.y+m13.y+m14.y)/8
zc=(m1.z+m2.z+m3.z+m4.z+m11.z+m12.z+m13.z+m14.z)/8
Set Pc = p(xc,yc,zc)
End Sub



расчет длины полилинии
R=10
Krug.ss p(0,0,0),R, p(0,0,1)
Polyline.FromCurrObj 100 ' преобразование окружности в полилинию
n_u0 = LastNmb
nt=0.01 '  шаг
For t=0 To 1 Step nt
 CurrObjNmb = n_u0
 Set pi = Polyline.P (t)
 if t < 1 Then
  Set pj = Polyline.P (t+nt)
  si=DlinaOtr (pi,pj)
  s=s+si
 end if
Next
VBSMsg "Длина s = " & s
dl=2*3.14*R
VBSMsg "Длина окружности 2*3.14*R = " & dl

Задание двух граней для формирование линейчатого тела

 

' два борта

Set p1 = p(4.6,6.4,0)
Set p2 = p(3.5,-12,0)
Set p3 = p(2,3,5)
Set p4 = p(0.8,-8,5)

Set p12 = p(14,0,0)
Set p34 = p(8,0,3)

s=0.7
Kvadr.ss p1, p2, p12, s' Линии u0
Polyline.FromCurrObj 10
n_u0 = LastNmb
Kvadr.ss p3, p4, p34, s ' Линии u1
Polyline.FromCurrObj 10
n_u1 = LastNmb

LinPov.BaseNmbU0 = n_u1
LinPov.BaseNmbU1 = n_u0
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t0 = LastNmb    ' исходная грань при t=0
 

Set p1 = p(-4.6,6.4,0)
Set p2 = p(-3.5,-12,0)
Set p3 = p(-2,3,5)
Set p4 = p(-0.8,-8,5)

Set p12 = p(-14,0,0)
Set p34 = p(-8,0,3)

s=0.7
Kvadr.ss p1, p2, p12, s' Линии u10
Polyline.FromCurrObj 10
n_u10 = LastNmb
Kvadr.ss p3, p4, p34, s ' Линии u11
Polyline.FromCurrObj 10
n_u11 = LastNmb

LinPov.BaseNmbU0 = n_u11
LinPov.BaseNmbU1 = n_u10
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t1 = LastNmb  ' исходная грань при t=1

' масштаб
obj.All = True
obj.scale=0.5
obj.SetH



 

' Задаем правый и левый борта отдельно

Import "C:\Bolotov\obraz2_prava.dxf", 1
Dubl
Dubl
Dubl
n1 = LastNmb+1 ' по какой
MoveToGroup 0, n1, "gr1" ' group - имя группы - любое
n11 = LastNmb ' номер 1-й группы линий
PolylinesByZ  n11, 2.0
' Строим полиповерхность слева
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolyPov.SS p(0,0,0), n11, 10, 10, False, False

' Задаем левый борт
Import "C:\Bolotov\obraz2_leva.dxf", 1
Dubl
Dubl
Dubl
n2 = LastNmb+1 ' по какой
MoveToGroup 1, n2, "gr2" ' group - имя группы - любое
n12 = LastNmb ' номер 2-й группы линий
PolylinesByZ  n12, 2.0
' Строим полиповерхность слева
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolyPov.Reset
PolyPov.SS p(0,0,0), n12, 10, 10, False, False



Import "C:\Bolotov\obraz2_leva.dxf", 1
n2 = LastNmb
' строим заднюю грань
LinPov.BaseNmbU0 = n1
LinPov.BaseNmbU1 = n2
LinPov.Nu = "11"
LinPov.Nv = "2"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Gr_t0 = LastNmb    ' исходная грань при t=0

dubl  ' дублируем
' Сдвиг
obj.origin(2) = 10
obj.SetH
' далее задание линейчатого тела в диалоге




' Задаем правый борт отдельно
Import "C:\Bolotov\ship\ship_test.dxf", 0
n1 = LastNmb ' номер 1-й группы линий
PolylinesByZ  n1, 2.0
' Строим полиповерхность слева
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolyPov.SS p(0,0,0), n1, 10, 10, False, False

Import "C:\Bolotov\ship\ship_test_lev.dxf", 0
n2 = LastNmb ' номер 1-й группы линий
PolylinesByZ  n2, 2.0
' Строим полиповерхность слева
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolyPov.Reset
PolyPov.SS p(0,0,0), n2, 10, 10, False, False




' Задаем правый борт отдельно
Import "C:\Bolotov\ship\korma_test_prav.dxf", 0
n1 = LastNmb ' номер 1-й группы линий
PolylinesByZ  n1, 2.0
' Строим полиповерхность слева
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolyPov.SS p(0,0,0), n1, 10, 10, False, False

Import "C:\Bolotov\ship\korma_test_lev.dxf", 0
n2 = LastNmb ' номер 1-й группы линий
PolylinesByZ  n2, 2.0
' Строим полиповерхность слева
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolyPov.Reset
PolyPov.SS p(0,0,0), n2, 10, 10, False, False




' Задаем борт
Import "C:\Bolotov\ship\korma_test_prav.dxf", 0
n1 = LastNmb ' номер 1-й группы линий
PolylinesByZ  n1, 2.0
' Строим полиповерхность слева
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolyPov.SS p(0,0,0), n1, 10, 10, False, False
' отображаем c дублем
Obj.SaveOriginal = True
Obj.Reflect 3 ' YZ


' Импортирование линий и их отражение
Import "C:\Bolotov\ship\korma_test_prav.dxf", 0
n1 = LastNmb ' номер 1-й группы линий
PolylinesByZ  n1, 2.0
' отображаем c дублем
Obj.SaveOriginal = True
Obj.Reflect 3 ' YZ


' два борта
Set p1 = p(4.6,6.4,0)
Set p2 = p(3.5,-12,0)
Set p3 = p(2,3,5)
Set p4 = p(0.8,-8,5)

Set p12 = p(14,0,0)
Set p34 = p(8,0,3)

s=0.7
Kvadr.ss p1, p2, p12, s' Линии u0
n_u0 = LastNmb
Kvadr.ss p3, p4, p34, s ' Линии u1
n_u1 = LastNmb

Set p13 = p(2,6,7)
Set p24 = p(1,-10,8)

Kvadr.ss p1, p3, p13, s' Линии v0
n_v0 = LastNmb
Kvadr.ss p2, p4, p24, s ' Линии v1
n_v1 = LastNmb
 

Set p1 = p(-4.6,6.4,0)
Set p2 = p(-3.5,-12,0)
Set p3 = p(-2,3,5)
Set p4 = p(-0.8,-8,5)

Set p12 = p(-14,0,0)
Set p34 = p(-8,0,3)

s=0.7
Kvadr.ss p1, p2, p12, s' Линии u10
n_u10 = LastNmb
Kvadr.ss p3, p4, p34, s ' Линии u11
n_u11 = LastNmb

Set p13 = p(-1.25,8,8)
Set p24 = p(-2.5,-11,7)

Kvadr.ss p1, p3, p13, s' Линии u0
n_v0 = LastNmb
Kvadr.ss p2, p4, p24, s ' Линии u1
n_v1 = LastNmb

' масштаб
obj.All = True
obj.scale=0.5
obj.SetH



 

' Грань: линия-плоскость
' Плоскость (на ней будет линия n_u1)
h=0.5
Set p11 = P(0,h,0)
Set p12 = P(3,h,0)
Set p13 = P(0,h,3)
Trian.ss p11, p12, p13
' Пусть линия u0 задана в .dxf
Import "C:\bolotov\ship\hpangout.dxf",1
n_u0 = LastNmb
' алгоритм задания линейчатой поврхности:  "Линия -плоскость"
' с  одной стороны линия, с другой плоизвольная плоскость и вот
' между линией и плоскостью (проекции поверхности на нее) образуется двумерная поверхнсть.
' Исходная линия u0 - .dxf

' Линии U0
  Polyline.Reset
  Polyline.SaveInDoc ( -1 )
  n_u1 = LastNmb
  For u=0 To 1 Step 0.2
  CurrObjNmb = n_u0  ' активизирую 1-ю полилинию
    Set A = Polyline.P (u)
    Set G1 = PointPointPlane (p11, p12, p13, A)
    CurrObjNmb = n_u1 ' активизирую 2-ю полилинию
    Polyline.AddP  G1
    UpdateCurrObj
  Next
'    Polyline.SaveInDoc ( ngroup )
'    Polyline.Draw
'    n_u1 = LastNmb

' Теперь строим грань как линейчатая поверхность, благо есть метод
LinPov.BaseNmbU0 = n_u0
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw



Грань линия-плоскость
' Плоскость (на ней будет линия n_u1)
h=2
Set p11 = P(0,h,0)
Set p12 = P(3,h,0)
Set p13 = P(0,h,3)
Trian.ss p11, p12, p13
' Пусть линия u0 задана в .dxf
Import "C:\bolotov\ship\hpangout2.dxf",1
n_u0 = LastNmb
' алгоритм задания линейчатой поврхности:  "Линия -плоскость"
' с  одной стороны линия, с другой плоизвольная плоскость и вот
' между линией и плоскостью (проекции поверхности на нее) образуется двумерная поверхнсть.
' Исходная линия u0 - .dxf

' Линии U0
  Polyline.Reset
  Polyline.SaveInDoc ( -1 )
  n_u1 = LastNmb
  For u=0 To 1 Step 0.2
  CurrObjNmb = n_u0  ' активизирую 1-ю полилинию
    Set A = Polyline.P (u)
    Set G1 = PointPointPlane (p11, p12, p13, A)
    CurrObjNmb = n_u1 ' активизирую 2-ю полилинию
    Polyline.AddP  G1
    UpdateCurrObj
  Next
'    Polyline.SaveInDoc ( ngroup )
'    Polyline.Draw
'    n_u1 = LastNmb

' Теперь строим грань как линейчатая поверхность, благо есть метод
LinPov.BaseNmbU0 = n_u0
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
 



' Грань: линия-плоскость - вычисления плошади под ватерлинией
' Плоскость (на ней будет линия n_u1)
h=5
Set p11 = P(0,h,0)
Set p12 = P(3,h,0)
Set p13 = P(0,h,3)
Trian.ss p11, p12, p13

' Пусть линия u0 задана в .dxf
Import "C:\bolotov\ship\hpangout2.dxf",1
'obj.All = 1
'obj.zAngle=-15
'obj.SetH
'obj.All = 0 ' Отменить преобразования всех объектов
 

n_u0 = LastNmb
' алгоритм задания линейчатой поврхности:  "Линия -плоскость"
' с  одной стороны линия, с другой плоизвольная плоскость и вот
' между линией и плоскостью (проекции поверхности на нее) образуется двумерная поверхнсть.
' Исходная линия u0 - .dxf

' Линии U0
  Polyline.Reset
  Polyline.SaveInDoc ( -1 )
  n_u1 = LastNmb
  For u=0 To 1 Step 0.2
  CurrObjNmb = n_u0  ' активизирую 1-ю полилинию
    Set A = Polyline.P (u)
    Set G1 = PointPointPlane (p11, p12, p13, A)
    CurrObjNmb = n_u1 ' активизирую 2-ю полилинию
    Polyline.AddP  G1
    UpdateCurrObj
  Next
'    Polyline.SaveInDoc ( ngroup )
'    Polyline.Draw
'    n_u1 = LastNmb

' Теперь строим грань как линейчатая поверхность, благо есть метод
LinPov.BaseNmbU0 = n_u0
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw

' Триангуляция
nu=0.1
nv=0.1
CurrObjNmb = Gr_t0
For v=0 To 0.99 Step nv
  For u=0 To 1 Step nu
   CurrObjNmb = Gr_t0
   Set z0_t0 = LinPov.P (u,v)
   if u < 1 Then Set z1_t0 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t0 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t0 = LinPov.P (u+nu,v+nv)
   if u < 1 and v < 1 Then Trian.ss z0_t0,z1_t0, z2_t0
   SetFillColor 250, 0, 0
   if u < 1 and v < 1 Then Trian.ss z3_t0,z1_t0, z2_t0
   Sp1_t0 = NvTrian (z0_t0,z1_t0,z2_t0)
   Sp2_t0 = NvTrian (z3_t0,z1_t0,z2_t0)
   Sp_t0=Sp1_t0+Sp2_t0
   S_t0=S_t0 + sp_t0
  Next
Next
VBSMsg "Площадь грани = " & S_t0


 ' Грань: линия-плоскость - площадь под ватерлинией
' Грань: линия-плоскость
' Плоскость (на ней будет линия n_u1)
h=2
Set p11 = P(0,h,0)
Set p12 = P(3,h,0)
Set p13 = P(0,h,3)
Trian.ss p11, p12, p13

' Пусть линия u0 задана в .dxf
Import "C:\bolotov\ship\hpangout2.dxf",1
'obj.All = 1
'obj.zAngle=-15
'obj.SetH
'obj.All = 0 ' Отменить преобразования всех объектов
 

n_u0 = LastNmb
' алгоритм задания линейчатой поврхности:  "Линия -плоскость"
' с  одной стороны линия, с другой плоизвольная плоскость и вот
' между линией и плоскостью (проекции поверхности на нее) образуется двумерная поверхнсть.
' Исходная линия u0 - .dxf

' Линии U0
  Polyline.Reset
  Polyline.SaveInDoc ( -1 )
  n_u1 = LastNmb
  For u=0 To 1 Step 0.2
  CurrObjNmb = n_u0  ' активизирую 1-ю полилинию
    Set A = Polyline.P (u)
    Set G1 = PointPointPlane (p11, p12, p13, A)
    CurrObjNmb = n_u1 ' активизирую 2-ю полилинию
    Polyline.AddP  G1
    UpdateCurrObj
  Next
'    Polyline.SaveInDoc ( ngroup )
'    Polyline.Draw
'    n_u1 = LastNmb

' Теперь строим грань как линейчатая поверхность, благо есть метод
LinPov.BaseNmbU0 = n_u0
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw

' Триангуляция
nu=0.01
nv=0.01
CurrObjNmb = Gr_t0
For v=0 To 0.99 Step nv
  For u=0 To 1 Step nu
   CurrObjNmb = Gr_t0
   Set z0_t0 = LinPov.P (u,v)
   if u < 1 Then Set z1_t0 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t0 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t0 = LinPov.P (u+nu,v+nv)
   if z0_t0.y < h Then
    if u < 1 and v < 1 Then Trian.ss z0_t0,z1_t0, z2_t0
    SetFillColor 250, 0, 0
    if u < 1 and v < 1 Then Trian.ss z3_t0,z1_t0, z2_t0
   End if
   Sp1_t0 = NvTrian (z0_t0,z1_t0,z2_t0)
   if z0_t0.y > h Then Sp1_t0=0
   Sp2_t0 = NvTrian (z3_t0,z1_t0,z2_t0)
   if z0_t0.y > h Then Sp2_t0=0
   Sp_t0=Sp1_t0+Sp2_t0
   S_t0=S_t0 + sp_t0
  Next
Next
VBSMsg "Площадь под ватерлинией  = " & S_t0



Центр тяжести
' Грань: линия-плоскость
' Плоскость (на ней будет линия n_u1)
h=2
Set p11 = P(0,h,0)
Set p12 = P(3,h,0)
Set p13 = P(0,h,3)
Trian.ss p11, p12, p13

' Пусть линия u0 задана в .dxf
Import "C:\bolotov\ship\hpangout2.dxf",1
obj.All = 1
obj.zAngle=-20
obj.SetH
obj.All = 0 ' Отменить преобразования всех объектов
 

n_u0 = LastNmb
' алгоритм задания линейчатой поврхности:  "Линия -плоскость"
' с  одной стороны линия, с другой плоизвольная плоскость и вот
' между линией и плоскостью (проекции поверхности на нее) образуется двумерная поверхнсть.
' Исходная линия u0 - .dxf

' Линии U0
  Polyline.Reset
  Polyline.SaveInDoc ( -1 )
  n_u1 = LastNmb
  For u=0 To 1 Step 0.2
  CurrObjNmb = n_u0  ' активизирую 1-ю полилинию
    Set A = Polyline.P (u)
    Set G1 = PointPointPlane (p11, p12, p13, A)
    CurrObjNmb = n_u1 ' активизирую 2-ю полилинию
    Polyline.AddP  G1
    UpdateCurrObj
  Next
'    Polyline.SaveInDoc ( ngroup )
'    Polyline.Draw
'    n_u1 = LastNmb

' Теперь строим грань как линейчатая поверхность, благо есть метод
LinPov.BaseNmbU0 = n_u0
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
CurrObjNmb = Gr_t0

' Триангуляция
nu=0.05
nv=0.05
For v=0 To 1-0.01 Step nv
  For u=0 To 1-0.01 Step nu
   CurrObjNmb = Gr_t0
   Set z0_t0 = LinPov.P (u,v)
   if u < 1 Then Set z1_t0 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t0 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t0 = LinPov.P (u+nu,v+nv)
   if z0_t0.y < h Then
    if u < 1 and v < 1 Then Trian.ss z0_t0,z1_t0, z2_t0
    ntr1=ntr1+1
'    SetFillColor 250, 0, 0
    if u < 1 and v < 1 Then Trian.ss z3_t0,z1_t0, z2_t0
    ntr2=ntr2+1
   End if
   ntr=ntr1+ntr2
   Sp1_t0 = NvTrian (z0_t0,z1_t0,z2_t0)
   if z0_t0.y > h Then Sp1_t0=0
   Sp2_t0 = NvTrian (z3_t0,z1_t0,z2_t0)
   if z0_t0.y > h Then Sp2_t0=0
   Sp_t0=Sp1_t0+Sp2_t0
   S_t0=S_t0 + sp_t0
  Next
Next
 

' для вычисления точек-узловсрздадим отдельный цикл
For v=0 To 1 Step nv
  For u=0 To 1 Step nu
   CurrObjNmb = Gr_t0
   Set z0_t0 = LinPov.P (u,v)
   if u < 1 Then Set z1_t0 = LinPov.P (u+nu,v)
   if v < 1 Then Set z2_t0 = LinPov.P (u,v+nv)
   if u < 1 and v < 1 Then Set z3_t0 = LinPov.P (u+nu,v+nv)
   if z0_t0.y =< h Then
   s_z0_t0x = s_z0_t0x + z0_t0.x
   s_z0_t0y = s_z0_t0y + z0_t0.y
   s_z0_t0z = s_z0_t0z + z0_t0.z
'    Krug.ss z0_t0,0.1,p(0,0,1)
    n_point=n_point+1
   End if
 
  Next
Next
Centrx = s_z0_t0x/n_point
Centry = s_z0_t0y/n_point
Centrz = s_z0_t0z/n_point
Set Centr = p(Centrx,Centry,Centrz)
Krug.ss Centr,0.2,p(0,0,1)
SetFillColor 250, 0, 0

VBSMsg "Площадь под ватерлинией  = " & S_t0
VBSMsg "Число треугольников  = " & ntr
VBSMsg "Число точек-узлов  = " & n_point
'VBSMsg "Центр тяжести x = " & Centrx _
' & " y = " &  Centry & " z = " & Centrz

VBSMsg "Центр тяжести x = " & Centrx _
& vbCrLf & "                          y = " &  Centry _
& vbCrLf & "                          z = " & Centrz