Примеры - кухня

VBS объекты. Что было, что есть и что будет
Для каждого типа объекта "Вектора" (или почти для каждого) есть соотвествующий ему тип VBS объекта. Например, для типа "отрезок" есть  тип VBS объекта - "Otrezok". Но сам объект (экземляр) заданного типа в VBS был один  - глобальный. Поэтому раньше надо было
работать следующим образом: Изменить параметры глобального объекта и сохранить его в
"Векторе" (в документе, в структуре); затем, если нужен ещё один такой объект, то опять - изменить параметры глобального и сохранить его методом SaveInDoc.
Сейчас можно создать сколько угодно объектов (локальных) в VBS при помощи функции CreateObject. Например:
          Set line1 = CreateObject("Vector.Otrezok")
          Set line2 = CreateObject("Vector.Otrezok")
  и работать с этими локальными объектами (line1, line2) также как раньше работали с Otrezok.
Если надо, можно сохранить их в "Векторе" методом
  SaveInDoc.
Поэтому сейчас можно работать:
1) одновременно с несколькими объектами одного типа, например, одновременно с 2-мя полилиниями);
2) такие объекты можно передавать целиком как параметры в другие (новые) методы,
например, можно сделать метод пересечения(Cross) 2-х прямых :
            Set p1 = line1.Cross( line2 )
Планируем ещё сделать эти объекты ActivX объектами. Тогда их можно будет вставлять в Веб-страницы, а может, ещё куда.
Старые (глобальные) объекты остались - так  что, старые МК будут работать. Но новые МК лучше делать по новому.

Как создать локальный объект?
1) создать локальный объект
     Set line = CreateObject("Vector.poliline")
2) выполнить какой-нибудь метод для этого объекта, например, вычислить точку:
    Set K  =  line.P(u)
(пример МК)
Вычисление точки на импортируемой полилинии МК - пока не работает, а должно.


Примеры

МК задания некоторых кривых

Некоторые расчеты в элементарной геометрии


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

МК формирования группы из импортируемых линий
Import "E:\Rrr\Napr.dxf", 1
n1=LastNmb
Import "E:\Rrr\Bird.dxf", 0
n2=LastNmb
x1=0
y1=0
n1 = LastNmb  ' n1 - c какого отр. помещать в группу
For u = 0 To 1 Step 0.25
  CurrObjNmb = n1 ' активная направляющая
  Set A = Polyline.P (u)
  CurrObjNmb = n2  ' активная движущая фигура
  Dubl    '  дублирование
  obj.origin(0) = A.x
  obj.SetH
  obj.origin(1) = A.y
  obj.SetH
Next
n2 = LastNmb+1 ' по какой отр. помещать в группу
MoveToGroup n1, n2, "tst group" ' tst group - имя группы - любое



 ' МК формирования группы из линий, перезаданных полилиниями
' Образующую импортируем
 Import "C:\Rrr\Obraz.dxf", 1
 nNapr = LastNmb
Kulak.ss p(0,0,0), 0.6, 0.5, 4
Polyline.FromCurrObj 55 ' 4 отрезков
nObraz = LastNmb
n11 = LastNmb  ' n1 - c какого отр. помещать в группу
For u = 0 To 1 Step 0.1
 CurrObjNmb = nNapr
      Set A = Polyline.P (u)
 CurrObjNmb = nObraz
 dubl
  obj.origin(0) = A.x
  obj.SetH
  obj.origin(1) = A.y
  obj.SetH
Next
n12 = LastNmb+1 ' по какой отр. помещать в группу
MoveToGroup n11, n12, "tst group" ' tst group - имя группы - любое


 МК. Переопределение линий системы в полилинию и вычисление на ней 10 точек от параметра u
Krug.ss p(0,0,0), 5, p(0,0,1)  ' окружность и дальше другие линии
Kvadr.ss p(-5,-4,-1),p(7,-3,-1),p(0,5,5), 0.7
CubBez.ss p(-5,-4,-1),p(7,-3,-1),p(-2,5,5),p(3,5,5),0.6
Lagr4.ss p(-5,-4,-1),p(7,-3,-1),p(-2,5,5),p(3,5,5)
' Sinus.ss p(0,0,0), 3, -180, 360
' Kulak.ss p(0,0,0), 4, 3,5
Polyline.FromCurrObj 55 ' 4 отрезков
CurrObjNmb = LastNmb ' команда делает активной*, созданную (из линии) перед ней полилинию
For u = 0 To 1 Step 0.1
    Set A = Polyline.P (u)
    Ngpoint.ss A
Next
'  *  Обычно этого не требуется делать, но в этом случае - приходится.


МК - пример вращения точки А на угол 180 гоадусов вокруг произвольной оси р1-р2
Set p1 = p(0,0,0)
Set p2 = p(10,0,0)
Set A = p(5,5,0)
Otrezok.ss p1, p2
n1 = LastNmb  ' объект куда помещаем
Ngpoint.ss A  ' объект dhfotybz
Dubl
n2 = InsertIn( n1 ) ' n2 - номер внутри объекта n1
Obj.TurnAround p1, p2, 180
Krug.ss p(5,0,0),5,p(1,0,0) ' - траектория вращения


другой пример Задать прямоугольный лист (а х б) и сложить его пополам
' Решение. Идем от того что у такой фигуры есть
' общее ребро p1-p2 - ось вращения и два прямоугольника
a=4
b=7
Set p1 = p(0,0,0)
Set p2 = p(0,0,7)
Otrezok.ss p1,p2
n1 = LastNmb
Parall.SS2 p(0,0,0), a, -b, p(0,1,0)
Parall.SetNuNvFillColor 0, 0, 250, 0, 0
Parall.SS2 p(0,0,0), -a, -b, p(0,1,0)
Parall.SetNuNvFillColor 0, 0, 250, 0, 250
n2 = InsertIn( n1 ) 'n2 - номер внутри объекта n1
Obj.TurnAround p2, p1, 170   ' метод вращения объекта вокруг оси p1-p2

МК-пример на вращение бедра и голени
 '  Задаем бедро в мировой СК (МСК)
Set p1 = p(0,-1,0)
Set p2 = p(0,-3,0)
Otrezok.ss p1,p2  ' бедро
n1 = LastNmb
'  Голень  в локальной СК (ЛСК)
Set p3 = p(0,0,0)
Set p4 = p(0,-3,0)
Otrezok.ss p3,p4  ' голень
n2 = LastNmb

' передвигаем начало ЛСК голени в т. p2
Obj.origin(0) = p2.x
Obj.origin(1) = p2.y
Obj.origin(2) = p2.z
Obj.SetH

' вставляем текущий объект (голень) в объект n1 (бедро) и тем самым
' привязываем ЛСК голени к бедру
n2 = InsertIn( n1 )  'n2 - номер внутри объекта n1 (бедра)

' Задаем ось вращения бедра в тазу (в МСК)
Set p11 = p(0,-1,0)
Set p12 = p(0,-1,1)
' вращаем бедро (и голень) в МСК
CurrObjNmb = n1
Obj.TurnAround p11, p12, -30

strNmb = n1 & "." & n2
' strNmb -  строковая переменная, равная "<n1>.<n2>. ... <nN>",
'   где <n1> - номер на 0 уровне
'       <n2> - номер на 1 уровне (внутри n1)
'       <nN> - номер на N уровне
' в данном примере strNmb = "0.0"

' устанавливаем текушим объектом объект номер n2 внутри объекта номер n1
CurrObjStrNmb = strNmb     ' можно сразу - CurrObjStrNmb = n1 & "." & n2
 
' Задаем ось вращения голени (в ЛСК голени)
Set p21 = p(0,0,0)
Set p22 = p(0,0,1)
' вращаем голень (ЛСК голени) в СК бедра
Obj.TurnAround p21, p22, -45





Импортировать полинию, состоящую из трех полилиний и залить их цветом
Polyline.AddP(P(0,0,0) )
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
Import "E:\OXK\Komp1.dxf",1
CurrObjNmb = 1
SetFillColor 250, 0, 0
CurrObjNmb = 2
SetFillColor 0, 250, 0
CurrObjNmb = 3
SetFillColor 0, 0, 250
MoveToGroup 0, 4, "group" ' group - имя группы - любое


Худлиния в цикле
' Входные параметры
nc=5 ' Число циклов
nv=250 ' до скольки вперед
if nv > 55 Then nv=55    ' 55 - число отрезков в линии
zd=0.18  ' 0.04 - 25 кадров в сек
nh = 7 ' 15  ' - шаг вперед
ne = 5 ' 14   ' - шаг назад
nk=nh-ne ' разница между шагам вперед и назад

m1=1
m2=4

For I = 0 To nc step 1
 n1 = int(rnd(1)*250)
 n2 = int(rnd(1)*250)
 n3 = int(rnd(1)*250)
 SetColor n1,n2,n3

 For n = nk To nv step nh
  tm=1/(nv-nk)
  Ms=(1-tm)*m1+tm*m2
  obj.scale=Ms
  obj.SetH
  ToPolylineArt n, n-nk
  Delay zd
 
 Next
 For n = nv To nk+1 step -nh
  tm=1/(nk-nv)
  Ms=(1-tm)*m1+tm*m2
  obj.scale=Ms
  obj.SetH
  ToPolylineArt n, n-nk
  Delay zd
 Next
Next



Пример работы с линиями с отрезками на уровне МК
'Krug (круг задан в диалоге)
  Krug.beg(0) = 0
  Krug.beg(1) = 0
  Krug.beg(2) = 0
  Krug.R = 2
  Krug.Draw
  Krug.SaveInDoc

Set V = P(0, 1, 0)

'Параметры по порядку:
' 1) номер линии или группы
' 2) направление (0 - по касат., 1 - по нормали и т. д.)
' 3) случ. угол
' 4) случ. длина
' 5) "Обратное"
' 6) Мин. длина
' 7) Макс. длина
' 8) Постоянный вектор
'  9) Угол X от
' 10) Угол X до
' 11) Угол Y от
' 12) Угол Y до
' 13) Угол Z от
' 14) Угол Z до
' 15) шаг по t
'
LineWithOtr.SS 0, 1, False, True, False, 1, 3, V, 0, 0, 0, 0, 0, 0, 0.001



Макрокоманда - худож. медитации к объекту
'Параметры по порядку:
' 1) число шагов назад
' 2) число шагов вперёд
' 3) "обратный ход"
' 4) число циклов
' 5) число отрезков
' 6) масштаб
' 7) макс. угол
' 8) задержка (в мсек)

PolylineArt.Meditate 2, 3, True, 1, 55, 2, 0., 100



МК_анимации
'Krug
  Krug.Pbeg = P(0, 0, 0)
  Krug.N = P(0, 0, 1)
  Krug.R = 1
  Krug.SaveInDoc
'Параметры по порядку:
' 1) номер линии
' 2) число циклов
' 3) "Обратное"
' 4) скорость
' 5) масштаб
' 6) Угол X от
' 7) Угол X до
' 8) Угол Y от
' 9) Угол Y до
' 10) Угол Z от
' 11) Угол Z до
' 12) шаг по t
Animate 0, 1, False, 1., 2., 0., 0., 0., 0., 0., 0., 0.1


' вечный двигатель (наподобии - только начало)
Set O = p(0,0,0)
Set Pz =p (0,10,0)
Set Okr =p(0,-5,0)
Krug.s 0,0,0,3
Polyline.FromCurrObj  55 ' переделываю круг в полилинию
n1 = LastNmb
Pi=3.14
For ug = Pi/4 To Pi/3 Step Pi/4
 x=4*cos(ug)
 y=4*sin(ug)
 Set Ti = p(x,y,0)
 Polyline.Reset
 Polyline.SaveInDoc ( -1 )
 n2 = LastNmb
  For u = 0 To 1.01 Step 0.05
   CurrObjNmb = n1  ' активизирую 1-ю полилинию
   Set A = Polyline.P (u) ' вычисляю на полилинии точку
   Set Xi = P(A.x,O.y,0)  ' выпорлняю ряд преобразований
   Set k = PerOtrxy (Xi, Pz, O, Ti)' выпорлняю ряд преобразований
   Set TT = p(K.x, A.y, 0)
   CurrObjNmb = n2  ' активизирую 2-ю полилинию
   Polyline.AddP TT ' строю полилинию (не строится нужная)
   UpdateCurrObj ' модифицирую активный объект (2-ю полилинию)
'krug.ss TT, 0.075, p(0,0,1) ' проверка - все нормально
 Next
Next


Mk_sgl
'Параметры по порядку:
' 1) номер линии или группы
' 2) тип сглаживания (0 - квадратич., 1 - Безье и т. д.)
' 3) параметр управления
' 4) радиус
'
Ornament (1)
PolylineSmooth.SS 0, 0, 0.5, 1.0


Mk_sgl1 (пример)

Set p1 =p(0,6,0)     ' точка старта
Set p2 =p(4,0,0)    ' финиш
Set p3 =p(8,6,0)

Polyline.Reset
Polyline.AddP p1
Polyline.AddP p2
Polyline.AddP p3
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
'1) номер линии или группы
'2) тип сглаживания (0 - квадратич., 1 - Безье и т. д.)
'3) параметр управления
'4) радиус
PolylineSmooth.SS n1, 0, 0.5, 1.0  ' при сглаживании ошибка!
Polyline.FromCurrObj 55
Set A = Polyline.P (0.5)
krug.ss A,0.15,p(0,0,1)
SetFillColor 250, 0, 0
 

'Параметры по порядку:
' 1) номер линии или группы
' 2) тип сглаживания (0 - квадратич., 1 - Безье и т. д.)
' 3) параметр управления
' 4) радиус
Ornament (1)
n1 = LastNmb
PolylineSmooth.SS n1, 0, 0.5, 1.0
Import "C:\Otladka\Sglag.dxf", True
CurrObjNmb = LastNmb
n2 = LastNmb
PolylineSmooth.SS n2, 0, 0.5, 1.0
Polyline.FromCurrObj 55
Set B = Polyline.P (0.5)
krug.ss B,0.15,p(0,0,1)
SetFillColor 250, 0, 250



Задание для линейчатого тела граней (t=0 и t=1) - полиповерхностей
' два борта
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
dubl
dubl
dubl
n2 = LastNmb+1 ' по какой
MoveToGroup n_u0, n2, "group" ' group - имя группы - любое
ngr = LastNmb
PolylinesByZ  ngr, 2.0
' Строим полиповерхность справа
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolyPov.SS p(0,0,0), ngr, 20, 20, False, False
 

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

dubl
dubl
dubl
n12 = LastNmb+1 ' по какой
MoveToGroup n_u10, n12, "gr2" ' group - имя группы - любое
ngr2 = LastNmb

' Строим полиповерхность справа
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolylinesByZ  ngr2, 2.0
PolyPov.Reset
PolyPov.SS p(0,0,0), ngr2, 20, 20, False, False

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



Пример определение длины полилинии заданной по счету в группе

group_nmb = CurrObjNmb+1 ' на 1 больше последнего
Import "VBS\ModC1.dxf", False  ' в группу
For obj_nmb = 0 To 5 ' до числа линий в в группе
        CurrObjStrNmb  = group_nmb & "." & obj_nmb
         VBSMsg Polyline.Length
next



group_nmb = CurrObjNmb+1 ' на 1 больше последнего
Import "C:\Bolotov\obraz2.dxf", False  ' в группу
CurrObjStrNmb  = group_nmb & ".0"  '  делаем активным 1 объект в группе
VBSMsg Polyline.Length
Dubl


' Импортируем правый и левый борта вместе
group_nmb = CurrObjNmb+1 ' на 1 больше последнего
Import "C:\Bolotov\obraz2.dxf", False  ' в группу
CurrObjStrNmb  = group_nmb & ".0"  '  делаем активным 1 объект в группе
VBSMsg Polyline.Length
Dubl
Dubl
Dubl
n1 = LastNmb+1 ' по какой
MoveToGroup 1, 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

CurrObjStrNmb  = group_nmb & ".1"  '  делаем активным 1 объект в группе
Dubl
Dubl
Dubl
n1 = LastNmb+1 ' по какой
MoveToGroup 2, n1, "gr2" ' group - имя группы - любое
n12 = LastNmb ' номер 1-й группы линий
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



Вычисление точки на полилинии
Set p1 = p(0,0,0)
Set p2 = p(7,4,1)
Otrezok.ss p1, p2
Polyline.FromCurrObj  11
CurrObjNmb = 1 ' делает активной полилинию
Set plline2 = CreateObject("Vector.Polyline")  ' делаем локальный объект (дубль) полилинии
Set K  =  plline2.P(0.5)  ' вычисляем точку на дубле
Krug.ss K, 0.25, p(0,0,1)


Вычисление точки на импортируемой полилинии
Import "C:\bolotov\ship\hpangout.dxf",1
CurrObjNmb = LastNmb ' делает активной полилинию - пока не ясно
' ниже делаем локальный объект (дубль) полилинии
Set plline2 = CreateObject("Vector.Polyline")
Set K  =  plline2.P(0.5)  ' вычисляем точку на дубле
Krug.ss K, 0.25, p(0,0,1)


Квадрат
 Polyline.Reset
Polyline.AddP p(0,0,0)
Polyline.AddP p(1,0,0)
Polyline.AddP p(10,0,0)
Polyline.AddP p(10,10,0)
Polyline.AddP p(0,10,0)
Polyline.AddP p(0,1,0)
Polyline.AddP p(0,0,0)
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
L = Polyline.Length
VBSMsg "длина полилинии L = " & L
S = Polyline.Area
VBSMsg "площадь S =" & S
Set centr = Polyline.Centroid
Krug.ss centr, 0.25, p(0,0,1)
VBSMsg "x=" & centr.x & "  y=" & centr.y & "  z=" & centr.z


