Помогите с нумерацией по часовой стрелке

MapInfo, MapBasic
klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

Помогите с нумерацией по часовой стрелке

Сообщение klerk184 » 23 июн 2016, 12:07

Есть программка, которая берет координаты узлов и пишет их в массив, затем берет эти координаты узлов и нумерует их в том порядке, в котором был построен полигон. Требуется сделать:
Перед нумерацией сделать проверку, как пойдет нумерация, по часовой или против. Нужно сделать чтоб нумерация шла строго по часовой стрелке.

Буду рад любой помощи
2016-06-23_15-07-55.png
3 полигона против часовой, 1 по часовой нумеруется
2016-06-23_15-07-55.png (13.87 КБ) 3260 просмотров
Последний раз редактировалось klerk184 30 июн 2016, 11:02, всего редактировалось 1 раз.

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 1854
Зарегистрирован: 04 янв 2011, 22:00
Статьи: 12
Проекты: 1
Репутация: 1164
Откуда: Казань

Re: Помогите с нумерацией по часовой стрелке

Сообщение Игорь Белов » 23 июн 2016, 12:15

Вычислите площадь полигона по формуле Гаусса и посмотрите на знак.

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

Re: Помогите с нумерацией по часовой стрелке

Сообщение klerk184 » 23 июн 2016, 12:30

Я в этом не очень силен, если можно, хотелось бы подробнее как это все сделать

trir
Гуру
Сообщения: 4420
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 813
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Помогите с нумерацией по часовой стрелке

Сообщение trir » 23 июн 2016, 12:33

кодить

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

Re: Помогите с нумерацией по часовой стрелке

Сообщение klerk184 » 23 июн 2016, 12:37

trir писал(а):кодить
и так понятно что кодить. Как за кодить?)))

P.S. Система координат в WGS-84

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 1854
Зарегистрирован: 04 янв 2011, 22:00
Статьи: 12
Проекты: 1
Репутация: 1164
Откуда: Казань

Re: Помогите с нумерацией по часовой стрелке

Сообщение Игорь Белов » 23 июн 2016, 12:48

klerk184 писал(а):Есть программка, которая берет координаты узлов и пишет их в массив, затем берет эти координаты узлов и нумерует их в том порядке, в котором был построен полигон.
Что за программка? В какой среде выполняется (MapInfo/Windows/...)? Имеются исходники или только исполняемый модуль?

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

Re: Помогите с нумерацией по часовой стрелке

Сообщение klerk184 » 23 июн 2016, 13:06

ErnieBoyd писал(а):
klerk184 писал(а):Есть программка, которая берет координаты узлов и пишет их в массив, затем берет эти координаты узлов и нумерует их в том порядке, в котором был построен полигон.
Что за программка? В какой среде выполняется (MapInfo/Windows/...)? Имеются исходники или только исполняемый модуль?
эту программку сейчас пишу я. Она проставляет номера на узлах, но нужно чтоб она проставляла по часовой стрелке. Если они проставляются против, то нужно принудительно проставить по часовой. Программка для MapInfo

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 1854
Зарегистрирован: 04 янв 2011, 22:00
Статьи: 12
Проекты: 1
Репутация: 1164
Откуда: Казань

Re: Помогите с нумерацией по часовой стрелке

Сообщение Игорь Белов » 23 июн 2016, 13:11

И в чём проблема? Смотрите первую формулу по ссылке, подставляете координаты узлов из массива и вычисляете площадь со знаком (не надо брать по модулю).

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

Re: Помогите с нумерацией по часовой стрелке

Сообщение klerk184 » 23 июн 2016, 13:21

ErnieBoyd писал(а):И в чём проблема? Смотрите первую формулу по ссылке, подставляете координаты узлов из массива и вычисляете площадь со знаком (не надо брать по модулю).
Я правильно понимаю что нужно использовать эту формулу?
2016-06-23_16-24-28.png
2016-06-23_16-24-28.png (12.03 КБ) 3223 просмотра
Но если я сам считаю, то у меня получается -30

что я не правильно складываю?))

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 1854
Зарегистрирован: 04 янв 2011, 22:00
Статьи: 12
Проекты: 1
Репутация: 1164
Откуда: Казань

Re: Помогите с нумерацией по часовой стрелке

Сообщение Игорь Белов » 23 июн 2016, 13:28

Вертикальные чёрточки означают «взять результат по модулю»:
|30| = 30, |-30| = 30.
Вам этого делать не нужно, ибо важен знак: если обход по часовой стрелке, знак один, если против — другой.

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

Re: Помогите с нумерацией по часовой стрелке

Сообщение klerk184 » 23 июн 2016, 13:33

ErnieBoyd писал(а):Вертикальные чёрточки означают «взять результат по модулю»:
|30| = 30, |-30| = 30.
Вам этого делать не нужно, ибо важен знак: если обход по часовой стрелке, знак один, если против — другой.
Т.е. я делаю все перемножения, затем сложение и вычитание, и делю на 2, получю знак

но теперь не могу додумать, как закодить эту формулу, т.к. у меня все координаты в массиве

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 1854
Зарегистрирован: 04 янв 2011, 22:00
Статьи: 12
Проекты: 1
Репутация: 1164
Откуда: Казань

Re: Помогите с нумерацией по часовой стрелке

Сообщение Игорь Белов » 23 июн 2016, 13:37

klerk184 писал(а):как закодить эту формулу, т.к. у меня все координаты в массиве
Как цикл по элементам массива.

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

Re: Помогите с нумерацией по часовой стрелке

Сообщение klerk184 » 23 июн 2016, 13:50

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

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 1854
Зарегистрирован: 04 янв 2011, 22:00
Статьи: 12
Проекты: 1
Репутация: 1164
Откуда: Казань

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
Дальше проверяем знак двойной площади.

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

Re: Помогите с нумерацией по часовой стрелке

Сообщение klerk184 » 23 июн 2016, 14:12

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
Дальше проверяем знак двойной площади.

Спасибо большое. Вроде понял. Буду пробовать делать дальше. Завтра отпишусь, что выйдет.

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость