Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Угол в градусах Добавлено: 22.12.09 19:42  

Автор вопроса:  Саня | ICQ: 553816426 
Необходимо вычислять угол наклона линии относительно нижней границы формы.
Есть проект VB6 на форме линия и текстовое окно.
Вот код:
 

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Line1.X2 = X
Line1.Y2 = Y
Text1.Text = Gradusov(Line1.X1, Line1.Y1, Line1.X2, Line1.Y2)
End Sub
Function Gradusov(CenterX As Single, CenterY As Single, X As Single, Y As Single) As Long
'Как высчитать угол наклона
End Function

Может есть какая нибудь формула?
Буду очень благодарен.

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Дмитрий Юпатов



Вопросов: 4
Ответов: 457
 Web-сайт: cargomaster.at.ua/
 Профиль | | #1
Добавлено: 22.12.09 20:01
Алгоритм простой:
1) вычисляем разность Х
2) то же для У
3) вычисляем значение У/Х Это будет значение тангенса угла наклона линии к горизонтальной оси.
4) определяем (atan функция в vb6, кажется) арктангенс угла. Будем иметь его значение в радианах. Пересчитываем радианы в градусы (погугли как).

Код не привел, т.к. 6й версии не имею, а код в дотнете отличается - скипипастить не выйдет...

Ответить

Номер ответа: 2
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #2
Добавлено: 22.12.09 20:02
Короче так. Уравнение прямой знаем? Знаем.

y = kx + b

Вот. Дальше такая фишка: tg(angle) = k

То есть тангенс угла наколна равен k. Значит, наша формула выглядит так:

y = tg(angle) * x + b

Арктангенс в VB6 есть: Atn, возвращающий угол в радианах. В итоге, чтобы посчитать угол, нужно всего лишь посчитать k. Angle = Atn(k)
k = (y2 - y1) / (x2 - x1)
Angle = Atn(k)
Следовательно, угол наклона в радианах:

Angle = Atn((y2 - y1) / (x2 - x1))

Если же x2 = x1, то просто возвращаем 1.5707963267949 если y2 > y1, -1.5707963267949 если y2 < y1. В итоге получаем формулу:

  1.  
  2. Function Gradusov(CenterX As Single, CenterY As Single, X As Single, Y As Single) As Long
  3. If X = CenterX Then Gradusov = 1.5707963267949 * Sgn(Y - CenterY) 'Sgn возвращает 1, если аргумент > 0, 0 если он 0, -1 если < 0
  4. If X <> CenterX Ten Gradusov = Atn((Y - CenterY) / (X - CenterX))
  5. End Function

Ответить

Номер ответа: 3
Автор ответа:
 Илья



Вопросов: 1
Ответов: 48
 Профиль | | #3 Добавлено: 22.12.09 20:07
из тригонометрии можно сделать формулу:

  1. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  2. Line1.X2 = X
  3. Line1.Y2 = Y
  4. Command1_Click
  5. End Sub
  6.  
  7. Private Sub Command1_Click()
  8.   Dim sngA As Single, sngB As Single
  9.   Dim sngRatio  As Single
  10.   Dim sngAngle As Single
  11.   Dim sngPI As Single
  12.   sngPI = 4 * Atn(1)
  13.   sngA = Sqr((Module(Line1.X2 - Line1.X1) ^ 2) + (Module(Line1.Y2 - Line1.Y1) ^ 2))
  14.   sngB = Module(Line1.Y2 - Line1.Y1)
  15.   sngRatio = (sngB / sngA)
  16.   If sngRatio <> 1 Then sngAngle = ArcSin(sngRatio) Else sngAngle = 90: Caption = CStr(sngAngle): Exit Sub
  17.   sngAngle = sngAngle * 180 / sngPI
  18.   Caption = CStr(sngAngle)
  19. End Sub
  20.  
  21. Public Function ArcSin(sngX As Single) As Single
  22. ArcSin = Atn(sngX / Sqr(-sngX * sngX + 1))
  23. End Function

Ответить

Номер ответа: 4
Автор ответа:
 Саня



ICQ: 553816426 

Вопросов: 10
Ответов: 99
 Профиль | | #4 Добавлено: 22.12.09 20:18
Огромное спасибо VВDUnit, работает отлично я дописал чтобы функция сразу в градусах возвращала.

  1. If X = CenterX Then Gradusov = 1.5707963267949 * Sgn(Y - CenterY) 'Sgn возвращает 1, если аргумент > 0, 0 если он 0, -1 если < 0
  2. If X <> CenterX Then Gradusov = Atn((Y - CenterY) / (X - CenterX)) * 180 / 3.141592654 'И переводим сразу в градусы

Ответить

Номер ответа: 5
Автор ответа:
 Саня



ICQ: 553816426 

Вопросов: 10
Ответов: 99
 Профиль | | #5 Добавлено: 22.12.09 20:29
Илья, а в каких единицах значения твоего кода? Это не градусы.

Ответить

Номер ответа: 6
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #6
Добавлено: 22.12.09 20:30
Тогда
  1. If X = CenterX Then Gradusov = 1.5707963267949 * Sgn(Y - CenterY) 'Sgn возвращает 1, если аргумент > 0, 0 если он 0, -1 если < 0

Замени на
  1. If X = CenterX Then Gradusov = 90 * Sgn(Y - CenterY) 'Sgn возвращает 1, если аргумент > 0, 0 если он 0, -1 если < 0

Ответить

Номер ответа: 7
Автор ответа:
 Саня



ICQ: 553816426 

Вопросов: 10
Ответов: 99
 Профиль | | #7 Добавлено: 22.12.09 20:40
Ну да, что бы в когда линия вертикально было 90 градусов. Спасибо за помощь.

Ответить

Номер ответа: 8
Автор ответа:
 Саня



ICQ: 553816426 

Вопросов: 10
Ответов: 99
 Профиль | | #8 Добавлено: 22.12.09 20:58
Да-а-а... Это наверное единственный сайт где можно реально получить помощь. БЛАГОДАРОЧКА всем кто не прошел мимо! :-)

Ответить

Номер ответа: 9
Автор ответа:
 Дмитрий Юпатов



Вопросов: 4
Ответов: 457
 Web-сайт: cargomaster.at.ua/
 Профиль | | #9
Добавлено: 22.12.09 23:35
VВDUnit, те же яйца, только в профиль :)

Ответить

Номер ответа: 10
Автор ответа:
 Илья



Вопросов: 1
Ответов: 48
 Профиль | | #10 Добавлено: 23.12.09 14:38
Илья, а в каких единицах значения твоего кода? Это не градусы.

Градусы, просто там по четвертям, с каждой четвертью сбрасывается, это код только для III четверти ПКП

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам