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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lаmer
7 / 7 / 4
Регистрация: 24.03.2010
Сообщений: 25
#1

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

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

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

Геометрия - C++
Г Е О М Е Т Р И Ч Е С К И Е З А Д А Ч И -> Здесь выкладываем условия и/или решения геометрических задач <-

геометрия - C++
Решите пожалуйста, ребят ( Решить задачу, используя структуру point для хранения координат точки: Найти такую точку, сумма расстояний...

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

геометрия - C++
:help::help: Даны действительные числа x, y. Вычислить расстояние от точки плоскости с координатами (x, y) до границы квадрата * с...

Простая геометрия - C++
Недавно решал пачку задач на геометрию, но с одной не справился, даже сейчас не выходит. Постановка: Дан выпуклый многоугольник...

Геометрия и графика - C++
Решить задачу и отобразить решение графически на экране. Исходные данные прочитать из текстового файла. Задача: На плоскости задано...

1) массивы 2)геометрия - C++
Здравствуйте! Помогите пожалуйста решить задачи, очень надо! 1)Определить частоты вхождения в число N! (N<=100) цифр, из которых...

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

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

Геометрия. Симметричная точка - C++
Доброго времени суток!:) Задача : Дана прямая, проходящая через две различные точки (x1,y1) и (x2,y2). Найдите точку, симметричную...

чистая геометрия, но заваливается( - C++
http://acm.timus.ru/problem.aspx?space=1&num=1084 Козла пустили в квадратный огород и привязали к колышку. Колышек воткнули точно в...

Вычислительная геометрия, путь по сфере - C++
Нужна помощь с задачкой:( Яблоко имеет форму идеального шара радиуса R1. В центре яблока находится сердцевина также имеющая форму шара...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lаmer
7 / 7 / 4
Регистрация: 24.03.2010
Сообщений: 25
10.04.2010, 23:42  [ТС]     Геометрия в С++. #2
В задании опечатка не "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;
}
Ответ Создать тему
Опции темы

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