Вращение точки вокруг оси Z
Set O = p(0,0,0)
Set A = p(0,-5,0)
Set A1 = p(0,-5,0)
krug.ss A1, 0.5, p(0,0,1)
ugl=45
A.RotateZ(ugl)
krug.ss A, 0.5, p(0,0,1)
x=A.x
y=A.y
z=A.z
Otrezok.ss O, A
Otrezok.ss O, A1
Otrezok.ss A1, A
VbsMsg x
VbsMsg y
VbsMsg z
t=10
For n=0 To 36 step 1
 A.RotateZ(t)
 krug.ss A, 0.15, p(0,0,1)
Next



LinPovarea
Set p1 = P(0,10,0)
Set p2 = P(10,10,0)
Otrezok.ss p1,p2
n_u0 = LastNmb
Set p3= p(0,0,0)
Set p4= p(10,0,0)
Otrezok.ss p3,p4
n_u1 = LastNmb

LinPov.BaseNmbU0 = n_u0
LinPov.BaseNmbU1 = n_u1
LinPov.Nu = "11"
LinPov.Nv = "11"
LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
Obj.scale = 2
Obj.SetH
CurrObjNmb=LastNmb ' переводится опять в объект, для того чтобы работал масштаб
ar = LinPov.Area
VBSMsg "Площадь  = " & ar
Set Pc = LinPov.centroid
Krug.ss Pc, 0.25,p(0,0,1)



Система из 2-х кубиков
a=5
b=10

Polyline.Reset
Polyline.AddP p(0,0,0)
Polyline.AddP p(0,a,0)
Polyline.AddP p(a,a,0)
Polyline.AddP p(a,0,0)
Polyline.AddP p(0,0,0)
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
c=10

Polyline.Reset
Polyline.AddP p(c,0,0)
Polyline.AddP p(c,b,0)
Polyline.AddP p(c+b,b,0)
Polyline.AddP p(c+b,0,0)
Polyline.AddP p(c,0,0)
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
n2 = LastNmb+1
MoveToGroup n1, n2, "gr"
Set centr = Polyline.Centroid
Krug.ss centr, 0.5, p(0,0,1)
SetFillColor 250, 0, 0

VBSMsg "x=" & centr.x & "  y=" & centr.y & "  z=" & centr.z
 

' Проверка
m1= a*a '- масса 1-го квадрата
m2= b*b '- масса 2-го квадрата

x1=a/2
y1=a/2
Krug.ss p(x1,y1,0), 0.15, p(0,0,1)

x2=c+(b/2)
y2=b/2
Krug.ss p(x2,y2,0), 0.15, p(0,0,1)
Otrezok.ss p(x1,y1,0),p(x2,y2,0)

' Отсюда
Xc=(x1*m1+ x2*m2)/(m1+m2)
Yc=(y1*m1+ y2*m2)/(m1+m2)
Krug.ss p(xc,yc,0), 0.20, p(0,0,1)
VBSMsg "x=" & xc & "  y=  " & yc & "  z=  " & 0

obj.All = True
obj.origin(0) = -9
obj.origin(1) = -4
obj.SetH



Round
Import "C:\Bolotov\Obraz.dxf", 1
RoundPov.BaseNmb = 0
RoundPov.Nu = 12
RoundPov.Nv = 12
' RoundPov.CutThrowNodes = True
RoundPov.SaveInDoc
RoundPov.Draw
ar=RoundPov.area
VBSMsg "Площадь = " & ar
Set Pc = RoundPov.centroid
Krug.ss Pc, 0.25,p(0,0,1)
VBSMsg "Точка: х = " & Pc.x & " Py = " & Pc.y & " Pz = " & Pc.z


KvadrPov
CurrObjNmb=LastNmb
' ar = KvadrPov.area
' Set Pc = KvadrPov.centroid

ar = PolyPov.area
Set Pc = PolyPov.centroid

VBSMsg "area =" &  ar
VBSMsg "x=" & Pc.x & "  y=  " & Pc.y & "  z =  " & Pc.z
Krug.ss pc, 0.25, p(0,0,1)



Ugl
Set A = p(0,0,0)
Set B = p(10,10,0)
Otrezok.ss A, B
ug=otrezok.ugl
VbsMsg ug


' Задание квадратичной поверхности
' линия u0
Set pu00 = p(-1,2,-1) ' начало
Set pu0c = p(3,11,0)  ' cередина
Set pu01 = p(7,5,-1)  ' конец
' линия u1
Set pu10 = p(3,-4,1)  ' начало
Set pu1c = p(7,4,9)   ' середина
Set pu11 = p(10,-2,1) ' конец

Set pv0c = p(0,4,10)   ' середина v0
Set pv1c = p(12,7,7)  ' середина v1

s=0.5 ' полнота кривых

' Непосредственно 4 линии контура
Kvadr.ss pu00, pu01, pu0c, s   ' u0
n1 = LastNmb
Kvadr.ss pu10, pu11, pu1c, s   ' u1
n2 = LastNmb
Kvadr.ss pu00, pu10, pv0c, s   ' v0
n3 = LastNmb
Kvadr.ss pu01, pu11, pv1c, s   ' v1
n4 = LastNmb
'1) т. привязки
'2) номер U0
'3) номер U1
'4) номер V0
'5) номер V1
'6) высота U0
'7) высота U1
'8) высота V0
'9) высота V1
'10) средняя т.
'11) полнота
'12) число U-линий
'13) число V-линий
'14) флаг - проводить по узлам
'15) флаг - внутренность/внешность

KvadrPov.SS P(0, 0, 0), 0, 1, 2, 3, 0, 0, 0, 0, P(0, 0, 0), 0, 10, 10, False, True



Kuns_Import  квадратичная поверхность через импорт линий контура

Import "C:\Otladka\Gruppa_line_kuns.dxf", 1

'1) т. привязки
'2) номер U0
'3) номер U1
'4) номер V0
'5) номер V1

hu0=1              '6) высота U0
hu1=1              '7) высота U1
hv0=1              '8) высота V0
hv1=1              '9) высота V1

Set pc=p(5,-2,10)  '10) средняя т.
s=0.5              '11) полнота

nu=11              '12) число U-линий
nv=11    '13) число V-линий

'14) флаг - проводить по узлам
'15) флаг - внутренность/внешность

KvadrPov.SS P(0, 0, 0), 0, 1, 2, 3, hu0, hu1, hv0, hv1, Pc, s, nu, nv, False, True
n1 = LastNmb

Set centr = KvadrPov.Centroid
ar = KvadrPov.Area

VbsMsg "Площадь  = " & ar
VbsMsg "Центр тяжести x=" & centr.x & "  y=" & centr.y & "  z=" & centr.z

Vector.Krug.ss Vector.p (centr.x,centr.y,centr.z), 0.25, Vector.p(0,0,1)
Vector.SetFillColor 250, 0, 0

Расчет в группе

MoveToGroup n1, n2, "gr"
Set centr = Vector.Centroid(Vector.LastNmb)
ar = Vector.Area(Vector.LastNmb)



' Определить угол наклона отрезка без его изображения и включения в структуру
Set A = p(10,0,0)
Set B = p(0,10,0)
' Свойство - WithSave
' Вкл. сохранение - Vector.WithSave = True
'  Выкл.           - Vector.WithSave = False
Vector.WithSave = False
Otrezok.ss A, B
ug=otrezok.ugl
VbsMsg ug
Vector.WithSave = True
Ngpoint.ss A
Krug.ss p(0,0,0),0.3, p(0,0,1)


' Пример определения угла наклона отрезка на языке VBS
Set p1 = p(0,0,0)
Set p2 = p(10,10,0)

'Set ORT_X = P(1, 0, 0)
Set dp = P(p2.x-p1.x, p2.y-p1.y, p2.z-p1.z)
scal_prod = dp.x
norm = sqr(dp.x*dp.x+dp.y*dp.y+dp.z*dp.z)
' a = arcos(scal_prod/norm)
' Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
 X = scal_prod/norm
a =  Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
a=a*180/3.14
VbsMsg a
Otrezok.ss p1, p2



Вращение точки B вокруг отрезка p1-p2
Set P1 = p(0,0,0)
Set P2 = p(0,0,10)
Set B = p(5,0,0)
Set B1 = p(5,0,0)

Set krug1 = CreateObject("Vector.Otrezok")
krug1.ss B, 0.5, p(0,0,1)
Set Ot1 = CreateObject("Vector.Otrezok")
Ot1.ss p1, p2
Set ott = CreateObject("Vector.Otrezok")
B1.Rotate(ugl,ott)
krug.ss B1, 0.5, p(0,0,1)
Otrezok.ss O, B
Otrezok.ss O, B1
VbsMsg B1.x
VbsMsg B1.y
VbsMsg B1.z



