Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/92: Рейтинг темы: голосов - 92, средняя оценка - 4.62
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77

Написать программу, определяющую радиус и центр окружности, проходящей по крайней мере через три различные точки заданного множества точек

29.06.2011, 15:22. Показов 18953. Ответов 60

Студворк — интернет-сервис помощи студентам
Надо написать программу на СИ, определяюшую радиус и центр окружности, проходящей по крайней мере через три различные точки заданного множества точек на плоскости и содержащей внутри наибольшее количество точек этого множества. Помогите пожалуйста!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.06.2011, 15:22
Ответы с готовыми решениями:

Написать программу, определяющую радиус и центр окружности, проходящей по крайней мере через три различные точки заданного множества точек
Определить радиус и центр окружности, проходящей, по крайней мере, через три различные точки заданного множества точек на плоскости и,...

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

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

60
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 17:57  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от grizlik78 Посмотреть сообщение
они ж близнецы практически
ну не знаю... не особо уж близнецы... все это для меня сплошной кошмар на pascal...
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 18:58  [ТС]
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
#include <stdio.h>
#include <math.h>
 
// представление результата сруктурой
typedef struct CIRCLE
{
    double x;
    double y;
    double r;
} circle;
 
// вспомогательная функция, определитель специального вида
inline
static double det(
        double a1, double b1, double c1,
        double a2, double b2, double c2 )
{
    double d  = (a1*a1+a2*a2)*b2 + (b1*b1+b2*b2)*c2 + (c1*c1+c2*c2)*a2;
    d -= (a1*a1+a2*a2)*c2 + (b1*b1+b2*b2)*a2 + (c1*c1+c2*c2)*b2;
    return d;
}
 
// длина отрезка
inline
static double norm(double x1, double y1, double x2, double y2)
{
    double x = x1 - x2;
    double y = y1 - y2;
    return sqrt(x*x+y*y);
}
 
// вычисление описанной окружности
circle circumscribed(
        double x1, double y1,
        double x2, double y2,
        double x3, double y3 )
{
    circle crcl;
    double a = norm(x1, y1, x2, y2);
    double b = norm(x1, y1, x3, y3);
    double c = norm(x3, y3, x2, y2);
    double Dinv = 0.5/(x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2));
    crcl.r = a*b*c*fabs(Dinv);
    crcl.x =  Dinv*det(x1, x2, x3, y1, y2, y3);
    crcl.y = -Dinv*det(y1, y2, y3, x1, x2, x3);
    return crcl;
}
 
int main()
{
    double x1, y1;
    double x2, y2;
    double x3, y3;
    circle c;
 
    printf("Input x1 y1 x2 y2 x3 y3: ");
    scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3);
 
    c = circumscribed(x1, y1, x2, y2, x3, y3);
    printf("Center: (%g, %g)\n", c.x, c.y);
    printf("Radius: %g\n", c.r);
 
    return 0;
}

а можно в этой программе сделать так, чтоб она считала по любым трем точкам из заданного множества? как это сделать?
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.07.2011, 19:04
В строке 59 вызывать функцию с координатами любых 3 точек. Разумеется функцию main() надо переписывать заново.
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 19:13  [ТС]
Как вызвать эту функцию для любых трех точек???
насколько я понимаю, надо взять цикл...
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 19:15  [ТС]
например,
for (i=1; i<n; i++)
{
c = ... а тут как задать?
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.07.2011, 19:17

Если удобнее работать с точками как единым целым, а не с координатами по отдельности, то можно создать структуру для точки. Ну и интерфейс функции изменить тогда.
А в цикле, если я правильно понимаю, надо перебрать все возможные сочетания по 3 точки.

Добавлено через 58 секунд
Цитата Сообщение от Protected_fleur Посмотреть сообщение
c = ... а тут как задать?
Сначало сами точки нужны, чтобы их можно было хоть как-то использовать. Как точки хранятся?
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 19:27  [ТС]
Вот я начала переделывать main ...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main() {
        int i, j, n;
        circle c;
        
        printf("Enter number points( n>2 ): ");
        scanf("%d", &n);
        if(n<=2) { 
        printf("Number points is little");  
        _getch();
        return 0;  }
 
        float ** Points = new  float* [n];
        for (i=0; i<n; i++)
        {
                Points[i]= new float [2];
                printf("Enter pair[%d]:\n x: ", i + 1); 
                scanf("%f", &Points[i][X]);
                printf("y: ");              
                scanf("%f", &Points[i][Y]); }
                
                for (i=1; i<n; i++)
        {               
                        c =
Добавлено через 38 секунд
т.е ввожу их сама...

Добавлено через 8 минут
А как вызвать функцию для этих точек не знаю....
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.07.2011, 19:34
Ну, раз точки массивами, то не Points[i][X], а Points[i][0], ну и с [Y] так же, [1]
Примерно как в паскалевской:
C
1
2
3
4
5
6
7
8
9
for (i=0; i<n-2; i++)
  for (j=i+1; j<n-1; j++)
    for (k=j+1; k<n; k++)
    {
      c = circumscribed(
              Points[i][0], Points[i][1],
              Points[j][0], Points[j][1],
              Points[k][0], Points[k][1] );
    }
Добавлено через 5 минут
Только это... Поскольку очередные 3 точки запросто могут оказаться на одной прямой, то проверка на это дело всё-таки нужна. Я уже говорил, что в моей функции проверка отсутствует, в этом случае получится деление на 0.
1
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 19:35  [ТС]
А как сделать проверку?
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.07.2011, 19:41
Проверять, не равна ли нулю площадь треугольника. То есть если (x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2)) по модулю близко к 0, то переходить к следующему набору точек (например с помощью continue).
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 19:45  [ТС]
спасибо)))
у меня есть еще вопрос: как сделать, чтоб эта окружность содержала внутри наибольшее количество точек заданного множества??? нужно вроде подсчитать точки внутри и снаружи...но как это сделать???
подскажите пожалуйста
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.07.2011, 19:48
Перебрать все точки, да посчитать, сколько их внутри
Точка (x,y) лежит внутри окружности (x0,y0,R), если (x-x0)²+(y-y0)² < R²
При равенстве точка лежит на окружности. Я бы тоже отнёс ко внутренним для данной задачи.
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 19:49  [ТС]
точно... Спасибо большое
мне аж жить хочется когда начинаю понимать...
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 21:15  [ТС]
понять-то поняла... а как это реализовать?
как сделать, чтоб происходил перебор всех точек, после того как получили окружность?
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
int main() {
        int i, j, n, k;
        circle c;
        
        printf("Enter number points( n>2 ): ");
        scanf("%d", &n);
        if(n<=2) { 
        printf("Number points is little");  
        _getch();
        return 0;  }
 
        float ** Points = new  float* [n];
        for (i=0; i<n; i++)
        {
                Points[i]= new float [2];
                printf("Enter pair[%d]:\n x: ", i + 1); 
                scanf("%f", &Points[i][0]);
                printf("y: ");              
                scanf("%f", &Points[i][1]); }
                
        for (i=0; i<n-2; i++)
        for (j=i+1; j<n-1; j++)
        for (k=j+1; k<n; k++)  {
            c = cir(
              Points[i][0], Points[i][1],
              Points[j][0], Points[j][1],
              Points[k][0], Points[k][1] );  }
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 21:18  [ТС]
как задать этот цикл перебора?
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.07.2011, 21:24
C
1
2
3
for (m=0; m<n; m++)
{
}
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 21:27  [ТС]
неет...ну это то понятно... я не знаю, как использовать точку центра, вычисленной окружности, когда перебираю точки...как этот цикл засунуть сюда???
C
1
2
3
4
5
6
7
for (i=0; i<n-2; i++)
        for (j=i+1; j<n-1; j++)
        for (k=j+1; k<n; k++)  {
            c = cir(
              Points[i][0], Points[i][1],
              Points[j][0], Points[j][1],
              Points[k][0], Points[k][1] );  }
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.07.2011, 21:33
Что стало с моими ровненькими отступами?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for (i=0; i<n-2; i++)
  for (j=i+1; j<n-1; j++)
    for (k=j+1; k<n; k++)
    {
      c = circumscribed(
              Points[i][0], Points[i][1],
              Points[j][0], Points[j][1],
              Points[k][0], Points[k][1] );
      for (m=0; m<n; m++)
      {
        // на самом деле сравнивать надо не гипотенузу и радиус,
        // а сумму квадратов разностей и квадрат радиуса, но мне лень :)
        if (hypot(Points[m][0]-c.x, Points[m][1]-c.y) <= c.r)
        {
          // внутри
        }
        else
        {
          // снаружи
        }
      }
    }
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 21:40  [ТС]
а ну насчет отступов это да...проблема препод вечно ворчит блин, ну мне так удобно...
а за цикл спасибо, надеюсь доделаю эту прогу наконец-то...
0
02.07.2011, 21:44

Не по теме:

Цитата Сообщение от Protected_fleur Посмотреть сообщение
а ну насчет отступов это да...проблема препод вечно ворчит блин, ну мне так удобно...
Он не ворчит, он стонет. И это не может быть удобно, потому что это не может быть удобно никогда :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2011, 21:44

Найдите центр и радиус окружности, проходящей через три заданные точки на плоскости.
Народ!! Помогите, пожалуйста, решить задачу Найдите центр и радиус окружности, проходящей через три заданные точки на плоскости.

Выбрать три различные точки из заданного множества точек на плоскости
Выбрать три различные точки из заданного множества точек на плоскости так, чтобы разность между количеством точек, лежащих внутри...

Из заданного на плоскости множества точек выбрать три различные точки
Здравствуйте, помогите пожалуйста написать программу: Из заданного на плоскости множества точек выбрать три различные точки так, чтобы...

Из заданного на плоскости множества точек выбрать три различные точки
Само задание звучит так: &quot;Из заданного на плоскости множества точек выбрать три различные точки так, чтобы разность между площадью...

Работа С Массивами (Выбрать три различные точки из заданного множества точек на плоскости так...)
Задание: Выбрать три различные точки из заданного множества точек на плоскости так, чтобы была минимальной разность между количествами...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru