Помогите с расчетом направления отрезка

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

Re: Помогите с расчетом направления отрезка

Сообщение klerk184 » 06 июл 2016, 11:21

Игорь Белов писал(а):Точно:
φ = (φ₁ + φ₂) / 2
Спасибо огромное! Буду сейчас пробовать делать!) А то уже чего только не пытался сделать)))

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

Re: Помогите с расчетом направления отрезка

Сообщение klerk184 » 06 июл 2016, 12:34

Чтото не совсем то получается. Разве можно при нахождении делта Х например, от градусов отнимать градусы?

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

Re: Помогите с расчетом направления отрезка

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

klerk184 писал(а):Разве можно при нахождении делта Х например, от градусов отнимать градусы?
В первом случае - с длинами - должны быть радианы. Во втором случае - только с азимутами - можно использовать и градусы, но Cos() требует аргумента в радианах, а Atn() в радианах же результат выдаёт.
The purpose of computing is insight, not numbers

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

Re: Помогите с расчетом направления отрезка

Сообщение klerk184 » 06 июл 2016, 12:51

Игорь Белов писал(а):
klerk184 писал(а):Разве можно при нахождении делта Х например, от градусов отнимать градусы?
В первом случае - с длинами - должны быть радианы. Во втором случае - только с азимутами - можно использовать и градусы, но Cos() требует аргумента в радианах, а Atn() в радианах же результат выдаёт.

т.е. вот так:

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

Dim dX, dY, rumb, alfa, Radius, secondX As Float
						
						Radius = 6370997
						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
								secondX = (start_x + end_x) / 2							
								dX = Radius * (end_x - start_x) * (cos(secondX) * RAD_2_DEG)
								dY = Radius * (end_y - start_y)
								'Note dX
									If end_x > start_x And end_y > start_y Then
									' 1 четверть
										direction = "СВ"
										rumb = Atn(dX / dY) * RAD_2_DEG
										alfa = rumb
									End If
									If end_x > start_x And end_y < start_y Then
									' 2 четверть
										direction = "ЮВ"
										rumb = Atn(dX / dY) * RAD_2_DEG
										alfa = 180 - rumb
									End If
									If end_x < start_x And end_y < start_y Then
									' 3 четверть
										direction = "ЮЗ"
										rumb = Atn(dX / dY) * RAD_2_DEG
										alfa = 180 + rumb
									End If
									If end_x < start_x And end_y > start_y Then
									' 4 четверть
										direction = "СЗ"
										rumb = Atn(dX / dY) * RAD_2_DEG
										alfa = 360 - rumb
									End If

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

Re: Помогите с расчетом направления отрезка

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

  1. Плохо представляете, что происходит с индексами. В полигонах последняя точка совпадает с первой. Пишем "For i = 1 To n - 1", и никаких "If next_one", "If next_two".
  2. Определитесь, что из φ, λ принимать за x, y. В Вашем коде сразу так и эдак в одной формуле.
  3. Если нужны формулы с румбами, используйте абсолютные значения ∆x, ∆y: Abs(). Вообще-то румбы из эпохи таблиц, когда не только компьютеров, но и калькуляторов с функциями не было.
The purpose of computing is insight, not numbers

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

Re: Помогите с расчетом направления отрезка

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

Игорь Белов писал(а):
  1. Плохо представляете, что происходит с индексами. В полигонах последняя точка совпадает с первой. Пишем "For i = 1 To n - 1", и никаких "If next_one", "If next_two".
  2. Определитесь, что из φ, λ принимать за x, y. В Вашем коде сразу так и эдак в одной формуле.
  3. Если нужны формулы с румбами, используйте абсолютные значения ∆x, ∆y: Abs(). Вообще-то румбы из эпохи таблиц, когда не только компьютеров, но и калькуляторов с функциями не было.
* тогда получается вот так, так и правда лучше, меньше циклов лишних:

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

For next_one = 1 To end_for - 1
							'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
* φ = У , λ = Х. Заметил свою ошибку

* получилось вот что:

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

Dim dX, dY, rumb, alfa, Radius, secondY As Float
						
						Radius = 6370997
						For next_one = 1 To end_for - 1
							'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
								secondY = ((start_y + end_y) / 2) * DEG_2_RAD						
								dX = Abs(Radius * (end_x - start_x) * (cos(secondY) * RAD_2_DEG))
								dY = Abs(Radius * (end_y - start_y))
									If end_x > start_x And end_y > start_y Then
									' 1 четверть
										direction = "СВ"
										rumb = Atn(dX / dY) * RAD_2_DEG
										alfa = rumb
									End If
									If end_x > start_x And end_y < start_y Then
									' 2 четверть
										direction = "ЮВ"
										rumb = Atn(dX / dY) * RAD_2_DEG
										alfa = 180 - rumb
									End If
									If end_x < start_x And end_y < start_y Then
									' 3 четверть
										direction = "ЮЗ"
										rumb = Atn(dX / dY) * RAD_2_DEG
										alfa = 180 + rumb
									End If
									If end_x < start_x And end_y > start_y Then
									' 4 четверть
										direction = "СЗ"
										rumb = Atn(dX / dY) * RAD_2_DEG
										alfa = 360 - rumb
									End If
									If dX = 0 And dY > 0 Then
										direction = "С"
									End If
									If dX = 0 And dY < 0 Then
										direction = "Ю"
									End If
									If dX > 0 And dY = 0 Then
										direction = "В"
									End If
									If dX < 0 And dY = 0 Then
										direction = "З"
									End If
Вроде что-то ближе к правде

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

Re: Помогите с расчетом направления отрезка

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

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

dX = Abs(Radius * (end_x - start_x) * (cos(secondY) * RAD_2_DEG))
Зачем же косинус в градусы переводить? Это не угол, а величина безразмерная.
The purpose of computing is insight, not numbers

gornak
Активный участник
Сообщения: 146
Зарегистрирован: 30 авг 2015, 16:38
Репутация: 25
Контактная информация:

Re: Помогите с расчетом направления отрезка

Сообщение gornak » 06 июл 2016, 16:36

я с mapbasic-ом не знаком,
но догадываюсь какую задачу вы решаете, по-видимому вам необходимо построить геоход по
полигональным объектам, скорее всего это делянки(т.е. небольшие объекты)
поэтому советую:
1)не использовать географическую ск
тогда для нахождения угла вам необходимо
2)вычислить dx и dy
3)tan (a)=|dx|/|dy|
4)a=atan(a) угол
5)не забыть радианы перевести в градусы(десятичные)
6)если надо градусы-в градусы-(минуты-секунды)?
7)румб определяете по знакам dx и dy
8)l=(dx^2+dy^2)^0.5 - длина

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

Re: Помогите с расчетом направления отрезка

Сообщение klerk184 » 07 июл 2016, 04:53

Игорь Белов писал(а):

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

dX = Abs(Radius * (end_x - start_x) * (cos(secondY) * RAD_2_DEG))
Зачем же косинус в градусы переводить? Это не угол, а величина безразмерная.
Убрал. Что-то и не подумал)))

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

Re: Помогите с расчетом направления отрезка

Сообщение klerk184 » 07 июл 2016, 04:54

gornak писал(а):я с mapbasic-ом не знаком,
но догадываюсь какую задачу вы решаете, по-видимому вам необходимо построить геоход по
полигональным объектам, скорее всего это делянки(т.е. небольшие объекты)
поэтому советую:
1)не использовать географическую ск
тогда для нахождения угла вам необходимо
2)вычислить dx и dy
3)tan (a)=|dx|/|dy|
4)a=atan(a) угол
5)не забыть радианы перевести в градусы(десятичные)
6)если надо градусы-в градусы-(минуты-секунды)?
7)румб определяете по знакам dx и dy
8)l=(dx^2+dy^2)^0.5 - длина
Да, сейчас буду переводить градусы в минуты и секунды

Ответить

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

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

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