Угол между двумя плоскостями и совмещение их в одну плоскость
Set p1 = P(5, 1, 0)
Set p2 = P(5, 1, 5)
Set p3 = P(-1, 3, 1)
Set p4 = P(2, 7, 0)

Set tri1 = CreateObject("Vector.Trian")
Set tri2 = CreateObject("Vector.Trian")

tri1.ss p1, p2, p3
tri2.ss p1, p2, p4
n1 = LastNmb
ugol = tri1.AngleWith( tri2 )
VBSMsg "ugol=" & ugol
' Повернуть второй треугольник на угол (180-ugol)
CurrObjNmb = n1
s = 180-ugol
Obj.TurnAround p1,p2, -s



развертка косой плоскости, заданной как линейчатая поверхность

Set p00 = P(-1, -1, 0)
Set p01 = P( 1, -1, 0)
Set p10 = P(0, 1, 0)
Set p11 = P(1, 1, 1)

Set U0 = CreateObject("Vector.Otrezok")
Set U1 = CreateObject("Vector.Otrezok")
U0.ss p00, p01
U1.ss p10, p11

LinPov.BaseNmbU0 = 0
LinPov.BaseNmbU1 = 1
LinPov.Nv = 7
LinPov.SaveInDoc
LinPov.CreateLoft



развертка конуса, заданного как линейчатая поверхность
r1=3
r2=1
Krug.ss p(0,0,0),r1, p(0,0,1)
Krug.ss p(0,0,4),r2, p(0,0,1)

LinPov.BaseNmbU0 = 0
LinPov.BaseNmbU1 = 1
LinPov.Nv = "7"
LinPov.SaveInDoc
LinPov.CreateLoft



Parallped.ss2 P(0, 0, 0), 1, 3, 2
VBSMsg "vol=" & Parallped.Volume


Объем 6-гранника
C6Sides.ss P(0, 0, 0), P(0, 2, 0), P(1, 2, 0), P(1, 0, 0), P(0, 0, 3), P(0, 2, 3), P(1, 2, 3), P(1, 0, 3)
VBSMsg "vol=" & C6Sides.Volume


Линейчатая поверхность между линией и плоскостью
Set K1 = p(0,-4,0)
Set K2 = p(10,-4,0)
Set K3 = p(0,-4,10)

Trian.ss k1, k2, k3

Dim Rx
Rx = Array(0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14,16,16,18,18,20,20,22,22,24,26,28,30,0,0,0,0,0,0)
Dim Ry
Ry = Array(0,2,2,-2,-2,2,2,-2,-2,2,2,-2,-2,2,2,-2,-2,2,2,0,0,0,0,0,0,0,0,0,0,0,0)
Dim Rz
Rz = Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
Xb=Rx(0)
Xb=Rx(0)
Xb=Rx(0)

Polyline.Reset
 For n=0 To 13 Step 1
  Polyline.AddP p(Rx(n),Ry(n),0)
 Next
Polyline.SaveInDoc ( ngroup )
Polyline.Draw

n = LinPov.CreateFrom(Polyline, Trian, False)



Линейчатая поверхность2  линий-плоскость
Set p1 = p(0,0,5)
Set p2 = p(7,0,5)
Set p3 = p(7,7,5)
Set p4 = p(0,7,5)

Import "C:\Bolotov\ship2\bok1.dxf", True

Set K1 = p(0,0,5)
Set K2 = p(10,0,7)
Set K3 = p(0,10,5)
' Set K1 = p(0,0,0)

Trian.ss k1, k2, k3
' Parall.ss k1, k2, k3
' если True , то должен быть параллелограм. Если False , то - треугольник

 n = LinPov.CreateFrom(Polyline, Trian, False)
' n = LinPov.CreateFrom(Polyline, Parall, True)



Дуга через две точки
Arc.Sphere P(1, 1, 1), 3, P(0, 1, 0), P(1, 0, 0)


Дуга на сфере через две точки



RoundPov.Sphere P(0, 0, 0), 5, 0, 90, 0, 180
Set A = RoundPov.P (0, 0)
Ngpoint.ss A
Set B = RoundPov.P (0.5, 0.5)
Ngpoint.ss B
Arc.Sphere P(0, 0, 0), 5, A, B
Polyline.FromCurrObj 55
L = Polyline.Length
VbsMsg "длина =  "  & L


' Задание поверхности вращения. Метод RoundPov.ss
' Задаем образующую
Import "C:\Bolotov\obraz.dxf", 1
' RoundPov.Sphere P(0, 0, 0), 5, 0, 90, 0, 180
n1 = LastNmb
RoundPov.ss P(0, 0, 0), n1, 10,10, 0,180
ar=RoundPov.area
VbsMsg "Площадь "  & ar
Set Pc = RoundPov.centroid
Ngpoint.ss Pc



Поверхность-поверхность

Set p11 = P(0,0,0)
Set p12 = P(0,3,0)
Set p13 = P(3,0,0)
Set p14 = P(3,3,0)

Otrezok.ss p11, p12
n1 = LastNmb
Otrezok.ss p13, p14
n2 = LastNmb
Otrezok.ss p11, p13
Otrezok.ss p12, p14

KvadrPov.SS P(0, 0, 0), 0, 1, 2, 3, 2, 2, 2, 2, P(0, 0, 0), 0, 10, 10, False, True

LinPov.BaseNmbU0 = n1
LinPov.BaseNmbU1 = n2
LinPov.Nu = "10"
LinPov.Nv = "10"
' LinPov.CutThrowNodes = True
LinPov.SaveInDoc
 

' Тело пов-пов
'Параметры
'1) номер 1-й пов-ти в структуре
'2) номер 2-й пов-ти в структуре
'Возвращается номер тела в структуре

nBody = CreateLinBody(4, 5)



Плоскость-поверхность

Trian
  Trian.beg(0) = 0
  Trian.beg(1) = 0
  Trian.beg(2) = 2
  Trian.p2(0) = 5.2
  Trian.p2(1) = -0.82
  Trian.p2(2) = 2
  Trian.p3(0) = 4.8
  Trian.p3(1) = 5.14
  Trian.p3(2) = 2
  Trian.Draw
  Trian.SaveInDoc
'Отрезок
  otrezok.beg(0) = 0
  otrezok.beg(1) = 0
  otrezok.beg(2) = 0
  otrezok.end(0) = 8.78
  otrezok.end(1) = 5.98
  otrezok.end(2) = 0
  otrezok.Draw
  otrezok.SaveInDoc
'Отрезок
  otrezok.beg(0) = -1.08
  otrezok.beg(1) = -4.84
  otrezok.beg(2) = 0
  otrezok.end(0) = 10.28
  otrezok.end(1) = -7.76
  otrezok.end(2) = 0
  otrezok.Draw
  otrezok.SaveInDoc
'LinPov
  LinPov.beg(0) = 0
  LinPov.beg(1) = 0
  LinPov.beg(2) = 0
  LinPov.BaseNmbU0 = 1
  LinPov.BaseNmbU1 = 2
  LinPov.Draw
  LinPov.SaveInDoc

' Тело пов-плоскость
'Параметры
'1) номер пов-ти в структуре
'2) объект - треугольник или паралл
'3) если False, то треуг. Иначе - паралл
'Возвращается номер тела в структуре

 nBody = CreateLinBodyFrom(3, Trian, False)
 



Точка пересечения 2-х плоскостей
Set plane1 = CreateObject("Vector.Plane")
plane1.O = P(0, 0, 0) ' свойство - т. на плоскости
plane1.N = P(1, 1, 1) ' свойство - вектор нормали
Set plane2 = CreateObject("Vector.Plane")
plane2.Create P(0, 0, 1), P(1, 0, 1), P(0, 1, 1) ' метод - создать плоскость через 3 точки
Set O = P(0, 0, 0)
Set T = plane1.Cross( plane2, O ) ' метод - пересечь с другой плоскостью: возвращает вектор (направление) пересечения
         ' O -  т. на пересечении
VBSMsg "T.x=" & T.x & " T.y=" & T.y & " T.z=" & T.z
VBSMsg "O.x=" & O.x & " O.y=" & O.y & " O.z=" & O.z

Set plane3 = CreateObject("Vector.Plane")
plane3.Create P(1, 0, 0), P(1, 1, 0), P(1, 0, 1) ' метод - создать плоскость через 3 точки
Set A = plane1.Cross( plane2, plane3 ) ' метод - пересечь с 2-мя плоскостями: возвращает т. пересечения
VBSMsg "A.x=" & A.x & " A.y=" & A.y & " A.z=" & A.z



Osvehenie

' Тень от сферы

h=5  ' расстояние до источкика овещения по оси z

Set p1 = P(0,0,-10)
Set p2 = P(5,0,-10)
Set p3 = P(0,5,-10)
 

RoundPov.Sphere P(0, 0, 0), 1, 0, 360, 0, 180     '  360  - как-то не так
n5 = LastNmb
Set K1=PerSlinePlane (p1,p2,p3, p(0,0,h), p(1,0,0))
Otrezok.ss p(0,0,h), K1

Set K2=PerSlinePlane (p1,p2,p3, p(0,0,h), p(-1,0,0))
Otrezok.ss p(0,0,h), K2

Set K3=PerSlinePlane (p1,p2,p3,p(0,0,h), p(0,1,0))
Otrezok.ss p(0,0,h), K3

Set K4=PerSlinePlane (p1,p2,p3,p(0,0,h), p(0,-1,0))
Otrezok.ss p(0,0,h), K4

Ngpoint.ss k1
Ngpoint.ss k2
Ngpoint.ss k3
Ngpoint.ss k4

Parall.ss k1, k4, k3
n6 = LastNmb

Light.P(0) = 0
Light.P(1) = 0
Light.P(2) = 5

' Light.HalfMaxLightD =1     ' дальняя граница освещения
' Light.MaxLightD =0.5         '  убывание света на половину
 Light.DispersPart = 0.5 ' половина рассеянного
 

' Trian.ss p1, p2, p3
' 1) номер пов-ти -- источника тени
' 2) номер плос-ти (треуг. илипаралл.), куда падает тень
 n = CreateShadow(n5, n6)



CreateObject
Пример исользования локального объекта и всякие вычисления
.....
LinPov.SaveInDoc
' Вычисление точки на поверхности от x,y
Set M = LinPov.Pxy(x, y)
VBSMsg "m.x=" & m.x & " m.y=" & m.y & " m.z=" & m.z
Krug.ss M, 0.1, p(0,0,1)
VBSMsg "ar=" & LinPov.Area ' площадь поверхности
' Задание тела локально
Set C6Surfs = CreateObject("Vector.LinSolid")
  C6Surfs.beg(0) = 0
  C6Surfs.beg(1) = 0
  C6Surfs.beg(2) = 0
  C6Surfs.BaseNmbST0 = 2
  C6Surfs.BaseNmbST1 = 5
  C6Surfs.SaveInDoc
' Вычисление объема, ЦТ и точки на (в) теле
VBSMsg "vol=" & C6Surfs.Volume & " c.x=" & C6Surfs.Centroid.x & " c.y=" & C6Surfs.Centroid.y & " c.z=" & C6Surfs.Centroid.z
VBSMsg "p.x=" & C6Surfs.P(0.5, 0.6, 0.7).x & " p.y=" & C6Surfs.P(0.5, 0.6, 0.7).y & " p.z=" & C6Surfs.P(0.5, 0.6, 0.7).z



GetDocObject
' Пример использования локального объекта, который добавляется в документ (в структуру), а ' доступ к нему   производится через  GetDocObject. Т. о. можно избавится от гл.объектов.
.....
n_body = CreateLinBody( 2, 5 )
Set C6Surfs = GetDocObject(n_body)

VBSMsg "vol=" & C6Surfs.Volume & " c.x=" & C6Surfs.Centroid.x & " c.y=" & C6Surfs.Centroid.y & " c.z=" & C6Surfs.Centroid.z
VBSMsg "p.x=" & C6Surfs.P(0.5, 0.6, 0.7).x & " p.y=" & C6Surfs.P(0.5, 0.6, 0.7).y & " p.z=" & C6Surfs.P(0.5, 0.6, 0.7).z



Вычисления на теле: "квадр. поверхность-плоскость"
' Плоскость

Set p1 = P(0,0,0)
Set p2 = P(0,1,0)
Set p3 = P(1,0,0)

Set p11 = P(-3,0,0)
Set p12 = P(0,3,0)
Set p13 = P(0,-3,0)
Set p14 = P(3,0,0)

Otrezok.ss p11, p12
Otrezok.ss p13, p14
Otrezok.ss p11, p13
Otrezok.ss p12, p14

'1) т. привязки
'2) номер U0
'3) номер U1
'4) номер V0
'5) номер V1
'6) высота U0
'7) высота U1
'8) высота V0
'9) высота V1
'10) средняя т.
'11) полнота
'12) число U-линий
'13) число V-линий
'14) флаг - проводить по узлам
'15) флаг - внутренность/внешность

KvadrPov.SS P(0, 0, 0), 0, 1, 2, 3, 2, 2, 2, 2, P(0, 0, 0), 0, 10, 10, False, True
n33 = LastNmb
' Set A = KvadrPov.Pxy(0, 0) ' пока не работает
' VBSMsg "x=" & a.x & " y=" & a.y & " z=" & a.z
' Krug.ss p(a.x,a.y,a.z), 0.2, p(0,0,1)
VBSMsg "ar=" & KvadrPov.Area ' площадь поверхности

' Trian.ss p1, p2, p3
Parall.ss p1, p2, p3
nBody = CreateLinBodyFrom(n33, Trian, False) ' тело поверхность-плоскость
' Set C6Surfs = CreateObject("Vector.LinSolid")

Set C6Surfs = GetDocObject(nBody)
VBSMsg "vol=" & C6Surfs.Volume ' объем тела
VBSMsg " c.x=" & C6Surfs.Centroid.x & " c.y=" & C6Surfs.Centroid.y & " c.z=" & C6Surfs.Centroid.z
VBSMsg "p.x=" & C6Surfs.P(0.5, 0.6, 0.7).x & " p.y=" & C6Surfs.P(0.5, 0.6, 0.7).y & " p.z=" & C6Surfs.P(0.5, 0.6, 0.7).z
Set A = C6Surfs.Centroid
Krug.ss A, 0.1, p(0,0,1)
Set B= C6Surfs.P(0.5, 0.6, 0.7)
Krug.ss B, 0.2, p(0,0,1)



Вычисления на теле2: Теле "поверхность-поверхность"

Set p1 = P(0,0,0)
Set p2 = P(0,1,0)
Set p3 = P(1,0,0)

Set p11 = P(-3,0,0)
Set p12 = P(0,3,0)
Set p13 = P(0,-3,0)
Set p14 = P(3,0,0)

Otrezok.ss p11, p12
n1 = LastNmb
Otrezok.ss p13, p14
n2 = LastNmb
Otrezok.ss p11, p13
Otrezok.ss p12, p14

'1) т. привязки
'2) номер U0
'3) номер U1
'4) номер V0
'5) номер V1
'6) высота U0
'7) высота U1
'8) высота V0
'9) высота V1
'10) средняя т.
'11) полнота
'12) число U-линий
'13) число V-линий
'14) флаг - проводить по узлам
'15) флаг - внутренность/внешность

KvadrPov.SS P(0, 0, 0), 0, 1, 2, 3, 2, 2, 2, 2, P(0, 0, 0), 0, 10, 10, False, True
' Set A = KvadrPov.Pxy(0, 0)
' VBSMsg "x=" & a.x & " y=" & a.y & " z=" & a.z
' Krug.ss p(a.x,a.y,a.z), 0.2, p(0,0,1)
VBSMsg "ar=" & KvadrPov.Area ' площадь поверхности

n11= LastNmb
' Trian.ss p1, p2, p3
' Parall.ss p1, p2, p3

LinPov.BaseNmbU0 = n1
LinPov.BaseNmbU1 = n2
LinPov.Nu = "10"
LinPov.Nv = "10"
' LinPov.CutThrowNodes = True
LinPov.SaveInDoc
LinPov.Draw
n12 = LastNmb

nBody = CreateLinBody(n11, n12) ' линейчатое тело поверхность-поверхность
Set C6Surfs = GetDocObject(nBody)

VBSMsg "vol=" & C6Surfs.Volume ' объем тела
VBSMsg " c.x=" & C6Surfs.Centroid.x & " c.y=" & C6Surfs.Centroid.y & " c.z=" & C6Surfs.Centroid.z
VBSMsg "p.x=" & C6Surfs.P(0.5, 0.6, 0.7).x & " p.y=" & C6Surfs.P(0.5, 0.6, 0.7).y & " p.z=" & C6Surfs.P(0.5, 0.6, 0.7).z
Set A = C6Surfs.Centroid
Krug.ss A, 0.1, p(0,0,1)
Set B= C6Surfs.P(0.5, 0.6, 0.7)
Krug.ss B, 0.2, p(0,0,1)



Расчеты: полиповерхность-полиповерхность
' Задаем правый борт отдельно
Import "C:\Bolotov\ship\ship_test.dxf", 0
n1 = LastNmb ' номер 1-й группы линий
PolylinesByZ  n1, 2.0   ' раскидать по z с шагом 2
' Строим полиповерхность слева
'1) т. привязки
'2) номер группы
'3) число U-линий
'4) число V-линий
'5) флаг - проводить по узлам
'6) флаг - внутренность/внешность
PolyPov.SS p(0,0,0), n1, 10, 10, False, False
n11=LastNmb
ar = PolyPov.area ' площадь поверхности
Set Pc = PolyPov.centroid
VBSMsg "area =" &  ar
VBSMsg "x=" & Pc.x & "  y=  " & Pc.y & "  z =  " & Pc.z
Krug.ss pc, 0.15, p(0,0,1)
SetFillColor 250, 0, 0

' Вычисление точки на полиповерхности от x,y
Set M = PolyPov.Pxy(0, 0)
VBSMsg "m.x=" & m.x & " m.y=" & m.y & " m.z=" & m.z
Krug.ss M, 0.1, p(0,0,1)
 

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
n12=LastNmb
ar = PolyPov.area
Set Pc = PolyPov.centroid
VBSMsg "area =" &  ar
VBSMsg "x=" & Pc.x & "  y=  " & Pc.y & "  z =  " & Pc.z
Krug.ss pc, 0.15, p(0,0,1)
SetFillColor 250, 0, 0

' Вычисление точки на полиповерхности от x,y
Set M = PolyPov.Pxy(-2.5, 1)
VBSMsg "m.x=" & m.x & " m.y=" & m.y & " m.z=" & m.z
Krug.ss M, 0.1, p(0,0,1)

' Строим тело: полиповерхность-полиповерхность
nBody = CreateLinBody(n11, n12)
Set C6Surfs = GetDocObject(nBody)

VBSMsg "vol=" & C6Surfs.Volume ' объем тела
' Вычисления ЦТ, точки от u,v,t
VBSMsg " c.x=" & C6Surfs.Centroid.x & " c.y=" & C6Surfs.Centroid.y & " c.z=" & C6Surfs.Centroid.z
VBSMsg "p.x=" & C6Surfs.P(0.5, 0.6, 0.7).x & " p.y=" & C6Surfs.P(0.5, 0.6, 0.7).y & " p.z=" & C6Surfs.P(0.5, 0.6, 0.7).z
Set A = C6Surfs.Centroid
Krug.ss A, 0.1, p(0,0,1)
Set B= C6Surfs.P(0.5, 0.6, 0.7)
Krug.ss B, 0.2, p(0,0,1)



Вычисления на теле "пов.вращения-пов.вращения"
' RoundPov.Sphere P(0, 0, 0), 5, 0, 90, 0, 180
n1 = LastNmb
RoundPov.ss P(0, 0, 0), n1, 10,10, 0,180
n11=LastNmb
ar=RoundPov.area
VbsMsg "Площадь "  & ar
Set Pc = RoundPov.centroid
Ngpoint.ss Pc

' Вычисление точки на поверхности от x,y
'Set M = RoundPov.Pxy(0, 0)
'VBSMsg "m.x=" & m.x & " m.y=" & m.y & " m.z=" & m.z
'Krug.ss M, 0.1, p(0,0,1)
' задаем 2-ю поверхность вращения
Import "C:\Bolotov\obraz.dxf", 1
RoundPov.ss P(0, 0, 0), n1, 10,10, 0,-180
n12=LastNmb
' Задаем тело
nBody = CreateLinBody(n11, n12)
' тело и расчеты
Set C6Surfs = GetDocObject(nBody)
VBSMsg "vol=" & C6Surfs.Volume ' объем тела
VBSMsg " c.x=" & C6Surfs.Centroid.x & " c.y=" & C6Surfs.Centroid.y & " c.z=" & C6Surfs.Centroid.z
VBSMsg "p.x=" & C6Surfs.P(0.5, 0.6, 0.7).x & " p.y=" & C6Surfs.P(0.5, 0.6, 0.7).y & " p.z=" & C6Surfs.P(0.5, 0.6, 0.7).z
Set A = C6Surfs.Centroid
Krug.ss A, 0.1, p(0,0,1)
Set B= C6Surfs.P(0.5, 0.6, 0.7)
Krug.ss B, 0.2, p(0,0,1)



Группа тел (объем, ЦТ)
Set p1 = p(-6,0,0)
Set p2 = p(0,0,0)
Set p3 = p(-6,4,0)
Set p4 = p(0,4,0)

Set p5 = p(1.6,-3.5,0)
Set p6 = p(5.5,-3.5,0)
Set p7 = p(1.6,0,0)
Set p8 = p(5.5,0,0)

Set p9 = p(3,2,0)
Set p10 = p(7,2,0)
Set p11 = p(3,5,0)
Set p12 = p(7,5,0)

Otrezok.ss p1,p2
Otrezok.ss p3,p4
Otrezok.ss p5,p6
Otrezok.ss p7,p8
Otrezok.ss p9,p10
Otrezok.ss p11,p12

LinPov.BaseNmbU0 = 0
LinPov.BaseNmbU1 = 1
LinPov.Nu = "12"
LinPov.Nv = "12"
LinPov.SaveInDoc
LinPov.Draw
n11=LastNmb
dubl
obj.origin(2) = 4
obj.SetH
n12=LastNmb

LinPov.BaseNmbU0 = 2
LinPov.BaseNmbU1 = 3
LinPov.Nu = "12"
LinPov.Nv = "12"
LinPov.SaveInDoc
LinPov.Draw
n13=LastNmb
dubl
obj.origin(2) = 4
obj.SetH
n14=LastNmb

LinPov.BaseNmbU0 = 4
LinPov.BaseNmbU1 = 5
LinPov.Nu = "12"
LinPov.Nv = "12"
LinPov.SaveInDoc
LinPov.Draw
n15=LastNmb
dubl
obj.origin(2) = 4
obj.SetH
n16=LastNmb
' создаем три тела
nBody1 = CreateLinBody(n11, n12)
n21 = LastNmb
nBody2 = CreateLinBody(n13, n14)
nBody3 = CreateLinBody(n15, n16)
n22 = LastNmb+1
MoveToGroup n21, n22, "gr"
n31 = LastNmb
V = Volume(n31) ' объем группы тел
VBSMsg "vol=" & V
Set C = Centroid(n31) ' вычисление ЦТ группы тел
VBSMsg " c.x=" & c.x & " c.y=" & c.y & " c.z=" & c.z
Krug.ss C, 0.1, p(0,0,1)



Пересечение плоскостей
Set plane1 = CreateObject("Vector.Plane")
plane1.Create P(0, 0, 0), P(1, 0, 0), P(0, 1, 0) ' метод - создать плоскость через 3 точки
Trian.ss P(0, 0, 0), P(1, 0, 0), P(0, 1, 0)

Set plane2 = CreateObject("Vector.Plane")
plane2.Create P(0, 0, 0), P(1, 0, 0), P(0, 0, 1) ' метод - создать плоскость через 2 точки
Trian.ss P(0, 0, 0), P(1, 0, 0), P(0, 0, 1)
Set O = P(0, 0, 0)
Set T = plane1.Cross( plane2, O ) ' метод - пересечь с другой плоскостью: возвращает вектор
                                    ' (направление) пересечения
      ' O -  т. на пересечении
Ngpoint.ss T
Ngpoint.ss O

VBSMsg "T.x=" & T.x & " T.y=" & T.y & " T.z=" & T.z
VBSMsg "O.x=" & O.x & " O.y=" & O.y & " O.z=" & O.z

Set plane3 = CreateObject("Vector.Plane")
plane3.Create P(0, 0, 0), P(0, 1, 0), P(0, 0, 1) ' метод - создать плоскость через 3 точки
Trian.ss P(0, 0, 0), P(0, 1, 0), P(0, 0, 1)
Set A = plane1.Cross( plane2, plane3 ) ' метод - пересечь с 2-мя плоскостями: возвращает т. пересечения
Ngpoint.ss A
VBSMsg "A.x=" & A.x & " A.y=" & A.y & " A.z=" & A.z



Пересечение плоскостей 2

Set plane1 = CreateObject("Vector.Plane")
' plane1.O = P(0, 0, 0) ' свойство - т. на плоскости
' plane1.N = P(1, 1, 1) ' свойство - вектор нормали

plane1.Create P(1, 0, 0), P(0, 1, 0), P(0, 0, 1) ' метод - создать плоскость через 2 точки

Set plane2 = CreateObject("Vector.Plane")
plane2.Create P(0, 0, 1), P(1, 0, 1), P(0, 1, 1) ' метод - создать плоскость через 2 точки
Trian.ss P(0, 0, 1), P(1, 0, 1), P(0, 1, 1)
Set O = P(0, 0, 0)
Set T = plane1.Cross( plane2, O ) ' метод - пересечь с другой плоскостью: возвращает вектор
                                    ' (направление) пересечения
      ' O -  т. на пересечении
Ngpoint.ss T
Ngpoint.ss O

VBSMsg "T.x=" & T.x & " T.y=" & T.y & " T.z=" & T.z
VBSMsg "O.x=" & O.x & " O.y=" & O.y & " O.z=" & O.z

Set plane3 = CreateObject("Vector.Plane")
plane3.Create P(1, 0, 0), P(1, 1, 0), P(1, 0, 1) ' метод - создать плоскость через 3 точки
Trian.ss P(1, 0, 0), P(1, 1, 0), P(1, 0, 1)
Set A = plane1.Cross( plane2, plane3 ) ' метод - пересечь с 2-мя плоскостями: возвращает т. пересечения
Ngpoint.ss A
VBSMsg "A.x=" & A.x & " A.y=" & A.y & " A.z=" & A.z



Расчет координат точек на полилинии от переменной х

Polyline.Reset
Polyline.AddP P(0, 0, 0)
Polyline.AddP P(1, 1, 0)
Polyline.AddP P(2, 1, 0)
Polyline.AddP P(3, 0, 0)
Polyline.SaveInDoc  -1

VBSMsg " x=" & Polyline.Px(0.5, 0).x & " y=" & Polyline.Px(0.5, 0).y & " z=" & Polyline.Px(0.5, 0).z
VBSMsg " x=" & Polyline.Px(1.5, 0).x & " y=" & Polyline.Px(1.5, 0).y & " z=" & Polyline.Px(1.5, 0).z
VBSMsg " x=" & Polyline.Px(2.5, 0).x & " y=" & Polyline.Px(2.5, 0).y & " z=" & Polyline.Px(2.5, 0).z
Set A = Polyline.Px(0.5, 0)
Ngpoint.ss A
Set A = Polyline.Px(1.5, 0)
Ngpoint.ss A
Set A = Polyline.Px(2.5, 0)
Ngpoint.ss A

x1=Polyline.Px(2.1, 0).x
y1=Polyline.Px(2.1, 0).y
z1=Polyline.Px(2.1, 0).z
Ngpoint.ss p(x1,y1,z1)
' Метод Px для полилинии. См. МК Параметры
'           1) x - значение арумента функции
'           2) n - число точек на линии для преобразования в полилинию --
'           необходимо для других линий (n > 1). Для полилинии - без разницы



Линии в системе Вектор и точка p(х)

Set p1 =p(-3,2,0)
Set p2 =p(3,2,0)
Set p3 =p(-1,5.1,0)
Set p4 =p(1,3,0)

Lagr4.ss p1,p2,p3,p4 ' обращение
' Width=220
SetWidthColor 155, 250, 155, 0
Polyline.FromCurrObj (55)
Set A = Vector.Polyline.Px(2, 0)
Ngpoint.ss A
SetColor 250, 0, 0

Set A = Lagr4.Px(2, 55)
Ngpoint.ss A

Set p1 =p(-3,1,0)
Set p2 =p( 5,1,0)
Set p3 =p(-1,-1,0)
Set p4 =p( 1,3,0)

Otrezok.ss p1, p3
Otrezok.ss p2, p4

s=0.7
CubBez.ss p1,p2,p3,p4,s ' обращение к методу
SetWidthColor 155, 250, 0, 0
Polyline.FromCurrObj (55)
Set A = Vector.Polyline.Px(2, 0)
Ngpoint.ss A
SetColor 250, 0, 0
Set A = CubBez.Px(2, 55)
Ngpoint.ss A
SetColor 0, 250, 0
 

' Text.ss  p(-3,0.7,0),  "Квадратичная "

Set p1 =p(-3,0,0)
Set p2 =p( 3,0,0)
Set p3 =p(-2,6,0)

s=0.5
Kvadr.ss p1,p2,p3,s ' обращение к методу
SetWidthColor 155, 250, 0, 0
Polyline.FromCurrObj (155)
Set A = Vector.Polyline.Px(2, 0)
Ngpoint.ss A
SetColor 250, 0, 0
Set A = Kvadr.Px(2, 55)
Ngpoint.ss A
SetColor 0, 250, 0
 

' Text.ss  p(-2,-0.75,0),  "cинус"

Set p1 =p(-2,-2,0)
Sinus.ss p1,0.5,0,1000
SetWidthColor 155, 250, 0, 0
Polyline.FromCurrObj (55)
Set A = Vector.Polyline.Px(2, 0)
Ngpoint.ss A
SetColor 250, 0, 0
Set A = Sinus.Px(2, 55)
' Ngpoint.ss A

Arc.ss p(0,0,0), 2, 5, 0, 360, p(0,0,1), 0
SetWidthColor 155, 250, 0, 0
Polyline.FromCurrObj (55)
Set A = Vector.Polyline.Px(2, 0)
Ngpoint.ss A
SetColor 250, 0, 0
Set A = Arc.Px(2, 99)
Ngpoint.ss A
SetColor 0, 250, 0

Krug.ss p(0,0,0), 4, p(0,0,1)  ' круг из центра
SetWidthColor 155, 250, 0, 0
Polyline.FromCurrObj (55)
Set A = Vector.Polyline.Px(2, 0)
Ngpoint.ss A
SetColor 250, 0, 0
Set A = Krug.Px(2, 99)
' Ngpoint.ss A

Set p1 =p(-2.5,-1,0) ' круг не из центра
Krug.ss p1, 6, p(0,0,1)
SetWidthColor 155, 250, 0, 0
Polyline.FromCurrObj (55)
Set A = Vector.Polyline.Px(2, 0)
Ngpoint.ss A
SetColor 250, 0, 0
Set A = Krug.Px(2, 55)
Ngpoint.ss A



' сглаженная полилиния
Dim Rx
Rx = Array(0,0,2,2,4,4,6,6,8,8,10,10,12,12)
Dim Ry
Ry = Array(-6,2,2,-2,-2,2,2,-2,-2,2,2,-2,-2,-6)
Otrezok.ss p(0,0,0), p(5,0,0)
Otrezok.ss p(0,0,0), p(0,4,0)
Polyline.Reset
 For n=0 To 13 Step 1
  Polyline.AddP p(Rx(n),Ry(n),0)
 Next
Polyline.SaveInDoc ( ngroup )
Polyline.Draw
n1=LastNmb
ln = Polyline.Length
VBSMsg ln
SetWidthColor 155, 0, 0, 250
PolylineSmooth.SS n1, 2, 0.5, 1.0
Set A = Vector.PolylineSmooth.Px(3, 55)
Ngpoint.ss A
Text.ss A, "А"


Точки мин и мах на полилинии
Polyline.Reset
Polyline.AddP P(0, 0, 0)
Polyline.AddP P(1, 1, 0)
Polyline.AddP P(2, 1, 0)
Polyline.AddP P(3, 0, 0)
Polyline.SaveInDoc  -1

VBSMsg " PYminX=" & Polyline.PYmin(10).x & " PYminY=" & Polyline.PYmin(10).y & " PYminZ=" & Polyline.PYmin(10).z
VBSMsg " PYmaxX=" & Polyline.PYmax(10).x & " PYmaxY=" & Polyline.PYmax(10).y & " PYmaxZ=" & Polyline.PYmax(10).z
Set Pmin = Polyline.PYmin(10)
Ngpoint.ss Pmin
Set Pmax = Polyline.PYmax(10)
Ngpoint.ss Pmax



МК вычисления точек мин и мах на полиповерхности - выполнять команду "макрокоманду"
VBSMsg " PZminX=" & PolyPov.PZmin(11, 11).x & " PZminY=" & PolyPov.PZmin(11, 11).y & " PZminZ=" & PolyPov.PZmin(11, 11).z
VBSMsg " PZmaxX=" & PolyPov.PZmax(11, 11).x & " PZmaxY=" & PolyPov.PZmax(11, 11).y & " PZmaxZ=" & PolyPov.PZmax(11, 11).z
Set Pmin = PolyPov.PZmin(11, 11)
Ngpoint.ss Pmin
Set Pmax = PolyPov.PZmax(11, 11)
Ngpoint.ss Pmax


// Пересечение конуса произвольной плоскостью МК на .js
// задаем плоскость сечения
var p1 =p(2,5,1)
var p2 =p(6,5,1)
var p3 =p(3,1,1)
// Otrezok.ss (p2,p3)
Trian.ss (p1, p2, p3)
n1 = LastNmb ()
// задаем плоскость уровня 0
var A =p(0,0,0)
var B =p(1,0,0)
var C =p(0,1,0)
Trian.ss (A, B, C)
n2 = LastNmb()
RoundPov.Cone (p(0,0,0), 2, 3, p(0,1,0))  // задаем конус
PlaneToPlane (n1,n2) // преобразование плоскости в плоскость
CreateIzolines(0, 0)  // одно сечение конуса на нулевом уровне
// Примечание, чтобы сделать линию сечения более плавной, в диалоге конус перезадайте // (редактирование) большим числом сечений по u.

Сделано (октябрь 2003) :

1) Метод: точка от x, y на полиповерхности и других поверхностях за исключением сглаженной (сглаженную сделать вновь полиповерхностью).
2) Если стоит знак случайно, то фон задается случайным цветом.
3) В медитации  угол поворота (равномерный) вокруг всех осей от _0__  до  _360_ .
4) Обобщенный конус на преобразованный контур.
5) Свойство Lock (замкнуть документ) в Вектор
  Пример:
        Set doc  = CreateObject("Vector.Document")
        doc.Lock = True
  --- документ - замкнут и при выходе из этого скрипта документ (и
  окно) удалятся не будут. Если хошь отомкнуть документ в этом или в
  другом скрипте поставь
        doc.Lock = False
6) Расчеты (для групп тоже):
     - объема тел "грань-грань";
     - объема тел "грань-плоскость";
     - центр тяжести тел.
Проверено для пов-пов, квадратичная-квадратичная, полиповерхность-полиповерхность
6) Метод пересечение трех плоскостей.


Иправленные ошибки (декабрь 2003)

Анимация полилинии, кулачка, поверхностей, поверхностей с фактурой, групп:
полилиния работает, кулачек работает, линейчатая и поверхность вращения  есть, поверхность вращения с фактурой есть, квадратичная поверхность есть (правда, фактура лезет из 1-го сеанса), полиповерхность есть, группа, группа групп в анимации работают.

1) Заливка тел и групп другим цветом (исправили - работает).
2) Отрезок не идет под низ картины (работает)
3) Часто (линия с отрезками) попытка выйти по Esc и Cancel приводит к аварийному выходу (вроде бы нормально).
4) Если не задан фон и пытаешься его удалить, то происходит вылет в С++ (работает нормально)
5) Если объект не задан и обращаешься к «Активному  объекту», то система вылетает (работает).
6) Ошибка при задании выступов у кулачка (мусор) (через МК нормально) (исправлено)
7) Ракурсные преобразования  для группы (сначала преобразовать в группу  полилинии) (исправлено).
8) Неправильно задается параллелограмм
Parall.ss p2, p3, p4
Parall.s p2.x,p2.y,p2.z,p3.x,p3.y,p3.z,p4.x,p4.y,p4.z  - вроде бы все нормально

9)  При ракурсных преобразованиях:
1) задал параллепипед
2) сделал для него ракурсные преобразования х=10,y=10, z=10
3) Закрыл окно
4) Открыл новое окно
5) ничего не задаешь входишь в ракурсные,
6) там остается старое имя Параллепипед
7) Пытаешься  сделать для него ракурсные система вылетает
(исправлено)
 

3) В случае "Случайных преобразованиях"  число пропущенных точек и число обрабатываемых - не работает (исправлено - стало здорово!).

5) Арт-линия в МК не работает для преобразованных в полилинию (надо поместить в группу - там все нормально)

10) Текст в новой версии не фиксируется, в структуре он есть и, если двигать, то появляется
Это общая проблема (НАПРИМЕР, И ДЛЯ ТОЛЛЩИНЫ линий ), оставшаяся от DirectX < 8.
Текст частично рисуется в GDI, а в DirectX вооще не рисуется.
В DirectX9 можно рисовать в GDI с сохранением рисунка. Но для этого
надо РЕАЛЬНО перейти в DirectX9 и сообразить - какие объекты и когда
рисовать в GDI, а какие в DirectX (сделано).

2) При перемещение в структуре полилинии в полилинию система остается в диспетчере структуры (исправлено).

1) При задании полиповерхности (пример с кубиком см. МК), замыкая ее на первую линию: сначала идет все нормально, потом при выходе из сеанса система виснет!
Причем, если выполнешь построения полиповерхности в МК, (для 2-х  последних строк комментарии убрать), то все нормально (Исправлено)

2) "Грань-грань" из поверностей вращения, полиповерхностей не идет (исправлено)
5) Сетка при рисовании исчезает (исправлено)
3) Нет метода задания цвета тела (сделано)

4) При выводе рисунка из скрипта, чтобы рисунок сделать видимым, приходится немного рамку сдвинуть (исправлено: надо в конце скрипта на JS ставить строку: Vector.RefreshImage();
на VBS строка без скобок: Vector.RefreshImage).
5) Сглаженную полиповерхность сделать вновь полиповерхностью (сделано)
6) Метод сглаживания полиповерхности (сделано)
7) Преобразование граней тел в полилинии (сделано).
8) Развертки нелинейчатых поверхностей (сделано).
9) При выходе из скрипта с рисунками в "Вектор" нет структуры (исправлено).
10) Вычисление координаты z на линиях (окружность и т.д.) от переменной x - исправлено
11) Задаешь ракурсные преобразования группы (в которой есть отрезки) происходит аварийный выход (исправлено).
12. Сделана толщина линий*
13. Сделана правильная заливка вогнутых полилиний, но хитро: чтобы вогнутая заливалась нормально, надо задать у неё толщину отличную от 0, например - 1. (у полилинии, но не у кулочка, например). Линии рисуются двумя способами: через DX или через GDI.
Когда как рисовать, различается по толщине: если толщина равна 0, то рисуется через DX.
14. Техт выводится нормально.
* Три задачи решены при переходе полностью на DirectX9.


 Ошибки:

1) Часто выдает "Нарушение совместного использования" (пример зайти в Вектор в МК вызвать TCH2, потом Tch3).
2) При нажатии Esc иногда происходит аварийный вылет из системы.
3) Вектор продолжает иногда "висеть" в диспетчере задач (Ngmp_giperkub.html).
4) .bmp - выводится неправильно! Файл видит только  Pаint и
5) При выключенной структуре - запускаешь МК - происходит вылет

Надо сделать:

4. "Полет"
    4.1 Ввести команду "Стоп"
    4.2.Ввести команду "Обратный  ход"
    4.3. "Включить перспективу" для полета сделать автоматически
    4.4.  Выделить "Полет" в отдельное меню с командами выше.

5. Нет метода преобразование поверхностей в группу полилиний ( это возможно только в диалоге).
6) Подправить кое-где параметы по умолчанию (200 -> 33)



Надо бы сделать и исправить:
1) Создание группы по номерам (хотя бы до 10).
2) Кривизна поверхности от ху в заданном направлении.
3) Задания типа орнамент из диалога.
4) Происходит просвечивание тел!!!!
5) Исправить: в скриптах там,  где выход на Вектор надо поставить (опять же там где надо) Lock (замкнуть, отомкнуть).
6) С "трубой" разобраться - неправильное задание числа линий выдает на конце кручение.


Ошибки по скриптам и .js
1)  Не та кодировка: Dxf_polygon,  Dxf_polygon_kulak.htm
2) При выходе из Вектора после запуска скрипта гайка происходит аварийный выход
4) obj.All = True - не работает .js (ставить  цифру)
5) Ngpoint.ss (t7)
    Krug.ss (t7, 0.5, p(0,0,1))  - окружность не походит через t7
6. Здесь в js чехарда!!! // Рисуем голову человечка не в том месте
Ngpoint.ss (t7)
Krug.ss (t7, 0.5, p(0,0,1))
Krug.ss (p(t7.x,t7.y,t7.z), 0.5, p(0,0,1))
В скрипте на .js не идет
Vector.Arc.ss (Vector.p(0,h/2,0), r, r, (-90), 90, Vector.p(0,1,0), 0)
Vector.Arc.Sphere ( Vector.p(0, h/2, 0), r, Vector.p(0,  r, 0), Vector.p(0, (h/2*1+ r), 0))
Vector.Polyline.FromCurrObj (15);

 



 Ошибки
2004 февраль
1. Задаешь (по ошибке) на активную заданную изолинию построить изолинии - вылет.
2. Пытаешься поместить поверхность в группу - вылет! (исправлено)
3. Пытаешься 77ю вытащить из группы - вылет!  (исправлено)


 Ошибки
2004 апрель

1) Через скрипты не работают
1.1. Полиповерхность
1.2. Квадратичная
2) Не стротся Trian.ss
Set K1 = p(0,0,0)
Set K2 = p(10,0,0)
Set K3 = p(0,0,10)
' Set K1 = p(0,0,0)
' Trian.ss k1, k2, k3
3) Из скрипта не идет линийчатая поверхность линия - плокость:
n = LinPov.CreateFrom(Polyline, Parall, True)



// Задаем поверхность (от чего тень):  линейчатое кольцо
 Vector.Krug.ss (Vector.p(0,0,0), 1, Vector.p(1,0,0))
 var n1 = Vector.LastNmb()
 Vector.Krug.ss (Vector.p(0,0,0), 0.1, Vector.p(1,0,0))
 var n2 = Vector.LastNmb()
 Vector.LinPov.BaseNmbU0 = n1
 Vector.LinPov.BaseNmbU1 = n2
 Vector.LinPov.Nu = "10"
 Vector.LinPov.Nv = "10"
 Vector.LinPov.SaveInDoc ()
 Vector.LinPov.Draw()
 var n1 = Vector.LastNmb()
 // задаем плоскость - куда тень
var p1 = Vector.P(-9,-5,0)
 var p2 = Vector.P(-9,5,0)
 var p3 = Vector.P(-9,5,5)
 Vector.Parall.ss (p1, p2, p3)
 var n2 = Vector.LastNmb()
 var n = Vector.CreateShadow(n1, n2)
// n1 -  номер пов-ти -- источника тени
// n2 -  номер плос-ти (треуг. илип аралл.), куда падает тень
Внимание! Из скрипта метод не работае. В диалоге тень строится но статеся на том же месте, что и источник.