Спасибо огромное! Буду сейчас пробовать делать!) А то уже чего только не пытался сделать)))Игорь Белов писал(а):Точно:
φ = (φ₁ + φ₂) / 2
Помогите с расчетом направления отрезка
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с расчетом направления отрезка
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с расчетом направления отрезка
Чтото не совсем то получается. Разве можно при нахождении делта Х например, от градусов отнимать градусы?
- Игорь Белов
- Гуру
- Сообщения: 2231
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1504
- Откуда: Казань
Re: Помогите с расчетом направления отрезка
В первом случае - с длинами - должны быть радианы. Во втором случае - только с азимутами - можно использовать и градусы, но Cos() требует аргумента в радианах, а Atn() в радианах же результат выдаёт.klerk184 писал(а):Разве можно при нахождении делта Х например, от градусов отнимать градусы?
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с расчетом направления отрезка
Игорь Белов писал(а):В первом случае - с длинами - должны быть радианы. Во втором случае - только с азимутами - можно использовать и градусы, но Cos() требует аргумента в радианах, а Atn() в радианах же результат выдаёт.klerk184 писал(а):Разве можно при нахождении делта Х например, от градусов отнимать градусы?
т.е. вот так:
Код: Выделить всё
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
- Игорь Белов
- Гуру
- Сообщения: 2231
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1504
- Откуда: Казань
Re: Помогите с расчетом направления отрезка
- Плохо представляете, что происходит с индексами. В полигонах последняя точка совпадает с первой. Пишем "For i = 1 To n - 1", и никаких "If next_one", "If next_two".
- Определитесь, что из φ, λ принимать за x, y. В Вашем коде сразу так и эдак в одной формуле.
- Если нужны формулы с румбами, используйте абсолютные значения ∆x, ∆y: Abs(). Вообще-то румбы из эпохи таблиц, когда не только компьютеров, но и калькуляторов с функциями не было.
The purpose of computing is insight, not numbers
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с расчетом направления отрезка
* тогда получается вот так, так и правда лучше, меньше циклов лишних:Игорь Белов писал(а):
- Плохо представляете, что происходит с индексами. В полигонах последняя точка совпадает с первой. Пишем "For i = 1 To n - 1", и никаких "If next_one", "If next_two".
- Определитесь, что из φ, λ принимать за x, y. В Вашем коде сразу так и эдак в одной формуле.
- Если нужны формулы с румбами, используйте абсолютные значения ∆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
- Игорь Белов
- Гуру
- Сообщения: 2231
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1504
- Откуда: Казань
Re: Помогите с расчетом направления отрезка
Код: Выделить всё
dX = Abs(Radius * (end_x - start_x) * (cos(secondY) * RAD_2_DEG))
The purpose of computing is insight, not numbers
-
- Активный участник
- Сообщения: 146
- Зарегистрирован: 30 авг 2015, 16:38
- Репутация: 25
- Контактная информация:
Re: Помогите с расчетом направления отрезка
я с mapbasic-ом не знаком,
но догадываюсь какую задачу вы решаете, по-видимому вам необходимо построить геоход по
полигональным объектам, скорее всего это делянки(т.е. небольшие объекты)
поэтому советую:
1)не использовать географическую ск
тогда для нахождения угла вам необходимо
2)вычислить dx и dy
3)tan (a)=|dx|/|dy|
4)a=atan(a) угол
5)не забыть радианы перевести в градусы(десятичные)
6)если надо градусы-в градусы-(минуты-секунды)?
7)румб определяете по знакам dx и dy
l=(dx^2+dy^2)^0.5 - длина
но догадываюсь какую задачу вы решаете, по-видимому вам необходимо построить геоход по
полигональным объектам, скорее всего это делянки(т.е. небольшие объекты)
поэтому советую:
1)не использовать географическую ск
тогда для нахождения угла вам необходимо
2)вычислить dx и dy
3)tan (a)=|dx|/|dy|
4)a=atan(a) угол
5)не забыть радианы перевести в градусы(десятичные)
6)если надо градусы-в градусы-(минуты-секунды)?
7)румб определяете по знакам dx и dy
l=(dx^2+dy^2)^0.5 - длина
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с расчетом направления отрезка
Убрал. Что-то и не подумал)))Игорь Белов писал(а):Зачем же косинус в градусы переводить? Это не угол, а величина безразмерная.Код: Выделить всё
dX = Abs(Radius * (end_x - start_x) * (cos(secondY) * RAD_2_DEG))
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Помогите с расчетом направления отрезка
Да, сейчас буду переводить градусы в минуты и секундыgornak писал(а):я с mapbasic-ом не знаком,
но догадываюсь какую задачу вы решаете, по-видимому вам необходимо построить геоход по
полигональным объектам, скорее всего это делянки(т.е. небольшие объекты)
поэтому советую:
1)не использовать географическую ск
тогда для нахождения угла вам необходимо
2)вычислить dx и dy
3)tan (a)=|dx|/|dy|
4)a=atan(a) угол
5)не забыть радианы перевести в градусы(десятичные)
6)если надо градусы-в градусы-(минуты-секунды)?
7)румб определяете по знакам dx и dy
l=(dx^2+dy^2)^0.5 - длина
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 30 гостей