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

Проверить, лежат ли данные точки на одной окружности - C++

Восстановить пароль Регистрация
 
hiddenofheaven
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 28
01.05.2014, 11:23     Проверить, лежат ли данные точки на одной окружности #1
Задан размер массива действительных чисел и значения его элементов. Считая, что пары элементов представляют собой координаты точек на плоскости, проверить, могут ли все данные точки лежать на одной окружности и, если да, найти ее радиус.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2014, 11:23     Проверить, лежат ли данные точки на одной окружности
Посмотрите здесь:

Определить, лежат ли точки на одной прямой C++
C++ Определить, лежат ли три точки A, B, C на одной прямой. Если нет, найти угол ABC
C++ Найти минимальный радиус шара, который будет охватывать все заданные точки(центр окружности лежит на одной из заданных точек)
Лежат ли точки на одной прямой и вычислить угол C++
Три точки заданы координатами. Определить, лежат ли они на одной прямой C++
C++ Определить, лежат ли две заданные точки на окружности с центром в начале координат
Определить лежат ли две точки в одной координатной четверти C++
Лежат ли точки в одной плоскости? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
01.05.2014, 12:13     Проверить, лежат ли данные точки на одной окружности #2
Уравнение окружности: http://www.cyberforum.ru/cgi-bin/latex.cgi?{(x-a)}^{2}+{(y-b)}^{2}={r}^{2}
Раскрываем скобки, получаем http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{2}-2ax+{a}^{2}+{y}^{2}-2by+{b}^{2}={r}^{2}

Уравнение окружности можно написать минимум по трем точкам на окружности. Так что пишем этот уравнение для трех точек (вручную, через http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{1}, {x}_{2}, {x}_{3}, {y}_{1}, {y}_{2}, {y}_{3}), находим формулы а и b.

Находим значения а и b для первых трех точек, запоминаем их. И потом находим значения а и b для 2й 3й и 4й, 3й 4й и 5й и т.д. точек. Если не совпало - значит нет такой окружности. Если у всех совпало, значит у нас уже есть значения а и b, с помощью них и любой точки находим r.

Там длинные формулы получаются, так что я не находила, но все реализуемо.
IrineK
Заблокирован
01.05.2014, 13:45     Проверить, лежат ли данные точки на одной окружности #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
#include <iostream>
#include <cmath>
 
//структура - точка с двумя вещественными координатами
typedef struct _TPoint
{   double x,y;
}   TPoint;
 
//находим центр окружности по трем точкам с точностью epsilon
bool GetCenter (const TPoint *p1, const TPoint *p2, const TPoint *p3, TPoint *center, double epsilon)
{   double a = p2->x - p1->x;
    double b = p2->y - p1->y;
    double c = p3->x - p1->x;
    double d = p3->y - p1->y;
    
    double e = a*(p1->x + p2->x) + b*(p1->y + p2->y);
    double f = c*(p1->x + p3->x) + d*(p1->y + p3->y);
    double g = 2*(a*(p3->y - p2->y) - b*(p3->x - p2->x));
 
    //если точки на одной прямой или совпадают
    if (fabs(g) < epsilon)      //g = 0 с точностью epsilon
        return false;
 
    center->x = (d*e - b*f) / g;
    center->y = (a*f - c*e) / g;
    return true;
}
 
//проверка двух точек на равенство с точностью epsilon
bool IsEqual (TPoint *p1, TPoint *p2, double epsilon)
{   return (fabs (p1->x - p2->x)<epsilon) && (fabs (p1->y - p2->y)<epsilon);
}
 
//расстояние межжду двумя точками
double Distance (const TPoint *p1, const TPoint *p2)
{   return sqrt((p1->x - p2->x)*(p1->x - p2->x) + (p1->y - p2->y)*(p1->y - p2->y));
}
 
//проверка массива точек на принадлежность одной окружности с точностью epsilon
bool CheckArray (const TPoint *arr, int size, double epsilon)
{   //если в массиве меньше 3 точек - проверять нечего
    if (size < 3)
        return false;
 
    TPoint center = {0,0};
    //если первые три точки на одной прямой или совпадают
    if (!GetCenter (&arr[0], &arr[1], &arr[2], &center, epsilon))
        return false;
 
    for (int i = 1; i<size-2; i++)
    {   TPoint center1 = {0,0};
        //если последующие тройки точек на одной прямой или совпадают
        if (!GetCenter (&arr[i], &arr[i+1], &arr[i+2], &center1, epsilon))
            return false;
        //если найденные центры не совпадают
        if (!IsEqual (&center, &center1, epsilon))
            return false;
    }
 
    //точки лежат на окружности, выводим координаты центра и радиус
    std::cout << "Center:\txC = " << center.x << "\tyC = " << center.y << "\n";
    std::cout << "Radius:\tR = " << Distance (&arr[0], &center) << "\n"; 
    return true;
}
 
int main()
{   const TPoint arr[] = {{1,1}, {3,3}, {1,3}, {3,1}, {2, 2+sqrt(2.)}, {2, 2-sqrt(2.)}};
    int size = sizeof(arr) / sizeof(TPoint);
    double epsilon = 1e-12;         //вещественный ноль (точность расчетов)
 
    if (!CheckArray (arr, size, epsilon))
        std::cout << "The points DO NOT FORM a circle";
    else
        std::cout << "The points FORM a circle";
     
    std::cin.get();
    return 0;
}
Изображения
 
Yandex
Объявления
01.05.2014, 13:45     Проверить, лежат ли данные точки на одной окружности
Ответ Создать тему
Опции темы

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