![]() |
|
Модераторы: bsa |
![]()
|
|
| BrAgOl |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 6.3.2005 Где: М.О. Репутация: нет Всего: нет |
Решал задачу от Дейтлов, суть задачи создать класс прямоугольник с возможностью
(1) задавать длину и ширину. Вычислять периметр и площадь (2) задавать координаты вершин, далее тоже самое (3) рисовать сам прямоугольник. (до этого еще не дошел) с Первым пунктом все ясно, со вторым вроде бы тоже. Тут загвоздка в проверке получится ли прямоугольник или нет. Решил проверить на равенство диагоналей и на равенства косинусов противоположных углов друг другу и соответственно нулю. Задал заранее "правильные координаты" диагонали равны, а косинусы получаются приблизительно 0,07, судя по всему это погрешность, но мне она показалось слишком большой, если бы речь шла о тысячных еще ничего... Я взял, что точки задаются парами, начиная с левого нижнего угла и по часовой стрелке вот собственно код: .h:
.cpp:
main:
Это сообщение отредактировал(а) BrAgOl - 16.9.2011, 14:03 |
||||||
|
|||||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Это еще повезло, здесь косинус может быть равен вообще чему угодно d1 - содержат мусор, т.к. не инициализирован. ЗЫ: Никогда не сравнивайте плавающие типы на равенство. В крайнем случае (если без этого никак), подумайте об эпсилоне... |
|||
|
||||
| BrAgOl |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 6.3.2005 Где: М.О. Репутация: нет Всего: нет |
А это еще почему, по теореме косинусов он должен получиться совершенно определенный косинус, другое дело погрешность вычислений... Про d1 спасибо не углядел, конечно же d_1, погрешность снизилась до 0,0294
А можно тут по подробней? Это сообщение отредактировал(а) BrAgOl - 16.9.2011, 10:31 |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
| BrAgOl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 6.3.2005 Где: М.О. Репутация: нет Всего: нет |
я все уже распутал и исправил недочеты. да и с координатами вроде все правильно. а погрешность есть небольшая. Я про эпсилон не совсем понял, не могли бы пояснить? выход привести все к типу int и все после запятой в значении косинуса отбросится и все будет работать, но это какой-то не красивый способ |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
при такой погрешности вы ничего не распутали. погрешность, если и будет, она будет порядка 1E-12, или меньше. вместо if (a==b) ... нужно: if (fabs(a-b) < epsilon) ... где epsilon является довольно маленькой величиной, скажем .000001 |
|||
|
||||
| BrAgOl |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 6.3.2005 Где: М.О. Репутация: нет Всего: нет |
при таком сравнении в моем случае все работает, а по идее не должно, так как косинус равен 0,0294118, а fabs(cos1 - cos2) получается 0, что естественно меньше эпсилона
|
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
BrAgOl, мне интересно, почему при вычислении COSl1w1 и COSlw у тебя используется в обоих случаях d_1*d_1? И вообще, зачем ты вычитаешь квадрат диагонали?
И вообще, кто тебя учил давать имена переменным? Еще в школе учат адекватным именам: прямоугольник ABCD, прямая AB, угол/треугольник BCD... В итоге бы у тебя получилось:
|
|||
|
||||
| BrAgOl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 6.3.2005 Где: М.О. Репутация: нет Всего: нет |
Потому что у противоположных углов моего прямоугольника общая диагональ, которая называется d_1 и считаю достатоным предполагать, что если 2 противоположных угла 90 градусов, то и остальные 90 а в квадрат возвожу, потому что ищу угол по теореме косинусов А называл так, как нарисовал себе, если рисунок приложить все ясно станет. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
ты не сравниваешь с 90 градусов. А сравниваешь лишь косинусы противоположных углов судя по названию переменных. А вот способ их вычисления меня несколько удивляет... С другой стороны, согласись, что мой вариант кода понять легче и вероятность, что он работает, тоже выше. Это сообщение отредактировал(а) bsa - 19.9.2011, 16:14 |
|||
|
||||
| BrAgOl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 6.3.2005 Где: М.О. Репутация: нет Всего: нет |
в строке:
помимо сравнения на равенство диагоналей и косинусов, также проверяется и угол в 90 градусов, а именно в последнем сравнении, т.к. косинус 90 градусов это 0 А чем так способ удивляет? Может конечно я плохо помню школьную программу, но другого способа и не придумал как в треугольнике по всем известным сторонам углы найти кстати имена у меня не случайные все крутится вокруг координат х, у и переменных length и width (l, w) ну и косинус между (l, w) это один угол, а косинус между (l1, w1), это противоположный, как-то так... Не спорю ваш вариант интуитивно понятней, но тут дело вкуса Это сообщение отредактировал(а) BrAgOl - 19.9.2011, 16:54 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
BrAgOl, я уже говорил вам
Хотел чтобы сами разобрались, но увы... Здесь их надо просто переставить вот так: Удачи! |
|||
|
||||
| BrAgOl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 6.3.2005 Где: М.О. Репутация: нет Всего: нет |
А по точкам, наверное было бы полезно организовать проверку введенных пар точек, и при хаотичном введении пар, произвести обмен для упорядочивания... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |