:: Игры Разума
Re: Расстояние и азимут
leonid

Сообщений: 3204
Откуда: Рига
Дата регистрации: 03.02.2006
Сдается мне, что если не заморачиваться с расстояниями/азимутами, а элементарно хранить координаты населенных пунктов, то задача решалась бы значительно проще. Все нужные формулы можно найти в начальном курсе аналитической геометрии.
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Никак не должен.
Часть текста скрыта
#DEFINE C_MAXGRAPHSIZE 600
#DEFINE C_CIRCLESTEP 50
LOCAL lnAngleO, lnDistanceO, lnAngleB, lnDistanceB, lnAngleC, lnDistanceC, ln1, lnX, lnY, lnX2, lnY2, lnAngleTmp, lnDistanceTmp
lnAngleO = 250
lnDistanceO = 235
lnAngleB = 220
lnDistanceB = 40
lnAngleC = 220
lnDistanceC = 200
CLEAR
* grid
_SCREEN.DRAWSTYLE = 2
_SCREEN.FORECOLOR = RGB(0, 0, 0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
_SCREEN.FILLSTYLE=1
FOR ln1 = 0 TO 7
lnAngleTmp = PI()/8*m.ln1
lnX = C_MAXGRAPHSIZE/2 + C_MAXGRAPHSIZE*COS(m.lnAngleTmp)/2
lnY = C_MAXGRAPHSIZE/2 - C_MAXGRAPHSIZE*SIN(m.lnAngleTmp)/2
lnX2 = C_MAXGRAPHSIZE - m.lnX
lnY2 = C_MAXGRAPHSIZE - m.lnY
_SCREEN.LINE(m.lnX, m.lnY, m.lnX2, m.lnY2)
ENDFOR
FOR ln1 = C_CIRCLESTEP TO C_MAXGRAPHSIZE/2 STEP C_CIRCLESTEP
_SCREEN.CIRCLE(m.ln1, LogicalToSCREEN(0), LogicalToSCREEN(0))
ENDFOR
* corridor
_SCREEN.FORECOLOR = RGB(0, 0, 255)
FOR lnX = -C_MAXGRAPHSIZE/2 TO C_MAXGRAPHSIZE/2 STEP 3
FOR lnY = -C_MAXGRAPHSIZE/2 TO C_MAXGRAPHSIZE/2 STEP 3
Cartesian2Polar(m.lnX, m.lnY, @lnAngleTmp, @lnDistanceTmp)
IF IsInCorridor(m.lnAngleO, m.lnDistanceO, m.lnAngleTmp, m.lnDistanceTmp, 20)
_SCREEN.PSET(LogicalToSCREEN(m.lnX), LogicalToSCREEN(m.lnY))
ENDIF
ENDFOR
ENDFOR
* routes
_SCREEN.DRAWSTYLE = 0
_SCREEN.FORECOLOR = RGB(255, 0, 0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
_SCREEN.FILLSTYLE = 0
_SCREEN.FONTSIZE = 8
_SCREEN.FONTNAME = "Arial"
_SCREEN.CIRCLE(2, LogicalToSCREEN(0), LogicalToSCREEN(0))
_SCREEN.CURRENTY = LogicalToSCREEN(-15)
_SCREEN.PRINT("O")
Polar2Cartesian(m.lnAngleO, m.lnDistanceO, @lnX, @lnY)
_SCREEN.CIRCLE(2, LogicalToSCREEN(m.lnX), LogicalToSCREEN(m.lnY))
_SCREEN.CURRENTY = LogicalToSCREEN(m.lnY - 15)
_SCREEN.PRINT("A")
_SCREEN.LINE(LogicalToSCREEN(0), LogicalToSCREEN(0), LogicalToSCREEN(m.lnX), LogicalToSCREEN(m.lnY))
IF !IsInCorridor(m.lnAngleO, m.lnDistanceO, m.lnAngleB, m.lnDistanceB, 20)
_SCREEN.FORECOLOR = RGB(128,128,0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
ENDIF
Polar2Cartesian(m.lnAngleB, m.lnDistanceB, @lnX, @lnY)
_SCREEN.CIRCLE(2, LogicalToSCREEN(m.lnX), LogicalToSCREEN(m.lnY))
_SCREEN.CURRENTY = LogicalToSCREEN(m.lnY - 15)
_SCREEN.PRINT("B")
_SCREEN.LINE(LogicalToSCREEN(0), LogicalToSCREEN(0), LogicalToSCREEN(m.lnX), LogicalToSCREEN(m.lnY))
_SCREEN.FORECOLOR = RGB(255, 0, 0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
IF !IsInCorridor(m.lnAngleO, m.lnDistanceO, m.lnAngleC, m.lnDistanceC, 20)
_SCREEN.FORECOLOR = RGB(128,128,0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
ENDIF
Polar2Cartesian(m.lnAngleC, m.lnDistanceC, @lnX, @lnY)
_SCREEN.CIRCLE(2, LogicalToSCREEN(m.lnX), LogicalToSCREEN(m.lnY))
_SCREEN.CURRENTY = LogicalToSCREEN(m.lnY - 15)
_SCREEN.PRINT("C")
_SCREEN.LINE(LogicalToSCREEN(0), LogicalToSCREEN(0), LogicalToSCREEN(m.lnX), LogicalToSCREEN(m.lnY))
* reset _SCREEN
_SCREEN.FILLSTYLE = 1
_SCREEN.FORECOLOR = RGB(0, 0, 0)
_SCREEN.FILLCOLOR = _SCREEN.FORECOLOR
PROCEDURE IsInCorridor(tnAngleA, tnDistanceA, tnAngleB, tnDistanceB, tnWidth)
LOCAL lnAngleDiff
lnAngleDiff = ABS(m.tnAngleB - m.tnAngleA)
IF m.lnAngleDiff > 270
lnAngleDiff = 360 - m.lnAngleDiff
ENDIF
RETURN m.lnAngleDiff < 90 AND m.tnDistanceB*SIN(DTOR(m.lnAngleDiff)) <= m.tnWidth AND m.tnDistanceB*COS(DTOR(m.lnAngleDiff)) < m.tnDistanceA
ENDPROC
PROCEDURE IsInCircle(tnAngleA, tnDistanceA, tnAngleB, tnDistanceB, tnRadius)
RETURN (m.tnDistanceA - m.tnDistanceB*COS(DTOR(m.tnAngleB - m.tnAngleA))^2 + m.tnDistanceB*SIN(DTOR(m.tnAngleB - m.tnAngleA))^2<=m.tnRadius^2
ENDPROC
PROCEDURE Cartesian2Polar(tnX, tnY, tnAngle, tnDistance)
tnDistance = SQRT(m.tnX^2 + m.tnY^2)
DO CASE
CASE m.tnX > 0 AND m.tnY>=0
tnAngle = ATAN(m.tnY/m.tnX)
CASE m.tnX > 0 AND m.tnY<0
tnAngle = ATAN(m.tnY/m.tnX)+2*PI()
CASE m.tnX < 0
tnAngle = ATAN(m.tnY/m.tnX)+PI()
CASE m.tnX = 0 AND m.tnY>0
tnAngle = PI()/2
CASE m.tnX = 0 AND m.tnY<0
tnAngle = 3*PI()/2
CASE m.tnX = 0 AND m.tnY=0
tnAngle = 0
ENDCASE
tnAngle = RTOD(m.tnAngle)
ENDPROC
PROCEDURE Polar2Cartesian(tnAngle, tnDistance, tnX, tnY)
tnX = m.tnDistance*COS(DTOR(m.tnAngle))
tnY = m.tnDistance*SIN(DTOR(m.tnAngle))
ENDPROC
PROCEDURE LogicalToSCREEN(tnCoordinate)
RETURN m.tnCoordinate + C_MAXGRAPHSIZE/2
ENDPROC



------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Dutch

Сообщений: 212
Откуда: Волгодонск
Дата регистрации: 25.10.2010
Mitchman
при Угле меж азимутами 30 градусов уход от оси основногонаправления есть 1/2 от длины расстояния, т.е. максимальное расстояние при котором не уйдем за 20 км от оси будет 40 км
Sin(30)=1/2 - это любой школьник в начале тригонометрии знает
потому то я и поставил 40
Не поянл. Дак что, приведённый пример не подходит для реализации поставленной задачи?
Как сделать что бы при параметре m.Расстояние равном например 230 Result был равен .T.?



Исправлено 1 раз(а). Последнее : Dutch, 05.08.12 15:00
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
Dutch
Mitchman
при Угле меж азимутами 30 градусов уход от оси основногонаправления есть 1/2 от длины расстояния, т.е. максимальное расстояние при котором не уйдем за 20 км от оси будет 40 км
Sin(30)=1/2 - это любой школьник в начале тригонометрии знает
потому то я и поставил 40
Не поянл. Дак что, приведённый пример не подходит для реализации поставленной задачи?
Как сделать что бы при параметре m.Расстояние равном например 230 Result был равен .T.?
вы поставили условие что проверямый должен входить в коридор 20 км отклонения в одну строну
при расстоянии 230 и относительном угле 30 градусов - отклонение от оси получается 230/2 = 115 км

вы пожалуйста определитесь чо вам нужно
при расстоянии 230 относительный азимут должен быть меньше 5ти градусов(5 уже много)

т.е. если Аимут Направления = 250
то Азимут например 246
то 230 расстояние подходит бо отклонение от оси Расстояние*Sin(УголАзимутов)=230*Sin(4)=16


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина




Исправлено 1 раз(а). Последнее : Mitchman, 05.08.12 15:11
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Dutch

Сообщений: 212
Откуда: Волгодонск
Дата регистрации: 25.10.2010
Мне нужно определить, какие населённые пункты встретятся мне по пути. "Попути", пусть это будет коридор в 20 км вправо и влево от вектора следования к конечному пункту.
При этом, параметры m.РасстояниеНаправления, m.АзимутНаправления, m.Расстояние, m.Азимут есть переменные.
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Mitchman

Сообщений: 9978
Откуда: Николаев
Дата регистрации: 24.05.2002
Dutch
Мне нужно определить, какие населённые пункты встретятся мне по пути. "Попути", пусть это будет коридор в 20 км вправо и влево от вектора следования к конечному пункту.
При этом, параметры m.РасстояниеНаправления, m.АзимутНаправления, m.Расстояние, m.Азимут есть переменные.
ну так что тогда не устраивает

Цитата:
m.РасстояниеНаправления = 235 && General
m.АзимутНаправления = 250 && General
m.Расстояние = 110
m.Азимут = 220
не попадает в данный коридор


------------------
-
«свидомые украинцы озабочены не столько созданием украинской культуры, сколько уничтожением русской»
-
Олесь Бузина
Ratings: 0 negative/0 positive
Re: Расстояние и азимут
Dutch

Сообщений: 212
Откуда: Волгодонск
Дата регистрации: 25.10.2010
Хмм, пока вроде бы всё устраивает . Спасибо, будем внедрять и тестировать в полевых условиях!
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 8 (Гостей: 8)

© 2000-2024 Fox Club 
Яндекс.Метрика