Сферическая геометрия

Методы (pdf

n/n

Имя МКфункции и передаваемые/принимаемые параметры

назначение

Входные 
параметры

Выходные 
параметры

1

Set A = PointSfera(hr, dl, Rr, Fi)

Точка на горизонтной сфере и сфере Мира

 hr, dl, Rr, Fi - широта, долгота, радиус земли (в масштабе), угол поворота оси Мира 

Искомая точка 

2

Set D=p(0,0,0) ‘пустышка 
Set Q =  Sf_treug (A.B,C,D) 
На выходе: в Q три 2-гранных угла, в D –  углы дуг

Расчет сферического треугольника:

А,B,C - вершины 

D - пустышка

На выходе: 
в Q три 2-гранных угла, 
в D –  углы дуг

3

Set K=  Per_line (n1, n2) 
n1 - номер 1-й линии 
n2 – номер 2-й линии

Пересечение двух линий

n1 - номер 1-й линии 
n2 – номер 2-й линии

 Точка пересечения или ближайшая на 2-й линии к 1-й 

4

 Ugol = Ugol_gug (A,O,B)

Угол AOB 

Точки A,O,B

 Угол

5

polyline.sphere A, B, Rr 
polyline.SaveInDoc -1 
 

 Рисование  дуги малаго круга на сфере

A,B - начало, конец дуги, R - радиус сферы

Примеры

6

Set A = Loks(P(hr1, dl1, 0), P(hr2, dl2, 0)) 
 

Угол пеленга и длина локсодромии

hr1, dl1 - начало дуги, hr2, dl2 - конец дуги

 

7

Set Ai = NGPOINT.Rotate(ugl, Otrezok) 
 NGPOINT.SaveInDoc

Вращение точки вокруг отрезка с возвратом значений точки

Отрезок в активе, точка тут же задана и угол поворота ugl

Otrezok.ss i1, i2  ' ось 
 Ngpoint.ss  p(F.x,-F.z,0) 
 Set Ai = NGPOINT.Rotate(-90, Otrezok) 
 NGPOINT.SaveInDoc 
 

8

Obj.TurnAround A, B, ugl

Вращение сцены вокруг отрезка, заданного 2-мя точками A и B на угол (ugl)

Две точки и угол

 

9

Text.sss P0, "t1", "Arial", 100 
 

Метод вывода текста 
на экран

Точка привязки, текст, фонт, размер 

Сам текст

 

 

Новые методы: Проектирование судовых поверхностей
 

n/n

Имя МКфункции и передаваемые/принимаемые параметры

назначение

Входные 
параметры

Выходные 
параметры

1

Line3d n1,n2,Fals/Else

Построение пространственной 3Dлинии по 2-заданным

n1 – номер 1-й линии

n1 – номер 2-й линии

False = 0 сохранять исходные линии,

Else -  удалять

3D –линия

2

Obj.Uniform = n

 

Условия масштабирования по отдельности по x,y,z

n=0 – выполнять

n=1 – не выполнять

нет

2.1

Obj.Scale = s1

Масштаб по x

S1 – вещественное число

Нет

2.2

Obj.ScaleY = s2

Масштаб по y

S1 – вещественное число

Нет

2.3

Obj.ScaleZ = s3

Масштаб по z

S1 – вещественное число

нет

6

Delete LastNmb

Удаление текущего активного объекта

 

 

7

Delete n

Удаление  по номеру

N – целое число

нет

8

Line_uv(1, 0.5, 91)

Линия из поверхности

0,1 по u или v

0,5 – параметр (0-1), 91 – число точек

нет

9

LineOnPov(n21)

Активная линия  на поверхности (n21)

N21 – поверхность

 

10

 PolyPov.BelowWL n1, h, k

Задание поверхности ниже ватерлинии

n1 – поверхность,  h - осадка

k = 0 по u

k = 1 по v

 

11

 h1 = PolyPov.Osadka(n1, s1, s2)

 

Вычислен6ие осадки судна от объема вычисляемой осадки

n1 – поверхность

s1 - шаг

s2 - объем

 

12

PolyPov.Trans n71, 0 

Преобразование поверхности в полиповерхноть

0 - по u; 1 – по v 

 

13

MoveToGroup n23, n24+1, "RRRR" 

 Поместить и добавить  в группу (старые МК могут работать неправильно – если новая группа, то ей надо давать новое имя)

 

 

14

Krivizna(st, A, Kr, Pmax, Pmin, UVmax,UVmin, 1E-40)

Кривизна в точке А

Входные шаг - st и точка A (u,v,0)

Kr, Pmax, Pmin –т. (пустышки)

На выходе: 

Kr.x – макс. кривизна

Kr.y – мин кривизна

Kr.z  - Гауссова кривизна

Pmax – т. макс кривизны

Pmin – инимальной кривизны

 

 

15

SetkaKr(u0, v0, nu, nv, su, sv, stu, stv, ntu, ntv, 1E-21, 1E-1

Построение сетки линий кривизны

var stu = 0.001

var stv = 0.010  // по меридианам

var ntu = 499

var ntv = 70  // вдоль меридиан

 

 

16

Set Mc = p(0,0,0)

Set Pc = p(0,0,0)

Set Go = p(0,0,0)

Set T = MetaAll (n71,dif,yi,G, Rgr,G_gruz,Mc,Go,Pc,0)

Метацентрические параметры

Где

n71  - поверхность корпуса судна

dif – угол дифферента

yi – вес судна

G – центр тяжести судна

Rgr – вес груза

G_gruz – центр всего груза

Мс – метацентр, координат я задействована для выоты осадки

Go – общий центр судна и груза

Рс – центр поддерживающей силы (центр величины)

 

T – выходящая переменная типа точка у которой T.y – метавысота, Т.z – метацентрический момент. 

 

17

Set Mc =  p(0,0,0)

Set Go =  p(0,0,0)

Set Pc =  p(0,0,0)

Set T = Kren(n71, Dif_beg, Dif_end, yi, G, Rgr, G_gruz, Mc, Go, Pc)

Определить крен /дифферент судна

 

См. выше кроме dif меняется на Dif_beg, Dif_end

 

T.x  - искомый крен

18

Ngpoint.sss A, V

Материальная точка

Пример см. ниже

 A – тип точка

 V – объем (масса)

На экране точки с координатами т.А

19

Set N1 = PolyPov.Ndudv* (u, v,N2,N3)

 

Нормаль (N1) полиповерхности и два вектора по u,v.

u,v и пустышки:

Set N2 =p(0,0,0)

Set N3 =p(0,0,0)

 

Нормаль и два вектора

20

PolyPov.Trans** n1, 0

 Преобразовать поверхность в полиповерхность

N1 – номер заданной поверхности

0,1 – в направлениях u,v

21

CurrObjNmb = LastNmb

Set A = PolyLine.Pofi (N)

Точка (узел) на полилилинии по номеру

N – номер точки

Точка

22

 Delete – N

 Удаление всех объектов из структуры

 N меньше 0

 

23

GroupToPolyline

 Построение полилинии из группы точек

 Группа точек

 Полилиния

24

CurrObjStrNmb = CStr(LastNmb-1) & ".0"

obj.zAngle=45

Преобразовать в активной группе «0» объект

 

 

25

Truba n1, n2, n3

Построение трубы

n1- образующая

n2 - направляющая

n3 – Число u-линий n3> 5

Труба

 

26

Set A =p(3,2,5)

Set V1 =p(0,1,0)

Set V2=p(1,0,0)

Obj.SetLocCSOXZ A, V1, V2, 1, 0

 

Преобразование со сдвигом в векторам поворота

А =  сдвиг

V1 – новый z

V1 – новый x

Объект в новом месте и направлении

27

Polyline.Cut x.

резка линий (по х)

- координата по оси х

 

28

Lace n1, n2

сшивка 2-поверхностей n1 и n2

N1,n1 – номера поверхностей

 

29

Polyline.Revers

реверсирование линии

 

 

30

Line3dK n1-1,n1,0,2 ' 2 - на HH1

Line3dK n1-1,n1,0,3 ' 3 - на HV

Line3dK n1-1,n1,0,4 ' 4 - на VH

Line3dK n1-1,n1,0,5 ' 5 - на WV

ne3dK n1-1,n1,0,6 ' 6 - на VW

линия по 2-м проекциям

 

n1-1 – номер первой линия

n1 – номер второй линия

Новая 3d 0 линия

31

Texture(n1)

Текстура на поверхность по номером в переменной n1

n1целое число

Картина на поверхности

32

Animate n1, 1, False, 35, 1., 0., 0., 0., 0., 270., 270.,  0.1, 0, p(0,1,0), t

 

Метод “Анимация» - новый подход

1) номер линии 
2) число циклов 
3) "Обратное" 
4) скорость 
5) масштаб 
6) Угол X от 
7) Угол X до 
8) Угол Y от 
9) Угол Y до 
10) Угол Z от 
11) Угол Z до 
12) шаг по t

13)  режим (0 - старый, 1 – новый по вектору направления)t

14)  Вектор направления

15) Значение по t до куда анимация

 

33

SetVisible 0, n1

Метод «Выключить/выключить объект (становится неведимым) к

0,1 – режимы включить, выключить, n1  номер объекта -  в структуре  

 

34

RandColor n, 155, 160, -1

Случайный цвет (RGB) линий в группе n1

- 1 – цвет исключается

 

 

35

RandFillColor n, 155, 160, 15

Случайный цвет (RGB) заливки полилиний в группе n - 1 – цвет исключается.

 

 

36

SetkaOnUV n, nu, nv, tu, tv

Задание сетки линий nu и nv поверхности n

n – номер поверхности,  nu,nv  - число линий по u и v, tu,tv – число точек на линиях u и v/ 

 

37

Parquet(short base_nmb, short type)

Задание паркета на поверхности

short base_nmb – номер поверхности

short type = 0 – треуг-ки, = 1 – прямоугольники

 

38

ResetGroup(short base_nmb, short n_otr, short bJoin

Увеличить число точек на

short n_otr - паркетине

short base_nmb – номер поверхности

short bJoin =0 – не соединять

= 1 соединять

 

 

39

folder ="E:\papka "

num = 11

ext = "jpg"

ImportNum folder, num, ext

Импорт из указанной папки «парка» файла по номеру (11 и далее), файла с расширением jpg или dxf/. Можно вызывать файлы случайно

Folder – папка

Num - имя файла в папке (задавать числом больше10).

Ext – «jpg» или  «dxf»

Для упорядочивания файлов в папке скопируйте в нужной посл.-сти

40

folder ="E:\papka" & M.z

num = -1

ext = "jpg"

ImportNum folder, num, ext

Импорт из папки с подпапками

M.z = 77.11

77 – номер (свертка) подпапки, 2 – номер файла

 

41

 MoveToGroup n61+1, n62+1, "New"

Группы с именем «New» каждый раз создаются под этим именем; в других случаях с одинаковым именем, объекты добавляются в эту группу.

 

 

42

n1 = polyline.nnodes

Число узлов в полилинии

Ставится после задания полилинии

 

43

Set B = LinPov.Pxz(1, 3)

Точка на линейчатой поверхности от x z

 

 

44

Set B = PolyPov.Pxz(1, 3)

Точка на полиповерхности от x z

 

 

45

RefreshImage

Очистить изображения (полезно, в случае выводить изображения в цикле)

 

 

46

SetVisible 0,-1

Экран (все объекты или по номеру) сделать невидимым

 

 

47

H = SeeStar (u1, v1, u2, v2, -1)

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

Входные параметры  широта и долгота наблюдателя широта и долгота звезды (горы) «-1» звезды, иначе высота горы.  

 

48

FractalTopolyline short i_obj1, short i_obj2, short i_obj3, short b2obj,

' short bScale, short istep, short numer, LPDISPATCH pVec

Задания фракталов

 

 

 

* метод реализован  также через диалог команда: поверхности -> NDvDu 

** метод реализован  также через диалог команда: поверхности -> Сгладить/преобраз.полипове… (поставить галку и выставить в окно соответствующую поверхность).

 Некоторые замечания

1)      В структуре, чтобы сохранить правильно нумерацию, передвигать объекты вверх командой «Передвинуть Вверх», команда «Передвинуть вначала делают нумерацию от 0, что нарушает повторную работу МК. 

