Код: Выделить всё
double_area = 0
For i = 1 To end_for - 1
double_area = double_area + massX(i) * massY(i + 1)
Next
Геоинформационные системы (ГИС) и Дистанционное зондирование Земли
Код: Выделить всё
double_area = 0
For i = 1 To end_for - 1
double_area = double_area + massX(i) * massY(i + 1)
Next
Код: Выделить всё
double_area = double_area + massX(i) * massY(i + 1) - massX(i + 1) * massY(i)
ТочноAriki писал(а):Чего-то тут не хватает. Вроде бы должно быть так:Код: Выделить всё
double_area = double_area + massX(i) * massY(i + 1) - massX(i + 1) * massY(i)
Код: Выделить всё
Include "mapbasic.def"
Include "icons.def"
'***********************************************************************
Declare Sub Main
Sub Main
Dim counter, polygon_counter, countX, countY, countDist, obj_type, i_mapid, i As Integer
Dim next_one, next_two, end_for, rowsCount, i_obj_type As SmallInt
Dim massX(0), massY(0), massDist(0), dist, start_x, start_y, end_x, end_y, x, y, Pp, Pm, double_area, b As Float
Dim direction As String
countX = UBound(massX)
countY = UBound(massY)
countDist = UBound(massDist)
Close All Interactive
Open Table "Lsk720201" Interactive As ls
Map From ls
i_mapid = FrontWindow()
Set Map Window i_mapid Layer 1 Nodes On
Print Chr$(12)
rowsCount = TableInfo(ls, TAB_INFO_NROWS) ' Узнаем количество объектов
Note "Всего объектов: " + rowsCount
i = 0
Fetch First From ls
Do While Not EOT(ls) ' Просматриваем все объекты
i = i + 1
obj_type = ObjectInfo(ls.obj, OBJ_INFO_TYPE)
Do Case obj_type ' Узнаем тип объекта
Case OBJ_LINE
Note "Объект №" + i + " в таблице – прямая линия."
Case OBJ_PLINE
Note "Объект №" + i + " в таблице – полилиния,..."
counter = ObjectInfo(ls.obj, OBJ_INFO_NPNTS)
Note " ... которая имеет " + Str$(counter) + " узлов."
Case OBJ_REGION
Note "Объект №" + i + " в таблице – область"
polygon_counter = ObjectInfo(ls.obj, OBJ_INFO_NPOLYGONS)
counter = ObjectInfo(ls.obj, OBJ_INFO_NPOLYGONS+1)
Note "Полигон имеет " + Str$(counter) + " узлов"
end_for = counter
ReDim massX(countX + end_for) ' Увиличиваем массив для оси Х на количество узлов
ReDim massY(countY + end_for) ' Увиличиваем массив для оси У на количество узлов
ReDim massDist(countDist + end_for) ' Увиличиваем массив для дистанции на количество узлов
'******************************************************************************************************************
' Узнаем координаты точек и записываем их в массив
'******************************************************************************************************************
Print "Объект №" + i + ". Координаты точек:"
For next_one = 1 To end_for
x = ObjectNodeX(ls.obj, polygon_counter, next_one) ' чтение долготы
y = ObjectNodeY(ls.obj, polygon_counter, next_one) ' чтение широты
massX(next_one) = x ' запись в массив Х
massY(next_one) = y ' запись в массив У
Print next_one + "-я точка. " + " X: " + massX(next_one) + " Y: " + massY(next_one)
Next
'******************************************************************************************************************
' Считаем расстояние между точками и узнаем направление
'******************************************************************************************************************
Print " "
Print "Расстояние и направление:"
For next_one = 1 To end_for
If next_one < end_for Then
start_x = massX(next_one)
start_y = massY(next_one)
next_two = next_one + 1
If next_two <= end_for Then
end_x = massX(next_two)
end_y = massY(next_two)
End If
If end_x > start_x And end_y > start_y Then
direction = "СВ"
End If
If end_x < start_x And end_y < start_y Then
direction = "ЮЗ"
End If
If end_x < start_x And end_y > start_y Then
direction = "СЗ"
End If
If end_x > start_x And end_y < start_y Then
direction = "ЮВ"
End If
If end_x = start_x And end_y > start_y Then
direction = "С"
End If
If end_x = start_x And end_y < start_y Then
direction = "Ю"
End If
If end_x > start_x And end_y = start_y Then
direction = "В"
End If
If end_x < start_x And end_y = start_y Then
direction = "З"
End If
dist = Distance(start_x,start_y,end_x,end_y,"m")
massDist(next_one) = dist
Print "Расстояние от точки " + next_one + " до точки " + next_two + ": " + massDist(next_one) + " Направление - " + direction
End If
Next
'******************************************************************************************************************
' Считаем площадь многоугольника - формула шнурков. получаем + или - . расставляем нумерацию по часовой стрелке
'******************************************************************************************************************
double_area = 0 Pp = 0 Pm = 0
For next_one = 1 To end_for - 1
next_two = next_one + 1
Pp = Pp + massX(next_one) * massY(next_two)
Pm = Pm + massX(next_two) * massY(next_one)
Next
double_area = (Pp - Pm) / 2
Note double_area
If double_area > 0 Then
'****************************РЕВЕРС МАССИВОВ******************************
For i = 1 To end_for \ 2
b = massX(i)
massX(i) = massX(end_for-i-1)
massY(i) = massY(end_for-i-1)
massX(end_for-i-1) = b
Next
For next_one = 1 To end_for
If next_one < end_for Then
Insert Into Cosmetic1 (Obj)
Values ( CreateText(i_mapid, massX(next_one), massY(next_one), Str$(next_one), 0, LAYER_INFO_LBL_POS_BL, 3) )
End If
Next
End If
If double_area < 0 Then
For next_one = 1 To end_for
If next_one < end_for Then
Insert Into Cosmetic1 (Obj)
Values ( CreateText(i_mapid, massX(next_one), massY(next_one), Str$(next_one), 0, LAYER_INFO_LBL_POS_BL, 3) )
End If
Next
End If
'******************************************************************************************************************
End Case
Print "------------------------------------------------------"
Fetch Next From ls
Loop
End Sub
Это функция будет работать в Runtime версиях? И в версиях мапинфо начиная с 6.5?ginpetr писал(а):А почему функция RegionInfo(object, REGION_INFO_IS_CLOCKWISE, polygon_num) не подошла? Простите, если что-то очевидное не заметил.
Почему нет?klerk184 писал(а):Это функция будет работать в Runtime версиях?
Начиная с 9.0.klerk184 писал(а):И в версиях мапинфо начиная с 6.5?
Функция возвращает True/False, так что вычислять площадь не нужно, но порядок извлечения координат из массива за Вами.klerk184 писал(а):Я так понимаю, если работает, то благодоря этой функции можно обойтись без реверса массива и вычисления площади?
ErnieBoyd писал(а):Почему нет?klerk184 писал(а):Это функция будет работать в Runtime версиях?
Начиная с 9.0.klerk184 писал(а):И в версиях мапинфо начиная с 6.5?
Функция возвращает True/False, так что вычислять площадь не нужно, но порядок извлечения координат из массива за Вами.klerk184 писал(а):Я так понимаю, если работает, то благодоря этой функции можно обойтись без реверса массива и вычисления площади?
Код: Выделить всё
N = counter
For i = 1 To N\2
b = massX(i)
massX(i) = massX(N-i+1)
massX(N-i+1) = b
b1 = massY(i)
massY(i) = massY(N-i+1)
massY(N-i+1) = b1
Next
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 24 гостя
© GIS-Lab и авторы, 2002-2017. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов (подробнее).