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