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

Определить угол, под которым виден многоугольник. Алгоритм! - C++

Восстановить пароль Регистрация
 
RodionSabitov
1 / 1 / 0
Регистрация: 19.07.2012
Сообщений: 63
09.12.2013, 23:33     Определить угол, под которым виден многоугольник. Алгоритм! #1
Добрый вечер, господа! Следующая задачка:
Дан многоугольник набором точек и произвольная точка на плоскости. Определить угол, под которым виден многоугольник с заданной точки.

Имеющийся у меня алгоритм решения (просто находит максимальный угол между вектором исходной точки и фиксированной вершины многоугольника и вектором, образованным также исходной точкой и всеми остальными вершинами. далее находит минимальный угол. и разность max - min выдает за искомую). Я подставил пример с треугольником (1,3) (5,7) (11,3) и исходную точку (6,1). Должен быть угол 135°, а выдает 77°.
Есть ли у кого идеи по поводу алгоритма решения данной задачи?

Текст программы:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <math.h>
 
#define MAXN 100000
#define INF 1e+9
 
 
struct point {
    double x, y;
};
//point constructor
struct point ppoint (double _x, double _y) {
    struct point res; 
    res.x = _x;
    res.y = _y;
    return res;
}
//Vector == point
#define Vector struct point
//vector substraction
Vector minus (Vector a, Vector b) {
    return ppoint(a.x - b.x, a.y - b.y);
}
//scalar multiplication
double dot(Vector a, Vector b) {
    return a.x * b.x + a.y * b.y;
}
//cross multiplication
double cross( Vector a,  Vector b) {
    return a.x * b.y - a.y * b.x;
}
//angle between vectors
double angle( Vector a,  Vector b) {
    return atan2(cross(a, b), dot(a, b));
}
//point reading
struct point pread() {
    double x, y;
    scanf("%lf%lf", &x, &y);
    return ppoint(x, y);
}
 
struct point polygon[MAXN];
 
int main() {
    //freopen("inp", "r", stdin);
    //freopen("outp", "w", stdout);
    double min = INF, max = -INF; 
    double ans = 0;
    double a;
    int n; 
    int i;
    struct point o;
    printf("input dot\n");  
    o = pread();
    printf("input n\n");
    scanf("%d", &n);
    printf("input dots of polygon\n");
    for (i = 0; i < n; i++) {
        polygon[i] = pread();
    }
    for (i = 0; i < n; i++) {
        printf("%lf %lf\n",polygon[i].x,polygon[i].y);
    }
 
 
    // ans == MAX_ANGLE - MIN_ANGLE
    for (i = 1; i < n; i++) {
        a = angle(minus(polygon[i], o), minus(polygon[1], o));
        printf("%d %lf\n", i, a);
        min = min > a ? a : min;
        max = max < a ? a : max;
    }
    //ans = max - min
    printf("%lf %lf\n", max, min);
    printf("%lf", (max - min));
    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2013, 23:33     Определить угол, под которым виден многоугольник. Алгоритм!
Посмотрите здесь:

Вывести полное имя программы, под которым она была запущена. C++
C++ алгоритм и программу для определения минимального количества первых символов, по которым можно различать слова с заданного текста.
Ввести количество точек, получить многоугольник, закрасить многоугольник построчно. C++
C++ Вычислить угол под которым брошено тело
C++ Определить, является ли заданный многоугольник выпуклым
C++ Определить выпуклый ли многоугольник.
C++ Нужен алгоритм, которым можно проверить, правильно ли пользователь расставил скобки
C++ Определить сотрудников, которым в следующем году достигнут пенсионного возраста (выводится только 1 сотрудник)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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