Формирвания линейчатого тела "грань-грань" в диалоге
можно выполнить, например, по следующей схеме:
1) задать в CorelDraw сразу две линии справа и слева.
2) Импортировать в "Вектор" обе линии из одного файла .dxf.
3) Сделать дубли первой линии и поместить в группу (1-я группа линий).
4) Сделать дубли второй линии и поместить в группу (2-я группа линий).
5) Сделать разброс линии по z в той и другой группах.
6) Задать полиповрхности в той и другой группах.
7) Задать линейчатое тело.
Чтобы сформировать грани для тела "грань-грань" в МК
импортировали правую и левую линии (образующие) по отдельности и далее
по отдельности сделали правую полиповерхность и левую, и только затем,
линейчатое тело.
Рис. Для задания данного тела* были импортированы (по отдельности)
две образующие, которые были сначала размножены (с помощью операции "dubl"
см. МК), затем помещены в группы, где разбросаны
в направлении оси z с шагом равным 1, далее по линиям построены полиповерхности
(при t=0 и t=1) и только после этого задано (в диалоге) линейчатое тело.
Задание граней тела через полиповерхности имеет большое значение для моделирования
судовых помещений и их расчетов.
*Примечание. Данное тело было бы проще задать через ближнюю
и заднюю грани (см. рис. ниже и МК), однако в этом
случае не было бы примера формирования линейчатого тела через полиповерхности.
Рассмотрим примеры формирования носовой и кормовой частей корпуса судна
через импортируемые линии, подготовленные в CorelDraw.
Носовая часть каркас и как тело
"Тело" и каркас кормовой части корпуса судна
Можно строить тело и по преобразованным полиповерхностям (в том числе и в МК) строить линейчатое тело
Примечание. Верхняя и нижняя грани выше
тела строились с ошибкой, которая исправлена (см. рис. ниже)
Поверхности 4-х боковых граней (верх, низ, дальняя, ближняя) формируем
по линейному закону, т.е. все они линейчатые поверхности, которые строятся
(в МК) через методы .
Вот полученное тело между двумя гранями, у которого 4 боковых грани
линейчатые поверхности
поверхности
Чтобы грани были изображены яркой стороной, порядок задание ребер
для линейчатых поверхностей в МК кое-где изменен.
В системе "Вектор" (см. меню), чтобы изменить
яркость (внутренность на внешность и наоборот), надо порядок задания граней
(t0-поверхность и t1-поверхность) поменять местами.
Пусть поверхность параллеграмм - косая плоскость (на рис. выше изображена
черным цветом), с другой плоизвольная плоскость. Между поверхностью и плоскостью
(проекции поверхности на нее) образуется трехмерное тело.
Решение. Для построения проекции точки не плоскость используем
метод построения точки на плоскости на наикратчаешем расстоянии от заданной:
Set G2 = PointPointPlane (p71, p72, p73, G1)
Массив проекций точек формируем в полилинии - линий контура второй
(t=1) грани. Определив таким образом линии контура, задача сводится к первой
- построение линейчатого тела "грань-грань"
Или другой пример (МК). Построить линейчатое
тело "Грань-плоскость", где поверхность взята из примера 1, а плоскость
yz.
На первом рисунке показана проекция линии u0 на плоскость yz. Также
строим проеции линии u1 и v0, v1
Следующий шаг - формирование 5 поверхностей (противоположной первой
- на плоскости и 4-х боковушек)
Перед тем как перейти к вычислению площади граней, объема и центра тяжести тел, выполним разбивку граней на 4-угольники и треугольники; тел на 8-гранники.
Есть несколько формул расчета объема тетраэда:
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)
Пример. Задан тетраэдр. Требуется вычислить объем и центр тяжести
(см. в одной МК).
Здесь важно посчитать сумму координат всех точек (в МК сделано для кубиков)
и число кубиков
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 - деление на число точек локальных центров тяжести
кубиков
Рассмотрим еще одну полезную задачу: задать линейчатую поверхность
между произвольной линией и ее проекцией на произвольную плоскость. Данная
задача особенно полезна в расчетах по корпусу судна.
Пусть задан 3-й шпангоут правого и левого бортов.
Требуется структурировать (МК)
область (плоскость) между шпангоутом и ватерлинией. Плоскость ватерлинии
может быть расположено как угодно:
Задать крен на правый или левый борт можно вращением шпангоута на тот
или иной угол
Будем крылышки не треангулировать и их площадь крылышек не считать,
поставив условие: если h структированной области больше высоты плоскости
ватерлинии, то площадь треугольников равна нулю (МК),
и если h меньше, то треугольники рисуем.
Точность расчета площади будет зависеть от того, на сколько треугольников
мы разобьем область под ватерлинией. Хотя видно, что МК работает не совсем
верно: слева треугольники выходят за ватерлинию, справа - не доходят.
Пусть шаг разбивки равен по u и v равен 0.1
Время расчета и вывода рисунка меньше секунды
Площадь под ватерлинией 4.983431...
Пусть шаг разбивки по u и v равен 0.01
В этом случае время работы программы (за счет изображения треугольников
и из размещения в структуру) значительно возрастает ( t = 2 мин ). Видно,
что треугольники лежат более точно под ватерлинией. отсюда возрастает и
точность вычислений:
Если треугольники не изображать, то время расчета площади значительно
сокращается ( t=10 сек )
Аналогочно вычиляется площадь смоченной области шпангоута и в случае
крена.
Шаг по u и v равен 0.05, площадь под рабочей ватерлинией равна 5.6883...
Время расчета и вывода изображений = 0.15 сек
Решение.
Поставить счетчик (МК), сколько точек
и треугольников в структурированной области
Сначала проверим на простом случае. Пусть шаг по u,v =0.25
Все правильно.
Теперь вычислим сколько точек-узлов (для их вычисления в МК
создадим отдельный цикл)?
Все правильно
Далее суммируем координаты точек и делим их на число точек (так вычисляется
центр тяжести). Центр тяжести изобразим окружность красного цвета.
Второй подход - через треугольники - будет заведома неправильный, поэтому
его использовать не будем.
Центр тяжести под ватерлинией при h=2 и шагом u,v=0.05
Центр тяжести "смоченной" области шпангоута при крене -20 градусов:
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
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
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
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
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)
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
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_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
dubl ' дублируем
' Сдвиг
obj.origin(2) = 10
obj.SetH
' далее задание линейчатого тела в диалоге
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_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
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
' Линии 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
' Пусть линия 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
' Пусть линия 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
' Пусть линия 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