Помогите с нумерацией по часовой стрелке
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Помогите с нумерацией по часовой стрелке
Есть программка, которая берет координаты узлов и пишет их в массив, затем берет эти координаты узлов и нумерует их в том порядке, в котором был построен полигон. Требуется сделать:
Перед нумерацией сделать проверку, как пойдет нумерация, по часовой или против. Нужно сделать чтоб нумерация шла строго по часовой стрелке.
Буду рад любой помощи
Перед нумерацией сделать проверку, как пойдет нумерация, по часовой или против. Нужно сделать чтоб нумерация шла строго по часовой стрелке.
Буду рад любой помощи
Последний раз редактировалось klerk184 30 июн 2016, 11:02, всего редактировалось 1 раз.
- Игорь Белов
- Гуру
- Сообщения: 2229
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1501
- Откуда: Казань
Re: Помогите с нумерацией по часовой стрелке
Вычислите площадь полигона по формуле Гаусса и посмотрите на знак.
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с нумерацией по часовой стрелке
Я в этом не очень силен, если можно, хотелось бы подробнее как это все сделать
-
- Гуру
- Сообщения: 5287
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с нумерацией по часовой стрелке
и так понятно что кодить. Как за кодить?)))trir писал(а):кодить
P.S. Система координат в WGS-84
- Игорь Белов
- Гуру
- Сообщения: 2229
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1501
- Откуда: Казань
Re: Помогите с нумерацией по часовой стрелке
Что за программка? В какой среде выполняется (MapInfo/Windows/...)? Имеются исходники или только исполняемый модуль?klerk184 писал(а):Есть программка, которая берет координаты узлов и пишет их в массив, затем берет эти координаты узлов и нумерует их в том порядке, в котором был построен полигон.
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с нумерацией по часовой стрелке
эту программку сейчас пишу я. Она проставляет номера на узлах, но нужно чтоб она проставляла по часовой стрелке. Если они проставляются против, то нужно принудительно проставить по часовой. Программка для MapInfoErnieBoyd писал(а):Что за программка? В какой среде выполняется (MapInfo/Windows/...)? Имеются исходники или только исполняемый модуль?klerk184 писал(а):Есть программка, которая берет координаты узлов и пишет их в массив, затем берет эти координаты узлов и нумерует их в том порядке, в котором был построен полигон.
- Игорь Белов
- Гуру
- Сообщения: 2229
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1501
- Откуда: Казань
Re: Помогите с нумерацией по часовой стрелке
И в чём проблема? Смотрите первую формулу по ссылке, подставляете координаты узлов из массива и вычисляете площадь со знаком (не надо брать по модулю).
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с нумерацией по часовой стрелке
Я правильно понимаю что нужно использовать эту формулу? Но если я сам считаю, то у меня получается -30ErnieBoyd писал(а):И в чём проблема? Смотрите первую формулу по ссылке, подставляете координаты узлов из массива и вычисляете площадь со знаком (не надо брать по модулю).
что я не правильно складываю?))
- Игорь Белов
- Гуру
- Сообщения: 2229
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1501
- Откуда: Казань
Re: Помогите с нумерацией по часовой стрелке
Вертикальные чёрточки означают «взять результат по модулю»:
|30| = 30, |-30| = 30.
Вам этого делать не нужно, ибо важен знак: если обход по часовой стрелке, знак один, если против — другой.
|30| = 30, |-30| = 30.
Вам этого делать не нужно, ибо важен знак: если обход по часовой стрелке, знак один, если против — другой.
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с нумерацией по часовой стрелке
Т.е. я делаю все перемножения, затем сложение и вычитание, и делю на 2, получю знакErnieBoyd писал(а):Вертикальные чёрточки означают «взять результат по модулю»:
|30| = 30, |-30| = 30.
Вам этого делать не нужно, ибо важен знак: если обход по часовой стрелке, знак один, если против — другой.
но теперь не могу додумать, как закодить эту формулу, т.к. у меня все координаты в массиве
- Игорь Белов
- Гуру
- Сообщения: 2229
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1501
- Откуда: Казань
Re: Помогите с нумерацией по часовой стрелке
Как цикл по элементам массива.klerk184 писал(а):как закодить эту формулу, т.к. у меня все координаты в массиве
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с нумерацией по часовой стрелке
вообщем я запутался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
- Игорь Белов
- Гуру
- Сообщения: 2229
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1501
- Откуда: Казань
Re: Помогите с нумерацией по часовой стрелке
Примерно так, если последний узел полигона совпадает с первым:
Дальше проверяем знак двойной площади.
Код: Выделить всё
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
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с нумерацией по часовой стрелке
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
Спасибо большое. Вроде понял. Буду пробовать делать дальше. Завтра отпишусь, что выйдет.
Кто сейчас на конференции
Сейчас этот форум просматривают: Ahrefs [Bot] и 21 гость