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

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

29.06.2011, 15:22. Просмотров 10727. Ответов 60


Надо написать программу на СИ, определяюшую радиус и центр окружности, проходящей по крайней мере через три различные точки заданного множества точек на плоскости и содержащей внутри наибольшее количество точек этого множества. Помогите пожалуйста!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2011, 15:22
Ответы с готовыми решениями:

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

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

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

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

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

я не представляю как это реализовать в программе...
0
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 15:46 4
втупую перебери все окружности, проходящие через три точки, другого способа скорее всего и нету
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
29.06.2011, 15:56  [ТС] 5
а кто-нибудь может написать эту программу?
0
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 15:59 6
да наверно много кто может, только зачем?
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
29.06.2011, 16:01  [ТС] 7
Мне это очень необходимо, сама я не могу написать ее... Надеюсь, что мне кто-нибудь поможет...
0
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
29.06.2011, 16:18 8
Цитата Сообщение от Protected_fleur Посмотреть сообщение
сама я не могу написать ее
по какой причине? если не знаешь языка то иди во фриланс
если знаешь то начни, а дальше посмотрим, говори чё именно не понятно, если это не касается синтаксиса С или аналитической геометрии
0
Эксперт С++
2193 / 1611 / 254
Регистрация: 29.05.2011
Сообщений: 3,306
29.06.2011, 17:23 9
Программа вычисляющая координаты центра и радиус окружности, описанной вокруг треугольника. Проверки треугольника на нулевую площадь нет. Формулы получены гибридизацией английской и русской страниц википедии.
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  [ТС] 10
Спасибо большое))) попробую теперь разобраться и дописать)))

Добавлено через 28 минут
Жаль, что не на СИ...
0
Эксперт С++
2193 / 1611 / 254
Регистрация: 29.05.2011
Сообщений: 3,306
29.06.2011, 20:16 11
Чёрт, когда это <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  [ТС] 12
блин((( что-то у меня после ввода точек вылетает...
0
Эксперт С++
2193 / 1611 / 254
Регистрация: 29.05.2011
Сообщений: 3,306
29.06.2011, 22:06 13
Вылетает, или закрывается?
создаю исполняемый файл запускаю окно появляется на доли секунды и изчезает
0
932 / 757 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.06.2011, 05:40 14
Добавь внизу функции main()
system("pause");
0
Эксперт С++
2193 / 1611 / 254
Регистрация: 29.05.2011
Сообщений: 3,306
01.07.2011, 14:04 15
Вместо моей функции norm можно использовать стандартную hypot. Вот блин, память подвела, пришлось велосипед изобретать.
Как же я про тебя забыл? Ⓒ
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
01.07.2011, 18:05  [ТС] 16
хм...
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 16:42  [ТС] 17
А кто-нибудь может переложить этот текст с 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
В вечном поиске...
275 / 235 / 30
Регистрация: 05.04.2011
Сообщений: 645
02.07.2011, 17:41 18
Protected_fleur, а что верхний вариант не подходит?
0
0 / 0 / 1
Регистрация: 29.06.2011
Сообщений: 77
02.07.2011, 17:45  [ТС] 19
нет, не подходит...там многого нет и кое-что надо переделать...нужно выбирать три точки из заданного множества и строить по ним окружность, причем такую, чтоб внутри нее оказалось максимальное число точек этого множества! задача на паскале подходит...но переделать на си ее не могу((((
0
Эксперт С++
2193 / 1611 / 254
Регистрация: 29.05.2011
Сообщений: 3,306
02.07.2011, 17:50 20
Цитата Сообщение от Protected_fleur Посмотреть сообщение
задача на паскале подходит...
Возможно я при переводе в sage где-то и ошибся, но вряд ли. В общем есть у меня сомнения, что функция Okr правильно определяет центр окружности.

Цитата Сообщение от Protected_fleur Посмотреть сообщение
но переделать на си ее не могу((((
Да ладно, они ж близнецы практически, что си, что паскаль
Вместо ":=" пишем "=", вместо "=" пишем "==", вместо sqr - квадрат... Где там проблемы-то? Математика, он и в Африке математика.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2011, 17:50

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

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

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

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

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


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

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

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