2)      При анимации задание дуги  в качестве  объекта  не задавать (в анимации не визуализируется). 

Vector.Import "M:\ПАПКА_2012\BOLOTOV_2012_nnn_наука\SHIP_ATPP\Лодка_Ерш\Линии_полуширота_k.dxf", 1

Vector.Import "M:\ПАПКА_2012\BOLOTOV_2012_nnn_наука\SHIP_ATPP\Лодка_Ерш\Линии_полуборт_k.dxf", 1

Line3d 9,4,1  ' из каких проекция смотреть в диалоге идти по порядку

Line3d 7,3,1

Line3d 5,2,1

Line3d 3,1,1

Vector.Import "M:\ПАПКА_2012\BOLOTOV_2012_nnn_наука\SHIP_ATPP\Лодка_Ерш\ДБ.dxf", 1

MoveToGroup 2, 7, "ngr"  ' номера первой и последней линии см в диалоге

n11 = LastNmb

Dubl

n21 = LastNmb

Set O = Vector.p(0,0,0)

PolyPov.Reset ' Обнулить

Vector.PolyPov.SS O, n11, 21, 21, 0, 0

Obj.Uniform = 0  ' условия масштабирования по отдельности по x,y,z

Obj.ScaleZ = 2

'Delete LastNmb

Delete n21-1

'VBSMsg "n1 = " & n1

'Vector.Import "M:\ПАПКА_2012\BOLOTOV_2012_nnn_наука\Макросы_гот\Vector.dxf", 1

Метод: Krivizna(st, A, Kr, Pmax, Pmin, UVmax,UVmin, 1E-40)

Входные параметры: шаг - st и точка A (u,v,0)

Kr, Pmax, Pmin – три точки (на входе пустышки)

На выходе: 

Kr.x – максимальная кривизна

Kr.y – минимальная кривизна

Kr.z  - Гауссова кривизна

Pmax – точка в направлении максимальной кривизны

Pmin – точка в направлении минимальной кривизны

Пример:

<строится поверхность>

Затем вызывается макрокоманда:

*.js

n2 = Vector.LastNmb()

var u0=0.5 //  параметр двигает точку вдоль судна

var v0=0.5

PolyPov.Reset () //Обнулить обязательно

CurrObjNmb = n2

var A = PolyPov.P(u0,v0)

n91 = Vector.LastNmb()

Vector.Ngpoint.ss (A)

Text.ss (A, "A")

st = 0.1  // шаг

var A = p(u0, v0, 0)

var Kr = p(0, 0, 0)

var Pmax = p(0, 0, 0)

var Pmin = p(0, 0, 0)

var UVmax = p(0, 0, 0)

var UVmin = p(0, 0, 0)

CurrObjNmb = n2

Krivizna(st, A, Kr, Pmax, Pmin, UVmax,UVmin, 1E-40)  // вызов метода

                Text.ss (Pmax, "Pmax")

                Vector.Ngpoint.ss (Pmax)

                VBSMsg("Максимальная кривизна = " + Kr.x)

                Text.ss (Pmin, "Pmin")

                Vector.Ngpoint.ss (Pmin)

                VBSMsg("Минимальная кривизна = " + Kr.y)

    n92 = Vector.LastNmb()

MoveToGroup (n91+1, n92+1, "gr")

Максимальная кривизна Kr.x = 0.5

Минимальная кривизна Kr.y = 0.0

 

Максимальная кривизна  = 1.09 Минимальная  кривизна = 0.00159

 

 

 

Метод SetkaKr построения сетка линий экстремальных кривизн

 

var stu = 0.001

var stv = 0.010  // по меридианам

var ntu = 499

var ntv = 70  // вдоль меридиан

CurrObjNmb = n2

SetkaKr(u0, v0, nu, nv, su, sv, stu, stv, ntu, ntv, 1E-21, 1E-1)

 

 

 

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

var Puv = PointUV_XYZ(K)

Входные параметры:

K – переменная типа точка, у которой

K.x – координата x (в декартовой системе координат)

K.y - координата y (в декартовой системе координат) 

K.z - координата z (пустышка) 

Выходные параметры

Puv - переменная типа точка, у которой

Puv.x - широта на сфере или референс-эллипсоиде точки на входе

Puv.y – долгота на сфере или референс-эллипсоиде точки на входе

 

Пример

//Листинг:

n91 = LastNmb()

var K = Per_line(3,4)

Ngpoint.ss(K)

Text.ss(K, " K")

var Puv = PointUV_XYZ(K);

VBSMsg ("Широта = " + Puv.x  + "  Долгота  = " + Puv.y)

 

CurrObjNmb = 3

var p1= Polyline.P (0)

var p2= Polyline.P (1)

Text.ss(p1, " p1")

Text.ss(p2, " p2")

 

CurrObjNmb = 4

var p3= Polyline.P (0)

var p4= Polyline.P (1)

Text.ss(p3, " p3")

Text.ss(p4, " p4")

n92 = Vector.LastNmb()

MoveToGroup (n91+1, n92+1, "gr")

 

s1 = Ugol_dug (p2,K,p4)

s2 = Ugol_dug (p3,K,p2)

VBSMsg ("Угол p2-K-p4 = " + s1 + "   Угол p3-K-p2 = " + s2)

 

var N1 = VecOtr (K,p2) 

var N2 = VecOtr (K,p4) 

VBSMsg ("Вектор K-p2 x = " + N1.x + " y = " + N1.y + " z = " + N1.z)

VBSMsg ("Вектор K-p4 x = " + N2.x + " y = " + N2.y + " z = " + N2.z)

 

 

// квадратичная поверхность

var p11 = Vector.p(-3,0,0)

var p12 = Vector.p(0,3,0)

var p13 = Vector.p(0,-3,0)

var p14 = Vector.p(3,0,0)

Vector.Otrezok.ss (p11, p12)

var n1 = Vector.LastNmb()

Vector.dubl()

Vector.Obj.Translate (Vector.p(3, -3, 0))

//Vector.obj.All = 0

var n2 = Vector.LastNmb()

var O = Vector.p(0,0,0) // - точка привязки не работает, но задавать надо

var nu0 = 1 //- номер U0

var nu1 = 2 //- номер U1

var nv0 = -1 //- номер V0, если линия не задана, то ставится - 1

var nv1 = -1 //- номер V1, если линия не задана, то ставится - 1

var hu0 = 2 //- высота U0

var hu1 = 2 //- высота U1

var hv0 = 2 //-высота V0

var hv1 =2 //- высота V1

var C = Vector.p(0,0,0) //- средняя т.

var s = 0.5 //- полнота

var nu = 10 // число U-линий

var nv = 10 // - число V-линий

var False = 0 // - флаг - не проводить по узлам

var True = 1 // - флаг - внутренность/внешность

Vector.KvadrPov.SS (O, nu0, nu1, nv0, nv1, hu0, hu1, hv0, hv1, C, s, nu, nv, False, True)

var n21 = LastNmb()

Line_uv(1, 0.5, 90)

var p21 = Vector.p(-1,0,0)

var p22 = Vector.p(1,1,0)

Vector.Otrezok.ss(p21, p22)

Polyline.FromCurrObj(66)

LineOnPov(n21)

 

         

 

Эпюры линий на поверхности и из поверхности*

 

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

вычисления ее объема (водоизмещения) и ЦТ

 

Листинг макрокоманды

Rr=3

Set O = p (0, 0, 3)

Set N = p (0, 0, 1)

Arc.ss O, 0.7*Rr, Rr, 0, 180, N, 0 

n91 = LastNmb

 

Set O = p (0, 0, 2)

Set N = p (0, 0, 1)

Arc.ss O, 0.85*0.7*Rr, 0.85*Rr, 0, 180, N, 0 

n92 = LastNmb

 

Set O = p (0, 0, 0)

Set N = p (0, 0, 1)

Arc.ss O, 0.7*Rr, Rr, 0, 180, N, 0 

obj.xAngle= -90

Obj.Translate P(0, 0, 3)

 

Set O = p (0, 0, 2)

Set N = p (0, 0, 1)

Arc.ss O, 0.85*0.7*Rr, 0.85*Rr, 0, -180, N, 0 

 

Set O = p (0, 0, 3)

Set N = p (0, 0, 1)

Arc.ss O, 0.7*Rr, Rr, 0, -180, N, 0 

 

MoveToGroup 1, 6, "ngr"  ' номера первой и последней линии см в диалоге

n11 = LastNmb

dubl

Set O = Vector.p(0,0,0)

PolyPov.Reset ' Обнулить

Vector.PolyPov.SS O, n11, 51, 51, 0,0,1  ' (предпоследний параметр линии из группы)

n93 = LastNmb

 

obj.All = True

obj.xAngle= -90

 

Set A =p (2,2,4)

Set B =p (5,2,2)

Set C =p (1,2,3)

Trian.ss A, B, C

n32 = LastNmb

 

PolyPov.BelowWL n93, 2  ' поверхность ниже ватерлинии на уровне 2

n94 = LastNmb

 

' Задаем тело поверхность - плоскость

nBody = CreateLinBodyFrom(n94, Trian, False)

n95 = LastNmb

 

Obj.Uniform = 0 ' условия масштабирования по отдельности по x,y,z

Obj.Scale = 1

Obj.ScaleY = 1

Obj.ScaleZ = 1.

 

' ЦТ

Set AAA6Surfs = Vector.GetDocObject (nBody)   

Set Pc = AAA6Surfs.Centroid

 

' Вычисление объема

vol = AAA6Surfs.Volume

VbsMsg  "vol = " & vol

' вычисление ЦТ

VbsMsg "Pc.x = " & Pc.x

VbsMsg "Pc.y = " & Pc.y

VbsMsg "Pc.z = " & Pc.z

 

 

Исходный контур (слева), поверхность, обрезанная поверхность по осадке, тело

 

Вычисления в диалоге (команда в структуре системы Вектор (см. там слева)

Объём = 7.15784

Центр = (-0.000160517, 1.6685, -5.92627e-005)

Вычисления объема и ЦТ в МК см. в тексте макроса.

 

Вычисление ЦТ и объема подводной части лодки 
при заданной осадке, например  h = 0.3

 

Vector.Import "C:\A_2013_Верстка\Aproekt\ДБ_верх.dxf", 1

n23 = LastNmb

Vector.Import "C:\A_2013_Верстка\Aproekt\Верх_xz.dxf", 1

n21 = LastNmb

Vector.Import "C:\A_2013_Верстка\Aproekt\Верх_xy.dxf", 1

n22 = LastNmb

Line3d n21,n22,1

n95 = LastNmb

Vector.Import "C:\A_2013_Верстка\Vector_got\Бортовая_пр_xz.dxf", 1

n1 = LastNmb

Vector.Import "C:\A_2013_Верстка\Vector_got\Бортовая_пр_xy.dxf", 1

n2 = LastNmb

Line3d n1,n2,1

n92 = LastNmb

Vector.Import "C:\A_2013_Верстка\Vector_got\Бортовая_пр2_xy.dxf", 1

n2 = LastNmb

Vector.Import "C:\A_2013_Верстка\Vector_got\Бортовая_пр2_xz.dxf", 1

n3 = LastNmb

Line3d n3,n2,1

n91= LastNmb

Vector.Import "C:\A_2013_Верстка\Vector_got\Батокс.dxf", 1

CurrObjNmb = n91 ' 2

dubl

Obj.Reflect 1 ' YZ

CurrObjNmb = n92' 2

dubl

Obj.Reflect 1 ' YZ

 

CurrObjNmb = n95' 2

dubl

Obj.Reflect 1 ' YZ

 

CurrObjNmb = n23 ' 2

dubl

 

MoveToGroup 1, 10, "ngr"  ' номера первой и последней линии см в диалоге

n11 = LastNmb

' dubl

Set O = Vector.p(0,0,0)

PolyPov.Reset ' Обнулить

Vector.PolyPov.SS O, n11, 51, 51, 0,0,1  ' (прдпоследний параметр линии из группы)

n71 = LastNmb

' выравним судно

obj.zAngle= -1

Obj.Translate P(0, -0.1, 0)

h = 0.3 ' осадка

 

 

' обрежем поверхность n71

PolyPov.BelowWL n71, h 

n72 = LastNmb

 

' Плоскость по осадке

Set A =p (-9.5,h,0)

Set B =p (  0,h,0)

Set C =p (  0,h,2)

Trian.ss A, B, C

' строим тело ниже ВЛ при осодке h

 

nBody = CreateLinBodyFrom(n72, Trian, False)

n42 = LastNmb

CurrObjNmb = n42

 

' Расчет объема и ЦТ

 

Set AAA6Surfs = Vector.GetDocObject (nBody)   

Set Pc = AAA6Surfs.Centroid

VBSMsg ("Pc.x = " & Pc.x & " Pc.y = " & Pc.y & " Pc.z = " & Pc.z)

Ngpoint.ss Pc

Width=220

SetColor 255,0,0

' Вычисление объема

vol = AAA6Surfs.Volume

VbsMsg  "vol = " & vol

Слева поверхность лодки, справа выделена поверхность (тело) ниже ватерлинии

Поверхность ниже ватерлинии

Объём = 1.31604  (расчет в диалоге )

Центр = (-4.14415, 0.200685, -0.00100323 (расчет в диалоге)

Ниже расчет в макросе

  - объем

 

Расчеты в диалоге и в макросе совпадают.

 

Следующая задача по заданным поверхности корпуса судна и объему (водоизмещению)
поверхности ниже ватерлинии, определить осадку судна. Постараемся сделать метод.  

 

 

*На основе старых и новых методов:

В.Болотов, Ф.Конюхов. «Мат модель гребной лодки ФК через Тихий океан»

 

 

 

 

 

Пример: Поместить и добавить  в группу

 

Otrezok.ss p(0, 4, 0), p(4,3, 3)

n23 = LastNmb

Otrezok.ss p(5, 7, 0), p(9,3, 3)

n24 = LastNmb

MoveToGroup n23, n24+1, "RRRR"  '

 

Otrezok.ss p(8, 1, 4), p(2,4, 0)

n25 = LastNmb

MoveToGroup n25, n25+1, "RRRR"  '

 

 

 

 

Тестирование пересечение прямой с полилинией

 

 

 

Или все вместе

 

 

 

xr = Array(1,2,3,4,5,6,7,8,9,10,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,0,0,0,0,0,0)

yr = Array(0,2,3,4,5,6,7,8,9,10,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,0,0,0,0,0,0)

 

' Строим график

Mx=1

My=1

pn =9

Polyline.Reset ' Обнулить, если строилась раньше полилиния

N_pl = 1

'VBSMsg ("pn " &  pn)

For n  = 0 To pn step 1

      Polyline.AddP(P(Mx*xr(n), My*yr(n), 0) )

'     Ngpoint.ss (P(Mx*xr(n), My*yr(n), 0))

'     Ngpoint.ss (P(Mx*xr(n), 0, 0))

'     Otrezok.ss p(Mx*xr(n),0,0),p(Mx*xr(n),My*yr(n),0)

Next

Polyline.SaveInDoc ( N_pl )

Polyline.Draw

' CurrObjNmb = LastNmb

n11 = LastNmb

 

 

 

 

' ВЫЧИСЛЕНИЯ ПО ГРАФИКУ

 

' по графику от заданной осадки определить объем

x1i = 4.0 ' 2.5 ' 4.5

CurrObjNmb = n11

Set A = Polyline.Px(Mx*x1i, 55) 

Ngpoint.ss A

Width=220

VbsMsg " при  х = " & x1i & "  y = равен " & A.y

otrezok.s A.x, 0, 0,  A.x, A.y, 0

Text.ss A, "A"

 

 

' Можно решить обратную задачу

y=5

Otrezok.ss p(-3,y,0),p(15,y,0)

n14 = LastNmb

Set K = Per_line (n11, n14)

Ngpoint.ss K

Width=220

VbsMsg "По y = 5 х = " & K.x

Text.ss K, "K"

 

VbsMsg "При x = " & x1i _

& vbCrLf & "  y равен = " & A.y _

& vbCrLf & " При y = " & y _ 

& vbCrLf & "  x = "  &  K.x

 

 

 

Материальная точка* в системе Вектор как тело, имеющее объем

 

 

V_ship = 0.260 ' вес лодки

Set G_ship = p(0,0.5,0) ' центр тяжести лодки

V_gruz =  0.300 ' вес груза

Set G_gruz = p(5, 0.7, 0) ' центр тяжести груза

 

Ngpoint.sss G_ship, V_ship

n41 = LastNmb

Ngpoint.sss G_gruz, V_gruz

n42 = LastNmb

 

MoveToGroup n41, n42+1, "МТ"  ' в группе д.б. только тела

      n22 = LastNmb

      vol = Volume(n22)

      Set Pc = Centroid(n22)

      Set Pc = p(Pc.x,Pc.y,0)

      VBSMsg ("Общий ЦТ  " &  " Pc.x = " & Pc.x & " Pc.y = " & Pc.y & " Pc.z = " & Pc.z)

      Text.sss Pc, "ЦТо", "Arial", 400

      Ngpoint.ss Pc

      Width=100

      SetColor 255,0,0

 

Ngpoint.ss G_ship

Width=100

SetColor 0,0,255

Text.sss G_ship, "G_ship", "Arial", 400

 

Ngpoint.ss G_gruz

Width=100

SetColor 0,0,255

Text.sss p(G_gruz.x,G_gruz.y,G_gruz.z), "G_gruz", "Arial", 400

 

*Материальная точка — геометрическая точка, которой поставлен в соответствие скаляр, называемый массой: (\mathbf r , m), \mathbf r— вектор в евклидовом пространстве, отнесённом к какой-либо декартовой системе координат. Масса полагается постоянной, независящей ни от положения точки в пространстве, ни от времени.

Задание материальной  точки в диалоговом окне системы Вектор

 

Где О  - означает объем. Параметр - вещественная кубическая переменная   

Примечание: МТ в диалоговом окне*– ввели три скаляра (V,V2,V3) и три свободных вектора сил:

* Метод не сделали

 

 

 

 

Шпанготы на поверхности лодки K-9

 

// в диалоге создается поверхность>

n2 = Vector.LastNmb()

CurrObjNmb = n2

var u0=0.0

var v0=0.0

var k = 44

var kv = 21

var u=u0

var v=v0

var ngroup

n1 = Vector.LastNmb()

for (var m = 0; m < kv+2; m++ ) {   // до 4 точки правильно

      Polyline.Reset ()

      for (var n = 0; n < k; n++ ) {   // до 4 точки правильно

            PolyPov.Reset ()

            CurrObjNmb = n2

            var A1 = PolyPov.P (v, u+1/k)

            var A = PolyPov.P (v, u)

            Vector.Polyline.AddP (A)

            Vector.Polyline.AddP (A1)

            u = u0+n*(1-u0)/k

      }

      CurrObjNmb = n2

Vector.Polyline.SaveInDoc ( ngroup )

Vector.Polyline.Draw()

v = v0+m*(1-v0)/kv

}

n3 = Vector.LastNmb()

MoveToGroup (n1+1, n3+1, "gr")

 

Далее по шпангоутам создается поверхность корпуса, но уже как бы в другом направлении (u,v меняем местами),
что позволяет поверхность преобразовывать на конусность и кручение

 

 

 

Топология – преобразования поверхности на конусность (два случая)

 

 

Новое осень 2015

в диалоге модуля Дайдж:

 

Разбросать фигуры по координатам в соответствии кодов сверток,
например, задаваемых  в файле <Пушкин>.

 

26 05 1799 Пушкин Александр Сергеевич

88 55 26 22 99 97 = джнйнл = 67

 

' <Пушкин> (задается в unicode по такому образцу)

88 -3.21062 -2.96179  -1.42109e-014 *

55 -3.44045 1.4135 -1.42109e-014

26 -0.7776 3.5545  -1.42109e-014

22 2.02176 3.59942 -1.42109e-014

99 4.31654 1.0489  -1.42109e-014

97 3.90355 -3.64435 -1.42109e-014

* точки можно задавать  курсорм, потом сохранить сценарий, где координаты точек будут выглядеть так:

'NGPoint

      NGPoint.beg(0) = -3.21062

      NGPoint.beg(1) = -2.96179

      NGPoint.beg(2) = -1.42109e-014

      NGPoint.Draw

      NGPoint.SaveInDoc

Затем точки вручную размещаем по сверткам**

Это можно автоматизировать.

 

 

Задавать: «11 – Коор.(динаты) из файла»

 

Файлы в dxf-формате ложатся центром в точку

 

Здесь левый нижний угол картинок упирается точку
(хотя надо бы, чтобы центр картинки ложился на точку)

 

 

Эврика! Переменную в МК можно передавать через Техт (текстовую переменную).

До этого использовали в качестве переменной координату z точки – тоже не сложно,

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

 

VbsMsg "Передать переменную, например, тип глаза через Техт"

n1 = LastNmb

CurrObjNmb = n1

Tip_glas = Text.txt

Delete n1

if Tip_glas = "1" Then

Set A =p (0,0,0)

krug.s A.x, A.y, A.z, 1

end if

 

if Tip_glas = "2" Then

Set A =p (-1,-1,0)

Set B =p (-1,1,0)

Set C =p (1,-1,0)

Parall.ss A, B, C

end if

if Tip_glas = "3" Then

Set A =p (-1,0,0)

Set B =p (1,0,0)

Set C =p (0,1,0)

Trian.ss A, B, C

Set A =p (-1,0,0)

Set B =p (1,0,0)

Set C =p (0,-1,0)

Trian.ss A, B, C

n11= LastNmb()

MoveToGroup n11-1, n11+1, "Ромб"

end if

 

Пример  Макраме любой полиповерхности (МК 11.17)

VbsMsg "макраме  преобразование линий в полилинии не соединять"

n1 = LastNmb

CurrObjNmb = n1 '   сделали ее активной

Parquet n1, 1

ResetGroup LastNmb, 33, 0  ' преоразование группы линии в группу линии с большим количеством точек на линиях

ToPolylineArt 22,21

 

Полусфера на входе (справа) – макраме в центре и справа

 

Аналогично на любую полиповерхность можно нанести текстуру (картинку) МК 11.19. На входе картинка и поолиповерхность

Пример  На входе картина и выпуклая полиповерхность  (задана МК 7.10)

МК 11.19

VbsMsg "На входе картинка - первая и за ней в структуре полиповерхность "

n91 = LastNmb

CurrObjNmb = n91 '   сделали ее активной

Texture (n91-1)

 

Недостаток – картину надо заранее поворачивать, например в фортошопе,

чтобы она правильно легла на поверхность. В данном случае вертикальное расположение картинки ложится на полусферу под углом 45 градусов налево. В примере повернули поверхность уже с текстурой

Справа макраме МК 11.17 на квадратичной поверхности МК 11.10 (торс), на которую наложили рисунок (МК 11.19 )

Здесь на поверхность картинка ложится правильно

 

 

Еще приме: изобразить тельняшку

 

Слева - картинка, справа майка на десантнике Степочкин

 

Аналогично на майку ( чистую) можно задать любую картинку – выше уже показано

Поверхность зададим Ут9 (универсальных точек 9). Вот что получается:

 

Справа задали еще макраме (МК 11.19)

 

 

Пример работы с подпапками – на входе задается  точка с координатой  z^

M.z = 77.11, где 77 – номер (свертка) подпапки, 2 – номер файла.   

n1 = LastNmb

CurrObjNmb = n1

Set M = P(Ngpoint.x,Ngpoint.y,Ngpoint.z)

VbsMsg "M.z = " & M.z

M.z = M.z + 0.01

VbsMsg "M.z = " & M.z

M.z = M.z + 1.00

VbsMsg "M.z = " & M.z

 

folder_name="C:\Program Files\MSUN\Vector\Знаки\Камни\" & M.z

num = -1

ext = "jpg"

ImportNum folder_name, num, ext

obj.scale=0.5

Obj.Translate P(-5.5, -11.5, 0)

 

Работа с фракталами через метод См. также здесь

' VBSMsg "1.Замещение отрезков в полилинии полилинией без прицепа"

'VBSMsg "2.Замещение отрезков в полилинии полилинией с прицепом масштаб разный"

'VBSMsg "2.2.Замещение отрезков в полилинии полилинией с прицепом масштаб постоянный"

VBSMsg "3.1.Замещение отрезка в полилинии по номеру полилинией с прицепом масштаб разный"

'VBSMsg "3.2.Замещение отрезка в полилинии по номеру полилинией с прицепом масштаб постояныый"

 

n1 = LastNmb

CurrObjNmb = n1

vbsmsg n1

'Без прицепа

Set N =p(0,0,0)

'FractalTopolyline n1, n1-1, 2, 1, 1, 1,-1,N ' 1) без прицепа в структуре  инициатор и затем генератор с шагом 2 (на самом деле =1)

'FractalTopolyline n1, n1-1, 2, 1, 0, 1,-1,N ' 1) без прицепа в структуре  инициатор и затем генератор с шагом 2 (на самом деле =1 м=с)

'FractalTopolyline n1-1, n1-2, 2, 1, 1, 1,-1,N ' 1) без прицепа в структуре  прицепа и есть прицеп но др объектов не должно быть - работает

'FractalTopolyline n1-1, n1-2, n1, 1, 1, 1,-1,N ' 2.1) с прицепом с Пушкиным масштаб разный

'FractalTopolyline n1-1, n1-2, n1, 1, 0, 1,-1,N ' 2.2) с прицепом с Пушкиным масштаб постоянный

'FractalTopolyline n1-1, n1-2, n1, 1, 1, 1,2,N ' 2.2) по номеру с прицепом с Пушкиным масштаб разный

'FractalTopolyline n1-1, n1-2, n1, 1, 0, 1,2,N ' 2.2) по номеру с прицепом с Пушкиным масштаб постоянный

 

Set N =p(0,1,0)

'FractalTopolyline n1-1, n1-2, n1, 1, 0, 1,2,N ' 2.2) по номеру с прицепом с Пушкиным масштаб постоянный

FractalTopolyline n1-1, n1-2, n1, 1, 1, 1,-1,N ' 2.1) с прицепом с Пушкиным масштаб разный