Страница 1 из 2
Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 12:07
klerk184
Есть программка, которая берет координаты узлов и пишет их в массив, затем берет эти координаты узлов и нумерует их в том порядке, в котором был построен полигон. Требуется сделать:
Перед нумерацией сделать проверку, как пойдет нумерация, по часовой или против. Нужно сделать чтоб нумерация шла строго по часовой стрелке.
Буду рад любой помощи
- 3 полигона против часовой, 1 по часовой нумеруется
- 2016-06-23_15-07-55.png (13.87 КБ) 8881 просмотр
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 12:15
Игорь Белов
Вычислите площадь полигона по
формуле Гаусса и посмотрите на знак.
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 12:30
klerk184
Я в этом не очень силен, если можно, хотелось бы подробнее как это все сделать
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 12:33
trir
кодить
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 12:37
klerk184
trir писал(а):кодить
и так понятно что кодить. Как за кодить?)))
P.S. Система координат в WGS-84
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 12:48
Игорь Белов
klerk184 писал(а):Есть программка, которая берет координаты узлов и пишет их в массив, затем берет эти координаты узлов и нумерует их в том порядке, в котором был построен полигон.
Что за программка? В какой среде выполняется (MapInfo/Windows/...)? Имеются исходники или только исполняемый модуль?
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 13:06
klerk184
ErnieBoyd писал(а):klerk184 писал(а):Есть программка, которая берет координаты узлов и пишет их в массив, затем берет эти координаты узлов и нумерует их в том порядке, в котором был построен полигон.
Что за программка? В какой среде выполняется (MapInfo/Windows/...)? Имеются исходники или только исполняемый модуль?
эту программку сейчас пишу я. Она проставляет номера на узлах, но нужно чтоб она проставляла по часовой стрелке. Если они проставляются против, то нужно принудительно проставить по часовой. Программка для MapInfo
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 13:11
Игорь Белов
И в чём проблема? Смотрите первую формулу по ссылке, подставляете координаты узлов из массива и вычисляете площадь со знаком (не надо брать по модулю).
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 13:21
klerk184
ErnieBoyd писал(а):И в чём проблема? Смотрите первую формулу по ссылке, подставляете координаты узлов из массива и вычисляете площадь со знаком (не надо брать по модулю).
Я правильно понимаю что нужно использовать эту формулу?
- 2016-06-23_16-24-28.png (12.03 КБ) 8844 просмотра
Но если я сам считаю, то у меня получается
-30
что я не правильно складываю?))
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 13:28
Игорь Белов
Вертикальные чёрточки означают «взять результат по модулю»:
|30| = 30, |-30| = 30.
Вам этого делать не нужно, ибо важен знак: если обход по часовой стрелке, знак один, если против — другой.
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 13:33
klerk184
ErnieBoyd писал(а):Вертикальные чёрточки означают «взять результат по модулю»:
|30| = 30, |-30| = 30.
Вам этого делать не нужно, ибо важен знак: если обход по часовой стрелке, знак один, если против — другой.
Т.е. я делаю все перемножения, затем сложение и вычитание, и делю на 2, получю знак
но теперь не могу додумать, как закодить эту формулу, т.к. у меня все координаты в массиве
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 13:37
Игорь Белов
klerk184 писал(а):как закодить эту формулу, т.к. у меня все координаты в массиве
Как цикл по элементам массива.
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 13:50
klerk184
ErnieBoyd писал(а):klerk184 писал(а):как закодить эту формулу, т.к. у меня все координаты в массиве
Как цикл по элементам массива.
вообщем я запутался
Код: Выделить всё
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, nodes_info As SmallInt
Dim massX(0), massY(0), massDist(0), dist, start_x, start_y, end_x, end_y, x, y 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)
For next_one = 1 To end_for
next_two = next_one + 1
SumPlus = massX(next_one) * massY(next_two)
Next [b]вот что начал - а дальше понял что не выйдет так[/b]
If next_one < end_for Then
Insert Into Cosmetic1 (Obj)
Values ( CreateText(i_mapid, x, y, Str$(next_one), 0,LAYER_INFO_LBL_POS_BL,3) )
End If
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
End Case
Print "------------------------------------------------------"
Fetch Next From ls
Loop
End Sub
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 14:10
Игорь Белов
Примерно так, если последний узел полигона совпадает с первым:
Код: Выделить всё
double_area = 0
For next_one = 1 To end_for - 1
next_two = next_one + 1
double_area = double_area + massX(next_one) * massY(next_two)
Next
Дальше проверяем знак двойной площади.
Re: Помогите с нумерацией по часовой стрелке
Добавлено: 23 июн 2016, 14:12
klerk184
ErnieBoyd писал(а):Примерно так, если последний узел полигона совпадает с первым:
Код: Выделить всё
double_area = 0
For next_one = 1 To end_for - 1
next_two = next_one + 1
double_area = double_area + massX(next_one) * massY(next_two)
Next
Дальше проверяем знак двойной площади.
Спасибо большое. Вроде понял. Буду пробовать делать дальше. Завтра отпишусь, что выйдет.