Страница 1 из 2

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

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

Буду рад любой помощи
2016-06-23_15-07-55.png
3 полигона против часовой, 1 по часовой нумеруется
2016-06-23_15-07-55.png (13.87 КБ) 3273 просмотра

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
2016-06-23_16-24-28.png (12.03 КБ) 3236 просмотров
Но если я сам считаю, то у меня получается -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
Дальше проверяем знак двойной площади.

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