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

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

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

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

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

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

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

60
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.06.2011, 15:26
задача специфическая, и там где вы учитесь наверняка решали подобные задачи, представте нам свои соображения
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
29.06.2011, 15:32  [ТС]
К сожалению, ничего подобного мы не решали((( знаю только, что по этим трем точкам нужен треугольник, надо провести серединные перпендикуляры, провести окружность и определить радиус и центр...про остальное вообще не знаю...

я не представляю как это реализовать в программе...
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 15:46
втупую перебери все окружности, проходящие через три точки, другого способа скорее всего и нету
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
29.06.2011, 15:56  [ТС]
а кто-нибудь может написать эту программу?
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 15:59
да наверно много кто может, только зачем?
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
29.06.2011, 16:01  [ТС]
Мне это очень необходимо, сама я не могу написать ее... Надеюсь, что мне кто-нибудь поможет...
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 16:18
Цитата Сообщение от Protected_fleur Посмотреть сообщение
сама я не могу написать ее
по какой причине? если не знаешь языка то иди во фриланс
если знаешь то начни, а дальше посмотрим, говори чё именно не понятно, если это не касается синтаксиса С или аналитической геометрии
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
29.06.2011, 17:23
Программа вычисляющая координаты центра и радиус окружности, описанной вокруг треугольника. Проверки треугольника на нулевую площадь нет. Формулы получены гибридизацией английской и русской страниц википедии.
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
#include <iostream>
#include <cmath>
 
using namespace std;
 
// представление результата сруктурой с инициализатором
struct circle
{
    double x;
    double y;
    double r;
    circle() : x(0), y(0), r(0) {}
    circle(double x0, double y0, double radius) : x(x0), y(y0), r(radius) {}
};
 
// вспомогательная функция, определитель специального вида
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 circumscr<F12>ibed(
        double x1, double y1,
        double x2, double y2,
        double x3, double y3 )
{
    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));
    double r = a*b*c*fabs(Dinv);
    double x0 =  Dinv*det(x1, x2, x3, y1, y2, y3);
    double y0 = -Dinv*det(y1, y2, y3, x1, x2, x3);
    return circle(x0, y0, r);
}
 
int main()
{
    double x1, y1;
    double x2, y2;
    double x3, y3;
 
    cout << "Input x1 y1 x2 y2 x3 y3: ";
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
 
    circle c = circumscribed(x1, y1, x2, y2, x3, y3);
    cout << "Center: (" << c.x << ", " << c.y << ")\n";
    cout << "Radius: " << c.r << endl;
 
    return 0;
}
Ещё что-то есть здесь: Окружности и треугольник!. Не проверял.

Ну а перебор, это уж пусть кто-то другой. Или сама
3
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
29.06.2011, 19:10  [ТС]
Спасибо большое))) попробую теперь разобраться и дописать)))

Добавлено через 28 минут
Жаль, что не на СИ...
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
29.06.2011, 20:16
Чёрт, когда это <F12> пролезла в название функции?
Ну а сами функции вычислительные практически на Си, отличий не много там. Но раз уж ошибка вкралась, то вот на Си вариант.
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;
}
Добавлено через 54 секунды
Да, inline для Си тоже может стать неожиданностью. Тогда их просто убрать надо будет.
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
29.06.2011, 20:59  [ТС]
блин((( что-то у меня после ввода точек вылетает...
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
29.06.2011, 22:06
Вылетает, или закрывается?
создаю исполняемый файл запускаю окно появляется на доли секунды и изчезает
0
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.06.2011, 05:40
Добавь внизу функции main()
system("pause");
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.07.2011, 14:04
Вместо моей функции norm можно использовать стандартную hypot. Вот блин, память подвела, пришлось велосипед изобретать.
Как же я про тебя забыл? Ⓒ
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
01.07.2011, 18:05  [ТС]
хм...
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 16:42  [ТС]
А кто-нибудь может переложить этот текст с Pascal на СИ или хотя бы на C++ ???
Pascal
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
uses crt;
const nmax=50;
      e=0.01;
type
Point=record {точка}
      x,y:real;{координаты}
      end;
Okruz=record {окружность}
      o:Point;{координаты центра}
      r:real;{радиус}
    end;
MassP=array[1..nmax] of Point; {множество-массив точек}
procedure Tochki(var t:MassP;var n:integer);{создание множества точек}
var i:integer;
begin
repeat
write('Количество точек от 3 дo ',nmax,' n=');
readln(n);
until n in [3..nmax];
for i:=1 to n do
 begin
  t[i].x:=10*random;
  t[i].y:=10*random;
 end;
write('X:');
for i:=1 to n do
write(t[i].x:5:2);
writeln;
write('Y:');
for i:=1 to n do
write(t[i].y:5:2);
writeln;
end;
{вычисление параметров окружности, проходящей через три точки}
procedure Okr(t1,t2,t3:Point;var ok:Okruz);
var a,b,x,y:real;
    k0,k1,k2,m0,m1,m2:real;
begin
k0:=sqr(t1.x)-sqr(t2.x)+sqr(t1.y)-sqr(t2.y);
k1:=2*(t1.y-t2.y);
k2:=2*(t1.x-t2.x);
m0:=sqr(t1.x)-sqr(t3.x)+sqr(t1.y)-sqr(t3.y);
m1:=2*(t1.y-t3.y);
m2:=2*(t1.x-t3.x);
a:=k2*m0-k0*m2;
b:=k2*m1-k1*m2;
if b=0 then exit;
y:=a/b;
ok.o.y:=y;
if abs(m2) > e then x:=(m0-y*m1)/m2
else
  if abs(k2) > e then x:=(k0-y*k1)/k2
  else exit;
ok.o.x:=x;
ok.r:=sqrt(sqr(t1.x-x)+sqr(t1.y-y));
end;
{определение принадлежности точки окружности}
function Prin(a:Point;ok:Okruz):boolean;
begin
if (sqr(a.x-ok.o.x)+sqr(a.y-ok.o.y))-sqr(ok.r)<-e then Prin:=true
else Prin:=false
end;
 
var t:MassP;
    ok:Okruz;
    n,i,j,k,l,k1,k2,mn,vn,nr:integer;
    r,x,y:real;
begin
randomize;
Tochki(t,n);
mn:=n;
r:=0;
x:=0;
y:=0;
for i:=1 to n-2 do
for j:=i+1 to n-1 do
for k:=j+1 to n do
 begin
  Okr(t[i],t[j],t[k],ok);
  k1:=0;k2:=0;
  for l:=1 to n do
  if Prin(t[l],ok)then k1:=k1+1 {считаем внутри}
  else k2:=k2+1;{снаружи}
  if abs(k1-k2)<mn then{если разность меньше, запоминаем все параметры}
   begin
    mn:=abs(k1-k2);
    r:=ok.r;
    x:=ok.o.x;
    y:=ok.o.y;
    vn:=k1;
    nr:=k2-3;
   end;
 end;
writeln('Окружность: координаты центра x0=',x:0:2,' Y0=',y:0:2,' R=',r:0:2);
writeln('Внутри точек=',vn,' снаружи=',nr);
end.
Добавлено через 1 минуту
Я Pascal, к сожалению, вообще не знаю...
Помогите пожалуйста!
0
В вечном поиске...
 Аватар для Nursik77
275 / 235 / 30
Регистрация: 05.04.2011
Сообщений: 645
02.07.2011, 17:41
Protected_fleur, а что верхний вариант не подходит?
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 17:45  [ТС]
нет, не подходит...там многого нет и кое-что надо переделать...нужно выбирать три точки из заданного множества и строить по ним окружность, причем такую, чтоб внутри нее оказалось максимальное число точек этого множества! задача на паскале подходит...но переделать на си ее не могу((((
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
02.07.2011, 17:50
Цитата Сообщение от Protected_fleur Посмотреть сообщение
задача на паскале подходит...
Возможно я при переводе в sage где-то и ошибся, но вряд ли. В общем есть у меня сомнения, что функция Okr правильно определяет центр окружности.

Цитата Сообщение от Protected_fleur Посмотреть сообщение
но переделать на си ее не могу((((
Да ладно, они ж близнецы практически, что си, что паскаль
Вместо ":=" пишем "=", вместо "=" пишем "==", вместо sqr - квадрат... Где там проблемы-то? Математика, он и в Африке математика.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.07.2011, 17:50
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru