Форум программистов, компьютерный форум CyberForum.ru

Даны координаты вершин треугольника, и нужно найти наибольший угол в нем - C++

Восстановить пароль Регистрация
 
bes4etnov
 Аватар для bes4etnov
0 / 0 / 0
Регистрация: 19.01.2014
Сообщений: 9
19.01.2014, 14:23     Даны координаты вершин треугольника, и нужно найти наибольший угол в нем #1
Всем привет!

Решаю задачку {ссылка удалена} (Задача А), где даны координаты вершин треугольника, и нужно найти наибольший угол в нем.

 Комментарий модератора 
Задание должно быть перепечатано на форум.
Прикрепляйте файлы и изображения к сообщениям.
Создавайте тему в соответствующем разделе.


Добавлено через 5 минут
Ну так вот.

Это код моей программы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
 
const double PI = acos(-1);
double max = 0;
 
struct vect {   // Структура "вектор".
    int x, y;
    vect(int _x, int _y) : x(_x), y(_y){}
};
 
int operator * (vect a, vect b){    // Скалярное произведение векторов.
    return a.x*b.x + a.y*b.y;
}
 
double operator ^ (vect a, vect b){ // Угол мужду векторами (возвращает косинус).
    return (a*b)/(sqrt(a.x*a.x + a.y*a.y) * sqrt(b.x*b.x + b.y*b.y));
}
 
void compare(vect a, vect b){
    if (max < acos(a^b) * 180 / PI)
        max = acos(a^b) * 180 / PI;
}
 
int main(){
    ifstream cin("input.txt");
    ofstream cout("output.txt");
    cout.setf(ios::fixed);
    cout.precision(10);
    int x1, x2, x3, y1, y2, y3; 
 
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
 
    vect a(x1 - x2, y1 - y2), b(x3 - x2, y3 - y2);
    compare(a, b);
    a.x = x1 - x3; a.y = y1 - y3; b.x = x2 - x3; b.y = y2 - y3;
    compare(a, b);
    a.x = x2 - x1; a.y = y2 - y1; b.x = x3 - x1; b.y = y3 - y1;
    compare(a, b);
 
    cout << max;
 
    cin.close();
    cout.close();
    return 0;
}
Она работает правильно.

Но иногда возникает проблема с точностью вычислений:
например, когда вводишь координаты 0;0, 2;2, 4;4 (лежат на одной прямой), то вместо 180 программа выводит очень необычный ответ: 179.9999987926.

В чем дело, я так и не понял.
В интернете ничего дельного не нашел...

Возможно, это как-то связано с функциями sqrt() и acos().

Как вы думаете, в чем проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.01.2014, 14:23     Даны координаты вершин треугольника, и нужно найти наибольший угол в нем
Посмотрите здесь:

C++ Даны координаты вершин треугольника и координаты некоторой точки внутри него
C++ найти площадь треугольника abc если известны координаты его вершин
C++ Найти площадь треугольника, если заданы координаты его вершин
C++ Найти площадь треугольника, если заданы координаты его вершин
Даны координаты трех вершин треугольника. Найти середины его сторон C++
Заданы координаты вершин треугольника. Вывести их в порядке обхода треугольника по часовой стрелке C++
C++ Найти площадь треугольника, если известны координаты его вершин
C++ Найти координаты вершин треугольника из bmp файла

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
__General__
24 / 24 / 3
Регистрация: 04.01.2014
Сообщений: 91
Завершенные тесты: 2
19.01.2014, 15:58     Даны координаты вершин треугольника, и нужно найти наибольший угол в нем #2
bes4etnov, а никто не говорил, что вычисления в даблах дают абсолютную точность.

А в данном случае основная проблема, думаю, в числе ПИ. Вывел на экран acos(-1):
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    cout <<acos(-1.);
    cin.get();
 
    return 0;
}
Ваше число пи всего лишь 3.14159 - т. е. точность всего 5 знаков - отсюда и такая погрешность.
bes4etnov
 Аватар для bes4etnov
0 / 0 / 0
Регистрация: 19.01.2014
Сообщений: 9
19.01.2014, 18:58  [ТС]     Даны координаты вершин треугольника, и нужно найти наибольший угол в нем #3
__General__, ахах!

А попробуй задать пи так:
C++
1
const double PI = 3,14159265358979323846264338327950288419716939937510582097494459;
И выведи:
C++
1
cout << PI;
О неет, в инициализации ведь столько знаков, почему выводит только 3.14159...
Попробуй!)
Yandex
Объявления
19.01.2014, 18:58     Даны координаты вершин треугольника, и нужно найти наибольший угол в нем
Ответ Создать тему
Опции темы

Текущее время: 21:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru