Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Lаmer
7 / 7 / 7
Регистрация: 24.03.2010
Сообщений: 25
1

Геометрия в С++.

24.03.2010, 22:20. Просмотров 663. Ответов 1
Метки нет (Все метки)

Здравствуйте. Помогите решить задчу: "Даны два множества точек на плоскости. Найти радиус и центр окружности, проходящей через n (n>=3) точек первого множества и содержащей строго внутри себя равное число точек первого и второго множеств". (Без графического режима).
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2010, 22:20
Ответы с готовыми решениями:

Геометрия
Г Е О М Е Т Р И Ч Е С К И Е З А Д А Ч И -> Здесь выкладываем условия и/или...

геометрия
Решите пожалуйста, ребят ( Решить задачу, используя структуру point для...

геометрия
:help::help: Даны действительные числа x, y. Вычислить расстояние от точки...

Геометрия в С++
Даны две вершины прямоугольного треугольника A,B,так же известны угол A и угол...

Простая геометрия
Недавно решал пачку задач на геометрию, но с одной не справился, даже сейчас не...

1
Lаmer
7 / 7 / 7
Регистрация: 24.03.2010
Сообщений: 25
10.04.2010, 23:42  [ТС] 2
Лучший ответ Сообщение было отмечено Lаmer как решение

Решение

В задании опечатка не "n>=3", а "n = 3".

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
struct Spaces
{
    double x1;
    double x2;
    double y1;
    double y2;
};
 
inline void Fil(struct Spaces* spaces, size_t m);
inline void Out(struct Spaces* spaces, size_t m);
void GeoAnalyse(struct Spaces* spaces, size_t m);
 
int main(void)
{
    setlocale(0, "");
    size_t n;
    std::cout << "Введите размерность множеств -> ";
    std::cin >> n;
    Spaces *spaces = new Spaces[n];
    if(spaces)
    {
        std::cout << "Память выделена успешно: " << "spaces[0] = " << &spaces[0];
        std::cout << std::endl;
    }
    else 
    {
        std::cout << "Невозможно выделить память. Дальнейшая работа программы невозможна\n";
        abort();
    }
    Fil(spaces, n);
    Out(spaces, n);
    GeoAnalyse(spaces, n);
    delete[] spaces;
    system("pause");
    return 0;   
}
 
void Fil(struct Spaces* spaces, size_t m)
{
    srand(time(NULL));
    for(size_t i = 0; i < m; ++i)
    {
        spaces[i].x1 = rand()%301 - 101;
        spaces[i].y1 = rand()%301 - 101;
        spaces[i].x2 = rand()%301 - 101;
        spaces[i].y2 = rand()%301 - 101;
    }
}
 
void Out(struct Spaces* spaces, size_t m)
{
    std::cout << "\nТекущее состояние множеств:\n";
    for(size_t i = 0; i < m; ++i)
    {
        std::cout << spaces[i].x1 << '\t';
        std::cout << spaces[i].y1 << '\t';
        std::cout << spaces[i].x1 << '\t';
        std::cout << spaces[i].y1 << '\t';
    }
}
 
void GeoAnalyse(struct Spaces *spaces, size_t m)
{
    double a;
    double b;
    double c;
    double ax;
    double ay;
    double bx;
    double by;
    double cx;
    double cy;
    size_t i;
    for(i = 0; i < 2 * m; ++i)
    {
        a = sqrt(pow(spaces[i + 1].x1 - spaces[i].x1, 2)        
            + pow(spaces[i + 1].y1 - spaces[i].y1, 2));
        b = sqrt(pow(spaces[i + 2].x1 - spaces[i + 1].x1, 2) 
            + pow(spaces[i + 2].y1 - spaces[i + 1].y1, 2));
        c = sqrt(pow(spaces[i + 2].x1 - spaces[i].x1, 2) 
            + pow(spaces[i + 2].y1 - spaces[i].y1, 2));     
        if((a < (b + c)) || (b < (c + a)))
        {
            ax = spaces[i].x1;
            ay = spaces[i].y1;
            bx = spaces[i + 1].x1;
            by = spaces[i + 1].y1;
            cx = spaces[i + 2].x1;
            cy = spaces[i + 2].y1;
            std::cout << "\nВыявлены опорные точки окружности: ";
            std::cout << "A(" << ax << ", " << ay << "), ";
            std::cout << "B(" << bx << ", " << by << "), ";
            std::cout << "С(" << cx << ", " << cy << ")\n";
            break;
        }
    }
    double p = (a + b + c)/2.0;
    double ar = sqrt(p * (p - a) * (p - b) * (p - c));
    double preax = pow(ax, 2);
    double preay = pow(ay, 2);
    double prebx = pow(bx, 2);
    double preby = pow(by, 2);
    double precx = pow(cx, 2);
    double precy = pow(cy, 2);
    double xCentre = (-(1.0)/(4 * ar)) * (bx * (precx + precy) - cx * (prebx + preby)
                       - (ax * (precx - precy) - cx * (preax - preay) + ax * (prebx + preby)
                               - (bx * (preax + preay))));
    double yCentre = (1.0/(4 * ar)) * (by * (precx + precy) - cy * (prebx + preby)
                       - (ay * (precx - precy) - cy * (preax - preay) + ay * (prebx + preby)
                               - (by * (preax + preay))));
    std::cout << "Выявлен центр окружности: O(" << xCentre << ", " << yCentre << ")\n";
    double rad = (a * b * c)/ar;
    size_t iter = 0;
    std::cout << "Выявлен радиус окружности: " << rad << '\n';
    std::cout << std::endl;
    std::cout << "Выявлены несколько точек 1-го и 2-го множеств, охватываемых окружностью: \n";
    for(i = 0; i < 4 * m; ++i)
    {
        if((sqrt((pow((spaces[i].x1 - xCentre), 2)) + (pow((spaces[i].y1 - yCentre), 2))) < rad) 
            && (sqrt((pow((spaces[i].x2 - xCentre), 2)) + (pow((spaces[i].y2 - yCentre), 2))) < rad))
        {
            std::cout << "точка с координатами \t(" << spaces[i].x1 << ", " << spaces[i].y1 
                << ")\t принадлежит 1-му множеству\n";
            std::cout << "точка с координатами \t(" << spaces[i].x2 << ", " << spaces[i].y2
                << ")\t принадлежит 2-му множеству\n";
            ++iter;
        }
        if(iter > 3) 
            break;
    }
    std::cout << std::endl;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2010, 23:42

Вычислительная геометрия на С
Заданы координаты N точек. Определить те две точки, проведенная через которые...

Геометрия и графика
Решить задачу и отобразить решение графически на экране. Исходные данные...

Геометрия(треугольник)
Даны два угла треугольника (в градусах). Определить, существует ли такой...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru