Тригонометрия

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
end3r
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 23.01.2006 (Пн) 15:45

Тригонометрия

Сообщение end3r » 27.02.2006 (Пн) 0:12

Помогите, уже третий день бьюсь...
У меня на форме лежат несколько textbox. В два textbox вводятся значения сторон (катетов (рассм. прямоугольный треугольник)). По нажатию на кнопку, исходя из значений катетов высчитывается угол (в данной ситуации неважно какой из двух) следующим образом: по теореме Пифагора высчитываю гипотенузу, а дальше из соотношений в прямоугольном треугольнике:
alpha=arccos(a/c). Полученный угол вписывается в другой textbox. Нужно чтобы ответ переводился из радиан в градусы. Насколько я понял, нужно домножать на pi и делить на 180. Вот в чем проблема: итоговый угол получается немного отклоненным от верного - там где по идее должен получиться угол в 30 - получается в 31. Для проверки подставлял значения катетов одинаковые (т.е. треугольник равнобедренный). Должен получиться угол в 45 однако получается в 48 с хвостом. Привожу код:

Код: Выделить всё
Public Sub alphaaa()
Const pi As Double = 3.14159265358979
Dim cc As Double 'ввожу угол, равный отношению катета к гипотенузе
cc = Cos(a / c)
alpha = ((Atn(Sqr(1 - cc * cc)) / cc) * 180) / pi 'формула арккосинуса с переведением в градусы
Me.Text4.Text = alpha
MeList1.AddItem "alpha = arccos(a / c)"
Me.List1.AddItem "alpha = " + Format$(Atn((Sqr(1 - cc * cc) / cc) / pi) * 180)
beta = 90 - alpha
MeText5.Text = beta
Me.List1.AddItem "beta = 90 - alpha"
Me.List1.AddItem "beta = " + Format$(90 - alpha)
Me.List1.AddItem ""
End Sub


В чем ошибка? Если подставить в качестве a (катет) 4, второй катет получается 4, гипотенуза 5,65 с хвостом, а углы 44 и 46, хотя должны быть строго 45...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.02.2006 (Пн) 0:26

Как объявлены переменные? Целочисленных среди них случайно нет?
Изображение

end3r
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 23.01.2006 (Пн) 15:45

Сообщение end3r » 27.02.2006 (Пн) 0:38

Нет, конечно целочисленных нет. Double тоже не помогает.

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 27.02.2006 (Пн) 1:37

а кто такие a и с ?
Как объявлены переменные?

покажи все :о)

Может ты когда из текстбокса в переменные загоняешь - грешишь (в смысле большая погрешность?)


a - катет?
с - гипотенуза?
Пора уже всем хорошим людям собраться и убить всех плохих людей.

end3r
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 23.01.2006 (Пн) 15:45

Сообщение end3r » 27.02.2006 (Пн) 2:01

GB826
Да, а - катет, с - гипотенуза. О погрешностях я думал. Pi с точностью до 14 знаков после запятой привел - больше вб не дает...
Что примечательно - все остальные значения треугольника (периметр, площадь, радиус впис. окр.) подсчитываются достаточно точно, вплоть до пяти знаков, а вот углы - только целые. Прогу приаттачить затруднительно - там куча библиотек используется.

Это в отдельном модуле, где объявляются переменные и присваиваются отдельным текстбоксам.
Код: Выделить всё
Option Explicit
Public Const pi As Double = 3.14159265358979
Public a As Single 'Katet
Public b As Single 'Katet
Public c As Single 'Gipotenuza
Public p As Single 'Perimetr
Public p2 As Single 'Poluperimetr
Public s As Single 'Ploshad
Public alpha As Double 'ugol
Public beta As Single 'ugol
Public gamma As Single 'ugol
Public r As Single 'R
Public r2 As Single 'r


Может быть косяк в том, что когда я придаю значение текстбокс какому-то углу
Код: Выделить всё
alpha = Val(me.Text4.Text)

Используется Val, но как я уже и говорил даже с целыми числами такая вот ерунда.
Последний раз редактировалось end3r 27.02.2006 (Пн) 2:07, всего редактировалось 1 раз.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.02.2006 (Пн) 2:04

Попробуй писать не 180, а 180#. Правда не должно, но вдруг поможет.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 27.02.2006 (Пн) 2:06

Да, и в Format$() напиши так: Format$(..., "0.0000").
Lasciate ogni speranza, voi ch'entrate.

end3r
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 23.01.2006 (Пн) 15:45

Сообщение end3r » 27.02.2006 (Пн) 2:18

alibek
Не помогает.
В общем пообрубал от проги все что можно - не все работает но кое-что есть.
Вложения
Project1.rar
(15.43 Кб) Скачиваний: 22

end3r
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 23.01.2006 (Пн) 15:45

Сообщение end3r » 27.02.2006 (Пн) 3:12

Дааа, что-то туговато с ответами. Удивительно что тема, расположенная выше про "хочу чтоб нажал на кнопочку и форма замигала" пользуется большей популярностью чем хотя бы эта. Неужели никто с подобным не сталкивался?

$€rg
Обычный пользователь
Обычный пользователь
 
Сообщения: 99
Зарегистрирован: 11.01.2006 (Ср) 10:15
Откуда: Санкт-Петербург

Сообщение $€rg » 27.02.2006 (Пн) 8:58

не бейте ногами, если это глупость, но может объявить переменные как currency (масштабируемое целое а не плавающую точку) имхо 4 знаков после запятой должно хватить

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 27.02.2006 (Пн) 8:58

cc = Cos(a / c)

Что это???

GB826
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 312
Зарегистрирован: 04.08.2005 (Чт) 0:58
Откуда: Планета #3

Сообщение GB826 » 27.02.2006 (Пн) 11:07

a = 4
c = Sqr(32)
cc = (a / c)


alpha = ((Atn(cc / Sqr(1 - cc * cc))) * 180) / pi
beta = 90 - alpha

Как видишь, ты допустил две ошибки
Пора уже всем хорошим людям собраться и убить всех плохих людей.

Faust
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 649
Зарегистрирован: 29.12.2003 (Пн) 13:38
Откуда: лаборатория

Сообщение Faust » 27.02.2006 (Пн) 12:42

Хм... А почему для определения угла Atn не катит? Проверка на вырожденность понадобится в обоих случаях, а лишний sqr() использовать не приходиться.
Листинги не горят!

end3r
Новичок
Новичок
 
Сообщения: 43
Зарегистрирован: 23.01.2006 (Пн) 15:45

Сообщение end3r » 27.02.2006 (Пн) 15:39

GB826
Спасибо большое. Я понял свои ошибки, исправил - все высчитывается достаточно точно.

Еще раз спасибо!


Вернуться в Visual Basic 1–6

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

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

    TopList