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

MapInfo, MapBasic
Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

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

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

"One-liner":

Код: Выделить всё

double_area = 0
For i = 1 To end_for - 1
    double_area = double_area + massX(i) * massY(i + 1)
Next
The purpose of computing is insight, not numbers

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

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

Сообщение Ariki » 23 июн 2016, 16:53

Чего-то тут не хватает. Вроде бы должно быть так:

Код: Выделить всё

double_area = double_area + massX(i) * massY(i + 1) - massX(i + 1) * massY(i)

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

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

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

Ariki писал(а):Чего-то тут не хватает. Вроде бы должно быть так:

Код: Выделить всё

double_area = double_area + massX(i) * massY(i + 1) - massX(i + 1) * massY(i)
Точно :!:
The purpose of computing is insight, not numbers

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 376
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

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

Сообщение ginpetr » 25 июн 2016, 13:10

А почему функция RegionInfo(object, REGION_INFO_IS_CLOCKWISE, polygon_num) не подошла? Простите, если что-то очевидное не заметил.

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

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

Сообщение klerk184 » 27 июн 2016, 07:46

Проблемка, не могу сообразить как отоброзить массив.

+- найти получилось

Код: Выделить всё


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 As SmallInt
	Dim massX(0), massY(0), massDist(0), dist, start_x, start_y, end_x, end_y, x, y, Pp, Pm, double_area, b 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)	
						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
'******************************************************************************************************************
' Считаем площадь многоугольника - формула шнурков. получаем + или - . расставляем нумерацию по часовой стрелке
'******************************************************************************************************************
						double_area = 0 Pp = 0 Pm = 0
						For next_one = 1 To end_for - 1
						    next_two = next_one + 1
						    Pp = Pp + massX(next_one) * massY(next_two)
						    Pm = Pm + massX(next_two) * massY(next_one)
						Next
						double_area = (Pp - Pm) / 2
						Note double_area
						If double_area > 0 Then
						 '****************************РЕВЕРС МАССИВОВ******************************						
							For i = 1 To end_for \ 2
								b = massX(i)
								massX(i) = massX(end_for-i-1)
								massY(i) = massY(end_for-i-1)
								massX(end_for-i-1) = b
							Next
							For next_one = 1 To end_for						
								If next_one < end_for Then
								Insert Into Cosmetic1 (Obj)
									Values ( CreateText(i_mapid, massX(next_one), massY(next_one), Str$(next_one), 0, LAYER_INFO_LBL_POS_BL, 3) )
								End If
							Next
						End If
						If double_area < 0 Then
							For next_one = 1 To end_for						
								If next_one < end_for Then
								Insert Into Cosmetic1 (Obj)
									Values ( CreateText(i_mapid, massX(next_one), massY(next_one), Str$(next_one), 0, LAYER_INFO_LBL_POS_BL, 3) )
								End If
							Next
						End If
'******************************************************************************************************************
					End Case
					Print "------------------------------------------------------"
			Fetch Next From ls			
		Loop
End Sub

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

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

Сообщение klerk184 » 27 июн 2016, 08:00

ginpetr писал(а):А почему функция RegionInfo(object, REGION_INFO_IS_CLOCKWISE, polygon_num) не подошла? Простите, если что-то очевидное не заметил.
Это функция будет работать в Runtime версиях? И в версиях мапинфо начиная с 6.5?

Я так понимаю, если работает, то благодоря этой функции можно обойтись без реверса массива и вычисления площади?

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

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

Сообщение Игорь Белов » 27 июн 2016, 09:01

klerk184 писал(а):Это функция будет работать в Runtime версиях?
Почему нет?
klerk184 писал(а):И в версиях мапинфо начиная с 6.5?
Начиная с 9.0.
klerk184 писал(а):Я так понимаю, если работает, то благодоря этой функции можно обойтись без реверса массива и вычисления площади?
Функция возвращает True/False, так что вычислять площадь не нужно, но порядок извлечения координат из массива за Вами.
The purpose of computing is insight, not numbers

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

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

Сообщение klerk184 » 27 июн 2016, 09:35

ErnieBoyd писал(а):
klerk184 писал(а):Это функция будет работать в Runtime версиях?
Почему нет?
klerk184 писал(а):И в версиях мапинфо начиная с 6.5?
Начиная с 9.0.
klerk184 писал(а):Я так понимаю, если работает, то благодоря этой функции можно обойтись без реверса массива и вычисления площади?
Функция возвращает True/False, так что вычислять площадь не нужно, но порядок извлечения координат из массива за Вами.

Спасибо за инфу.

Можете подсказать что не так делаю с массивами? не могу сообразить как сделать реверс.

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

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

Сообщение klerk184 » 27 июн 2016, 10:20

Уже разобрался)))

Код: Выделить всё

N = counter
							For i = 1 To N\2
								b = massX(i)
								massX(i) = massX(N-i+1)
								massX(N-i+1) = b
								b1 = massY(i)
								massY(i) = massY(N-i+1)
								massY(N-i+1) = b1
							Next

Ответить

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

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

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