ОХК судов и КГ

Практика 3 в системе Вектор.  Особенности написания МК и скриптов и более точное вычисление площади и центра тяжести

Перед тем как начать работать со структурированными  фигурами, выполним следующее упражнение:
Упражнение 1. Написать МК и скрипт  анализа системы: Три прямоугольника в раме.
 
Решение. МК и скрипт (его тело) пишем, так чтобы МК и тело скрипта были одинаковы.
Вместо
Set doc = CreateObject("Vector.Document")
пишем
Set Vector = CreateObject("Vector.Document")
и все глобальные методы через Vector.
Все это можно увидеть, если сравнить МК и скрипт

Непосредственно запуск скрипта

Вот получается какая картинка при заданных внутри системы данных
При этом:
Координаты ЦТ:
x = 0,27...
y = 0,73
Суммаррная площадь фигур:
s = 78
Коэффиент заполнения
к = 0.206


Упражнение 2. Определить центр всей визуальной массы
 
Рис. 2

Корпус судна как линейчатая поверхность через две линии контура (МК)

Задавая сетку: u=2,  v =11, получим вот такую треангуляцию.

Однако лучше использовать разбиение на треугольники по узловым точкам (при задании линейчатой поверхности используется строка:
LinPov.CutThrowNodes = True ' (по узлам)

Формула: 

где wi  - площади треугольников; Xi, Yi, Zi - координаты центров тяжестей соответствующих треугольников (их площадей), реализованна в системе Вектор.
Получили следующие координаты центра тяжести:
xc=4.66
yc=0.787
Площадь
s=13.88
На рис. видно, что центр тяжести относительно середины судна смещен влево, что соответсвует и весам на рис. 2.



Корпус судна как полилиния  
Вычисления выполнены в МК и площадь равно 13.38 


Упражнение 3. Изменим ситуацию. Пусть надстройка задана каким-либо другим цветом.
а)                                                    б)
 

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

Из рисунка видно, что общий центр все же смещается немного влево от середины судна, и можно сказать что весы на рис. 3.1, б показывают неверно. Однако, с учетом того, что корпус выкрашен в темный (тяжелый), то все правильно. Также из последнего рисунка видно, что надстройка и корпус представлены (триангулированы) более точно. Общая площадь в этом случае стала равной  - 13,27.

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




 

Макрокоманды и скрипты
 

Скрипт
<HTML>
<HEAD>
<META name=VI60_defaultClientScript content=VBScript>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE></TITLE>
<SCRIPT ID=clientEventHandlersVBS LANGUAGE=vbscript>
<!--

Sub button1_onclick
 Set Vector = CreateObject("Vector.Document")

 ar = 21
 br = 18
 Set p91 = Vector.p( -ar/2, -br/2,0)
 Set p92 = Vector.p(ar/2, -br/2,0)
 Set p93 = Vector.p(ar/2,  br/2,0)
 Set p94 = Vector.p(-ar/2, br/2,0)
 Vector.Polyline.Reset
 Vector.Polyline.AddP p91
 Vector.Polyline.AddP p92
 Vector.Polyline.AddP p93
 Vector.Polyline.AddP p94
 Vector.Polyline.AddP p91
 Vector.Polyline.SaveInDoc ( 0 )
 Vector.Polyline.Draw
 Vector.SetFillColor 253, 255, 204

' ЦТ системы состоящей из 3-х прямоугольников

 Set p1 = Vector.p(-8.5,-4.75,0)
 Set p2 = Vector.p(-1.5,-1.5,0)
 Set p3 = Vector.p(4,-0.5,0)

 a1=5
 b1=7
 a2=4
 b2=2
 a3=5
 b3=7

 if p1.x > p92.x Then p1.x = p92.x-a1
 if p2.x > p92.x Then p2.x = p92.x-a2
 if p3.x > p92.x Then p3.x = p92.x-a3

 if p1.x < p91.x Then p1.x = p91.x+a1
 if p2.x < p91.x Then p2.x = p91.x+a2
 if p3.x < p91.x Then p3.x = p91.x+a3
 

 if p1.y > p93.y Then p1.y = p93.y-b1
 if p2.y > p93.y Then p2.y = p93.y-b2
 if p3.y > p93.y Then p3.y = p93.y-b3
 

 if p1.y < p91.y Then p1.y = p91.x+b1
 if p2.y < p91.y Then p2.y = p91.x+b2
 if p2.y < p91.y Then p2.y = p91.x+b3
 
 

' Вычисляем массы треугольников
 s1=a1*b1
 s2=a2*b2
 s3=a3*b3

' Вычисляем центры координат

 x1=P1.x+a1/2
 y1=P1.y+b1/2

 x2=P2.x+a2/2
 y2=P2.y+b2/2

 x3=P3.x+a3/2
 y3=P3.y+b3/2

 x=(x1*s1+x2*s2+x3*s3)/(s1+s2+s3)
 y=(y1*s1+y2*s2+y3*s3)/(s1+s2+s3)

 Set N = Vector.p(0,0,1)
 Vector.Parall.SetNuNvFillColor 0, 0, 250, 0, 0
 Vector.Parall.SS2 P1, a1, b1, N
 Vector.Parall.SetNuNvFillColor 0, 0, 0, 250, 0
 Vector.Parall.SS2 P2, a2, b2, N
 Vector.Parall.SetNuNvFillColor 0, 0, 0, 0, 250
 Vector.Parall.SS2 P3, a3, b3, N

' Рамка

' Вычисляем относительную полноту по отношению к рамке
 s=s1+s2+s3
 sr=ar*br
 otns=s/sr
 Vector.Krug.ss Vector.p(x,y,0), 0.25, Vector.p(0,0,1)
 Vector.SetFillColor 250, 0, 0

 MsgBox "Координата ЦТ x =   " & x _
 & vbCrLf  & "Координата ЦТ y = " & y
 MsgBox "Относительная площадь  =  "  & otns
End Sub

-->
</SCRIPT>
</HEAD>
<BODY>

<P><INPUT id=text1 name=text1
style="HEIGHT: 134px; WIDTH: 348px" value="Система из 3-х прямоугольников">
_<INPUT id=button1 name=button1 type=button value="Нажми" style  ="HEIGHT:
_66px; WIDTH: 125px"></P>

</BODY>
</HTML>



 
 ' МК Рама и 3 прямоугольника

ar = 22
br = 18
Set p91 = Vector.p( -ar/2, -br/2,0)
Set p92 = Vector.p(ar/2, -br/2,0)
Set p93 = Vector.p(ar/2,  br/2,0)
Set p94 = Vector.p(-ar/2, br/2,0)
Vector.Polyline.Reset
Vector.Polyline.AddP p91
Vector.Polyline.AddP p92
Vector.Polyline.AddP p93
Vector.Polyline.AddP p94
Vector.Polyline.AddP p91
Vector.Polyline.SaveInDoc ( 0 )
Vector.Polyline.Draw
Vector.SetFillColor 253, 255, 204
 

' ЦТ системы состоящей из 3-х прямоугольников

Set p1 = Vector.p(-7,-3,0)
Set p2 = Vector.p(15,0,0)
Set p3 = Vector.p(5,2,0)

a1=5
b1=7
a2=4
b2=2
a3=5
b3=7

if p1.x > p92.x Then p1.x = p92.x-a1
if p2.x > p92.x Then p2.x = p92.x-a2
if p3.x > p92.x Then p3.x = p92.x-a3

if p1.x < p91.x Then p1.x = p91.x+a1
if p2.x < p91.x Then p2.x = p91.x+a2
if p3.x < p91.x Then p3.x = p91.x+a3
 

if p1.y > p93.y Then p1.y = p93.y-b1
if p2.y > p93.y Then p2.y = p93.y-b2
if p3.y > p93.y Then p3.y = p93.y-b3
 

if p1.y < p91.y Then p1.y = p91.x+b1
if p2.y < p91.y Then p2.y = p91.x+b2
if p2.y < p91.y Then p2.y = p91.x+b3
 
 

' Вычисляем массы треугольников
s1=a1*b1
s2=a2*b2
s3=a3*b3

' Вычисляем центры координат

x1=P1.x+a1/2
y1=P1.y+b1/2

x2=P2.x+a2/2
y2=P2.y+b2/2

x3=P3.x+a3/2
y3=P3.y+b3/2

x=(x1*s1+x2*s2+x3*s3)/(s1+s2+s3)
y=(y1*s1+y2*s2+y3*s3)/(s1+s2+s3)

Set N = p(0,0,1)
Vector.Parall.SetNuNvFillColor 0, 0, 250, 0, 0
Vector.Parall.SS2 P1, a1, b1, N
Vector.Parall.SetNuNvFillColor 0, 0, 0, 250, 0
Vector.Parall.SS2 P2, a2, b2, N
Vector.Parall.SetNuNvFillColor 0, 0, 0, 0, 250
Vector.Parall.SS2 P3, a3, b3, N

' Рамка

' Вычисляем относительную полноту по отношению к рамке
s=s1+s2+s3
sr=ar*br
otns=s/sr
Vector.Krug.ss p(x,y,0), 0.25, p(0,0,1)
Vector.SetFillColor 250, 0, 0

VBSMsg "x=" & x & "  y=  " & y
VBSMsg "относительная площадь  =  "  & otns


Import "C:\Bolotov\ship2\bok1_2.dxf", True
' Import "C:\Bolotov\ship2\dva_otr.dxf", True
LinPov.BaseNmbU0 = 0
LinPov.BaseNmbU1 = 1
LinPov.Nu = "2"
LinPov.Nv = "0"
LinPov.CutThrowNodes = True ' (по узлам)
LinPov.SaveInDoc
CurrObjNmb=LastNmb ' переводится опять в объект, для того чтобы работал масштаб
ar = LinPov.Area
VBSMsg "Площадь  = " & ar
Set centr = LinPov.Centroid
VBSMsg "x=" & centr.x & "  y=" & centr.y & "  z=" & centr.z
Krug.ss centr, 0.15, p(0,0,1)
obj.All = True
Obj.Scale = 2
Obj.SetH
obj.origin(0) =-10
' obj.origin(1) =-5
obj.SetH



 
<MKBok_nadstr>

Import "C:\Otladka\Bok_nadstr.dxf", True
LinPov.BaseNmbU0 = 0
LinPov.BaseNmbU1 = 1
LinPov.Nu = "2"
LinPov.Nv = "0"
LinPov.CutThrowNodes = True ' (по узлам)
LinPov.SaveInDoc
CurrObjNmb=LastNmb ' переводится опять в объект, для того чтобы работал масштаб
ar = LinPov.Area
VBSMsg "Площадь  = " & ar
Set centr = LinPov.Centroid
VBSMsg "x=" & centr.x & "  y=" & centr.y & "  z=" & centr.z

LinPov.BaseNmbU0 = 2
LinPov.BaseNmbU1 = 3
LinPov.Nu = "2"
LinPov.Nv = "0"
LinPov.CutThrowNodes = True ' (по узлам)
LinPov.SaveInDoc
CurrObjNmb=LastNmb ' переводится опять в объект, для того чтобы работал масштаб
ar1 = LinPov.Area
VBSMsg "Площадь  = " & ar1
Set centr1 = LinPov.Centroid
VBSMsg "x=" & centr1.x & "  y=" & centr1.y & "  z=" & centr1.z

n2=LastNmb+1
MoveToGroup n2-2, n2, "gr"

Set centr2 = Vector.Centroid(Vector.LastNmb)
ar2 = Vector.Area(Vector.LastNmb)

VbsMsg "Площадь всех прямоугольников = " & ar2
VbsMsg "Центр тяжести x=" & centr2.x & "  y=" & centr2.y & "  z=" & centr2.z

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

Krug.ss centr, 0.15, p(0,0,1)
Krug.ss centr1, 0.15, p(0,0,1)
 

obj.All = True
Obj.Scale = 2
Obj.SetH
obj.origin(0) =-3
' obj.origin(1) =-5
obj.SetH