Задачка из геометрии: кто подскажет?

Задача: Три произвольно заданных точки лежат на окружности. Составить на Паскале программу опредения координат центра этой окружности.

На чем я застрял: раз три точки - ежику ясно: вершины треугольника с описанной вокруг него окружностью. Стороны, площадь, радиус - пожалуйста, не проблема вычислить, т.к. координаты точек есть. Но что дальше? ](*,)

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

Т.е. если одну сторону получившегося треугольника представить, как часть графика функции Y=kX+b, то перпендикуляр, если не ошибаюсь, будет Yp=-X/k+b (так?). Если добавить поправочный коэф-т, чтоб при Хсреднем давал Yсреднее - формула серединного перпендикуляра готова. Но как найти точку пересечения этих самых перпендикуляров (aka центр окружности) - вообще идей нету, школьная математика успела вылететь напрочь за эти годы. Да и было ли оно такое в школе?

А может есть более простой алгоритм? Задачка-то считается обычной контрольной для заочников, всего лишь второе задание из 4, причем остальные три я расщелкал как орешки...

Аватар пользователя mikkey

Ой, что енто.... shock
по почте проще прилетело, но тута не казало ?

Цитата:
x = 1/2*(x1^2+y1^2-2*y1*y-x3^2-y3^2+2*y3*y)/(x1-x3)

Аватар пользователя Root

mikkey
эт я стормозил )))) Там x=f(y) получается, а не ответ - я просто забыл поменять во втором уравнении x1 -> x2;) А тупая Maple чего-то там посчитала:)

Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P

Аватар пользователя mikkey

Помнится когда в политехе математик наш (клаасный мужык кстати) организовал нам посещение кампутарног класса, а тогда нормальные компы только начали появляться (386-ые :) ) мы на маткаде интегральчики всякие решали - он тоже выдавал такой ответ, что и сам упростить не мог, в ручную намного проще получалось:)

Аватар пользователя Root

mikkey
ну, с тех пор программы шагнули далеко. И моя любимая сейчас - Maple (нынче сижу на 9.5, а последняя - 10-ка). Конечно, дико большим интеллектом она не отличается, но много что делает сама. А если не нравится, то всегда ей можно сказать "а, ну, упрости-ка ты мне вот энто выражение". Обычно прокатывает.

Добавлено спустя 2 минуты 9 секунд:

PS: а правильный ответ выше и так в удобоваримом виде:)) Разве, что если на формулу для радиуса не глядеть:)

Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P

Аватар пользователя DanZer

Индейская изба фигвам получается... evil
Беру 3 произвольных точки в квадрате 400*400, например:
119,85


257,201
166,279
И выходит, что центр окружности будет примерно в 241,206, т.е. в аккурат рядом со второй точкой... shock

Даже программку на Дельфях накидал, что убедиться

const
 YMax: Integer = 400;
var
 Form1: TForm1;
 a:array [1..4] of array [1..2] of integer; // координаты точек закинуты в массив a[1,1]=x1, a[1,2]=x2, a[2,1]=x2 и т.д.
 MyMetafile: TMetafile;
 b1,b2,k1,k2,xa,ya,xb,yb:real;
 i:byte;
begin
 a[1,1]:=119;
 a[1,2]:=ymax-85; 
{т.к. ось OY идет сверху вниз, значение Y отнимаем от Ymax,
чтобы график рисовался как положено, а не вверх ногами}
 a[2,1]:=257;
 a[2,2]:=ymax-201;
 a[3,1]:=166;
 a[3,2]:=ymax-279;

 k1:=(a[1,1]-a[2,1])/(a[1,2]-a[2,2]);
 k2:=(a[2,1]-a[3,1])/(a[2,2]-a[3,2]);

 xa:=abs(a[1,1]+(a[2,1]-a[1,1])/2);
 ya:=abs(a[1,2]+(a[2,2]-a[1,2])/2);

 xb:=abs(a[2,1]+(a[3,1]-a[2,1])/2);
 yb:=abs(a[2,2]+(a[3,2]-a[2,2])/2);

 b1:=ya-k1*xa;
 b2:=yb-k2*xb;

{и, наконец, вычисляем координаты центра окружности}
 a[4,1]:=round((b2-b1)/(k1-k2)); {это x0}
 a[4,2]:=ymax-round(k2*a[4,1]+b2); {а это y0}
 
{и выводим результаты на экран}
 MyMetafile := TMetafile.Create;
 for i:=1 to 4 do
 begin
  with TMetafileCanvas.Create(MyMetafile, 0) do
   try
    if i<4 then Brush.Color := clRed else Brush.Color := clYellow;
    Ellipse(a[i,1]-3,a[i,2]-3,a[i,1]+3,a[i,2]+3);
   finally
     Free;
  end;
  Form1.Canvas.Draw(0,0,MyMetafile);
 end;
end.

Настоящий джентльмен назовет кошку кошкой, даже наступив на нее в темноте.
Что-то ищем? Google в помощь

DanZer писал(-а):
{т.к. ось OY идет сверху вниз, значение Y отнимаем от Ymax,
чтобы график рисовался как положено, а не вверх ногами}

ИМХО такими преобразованиями лучше заниматься непосредственно перед выводом на экран:)

Аватар пользователя DanZer

Да честно говоря - пофиг. Точки-то, по условию задачи, должны быть произвольно взятые, так что их координаты никакой роли не играют, если формула верна.

Даже если не отнимать - просто переворот графика получается, но вычисленный центр окружности по-любому не в центре.

Настоящий джентльмен назовет кошку кошкой, даже наступив на нее в темноте.
Что-то ищем? Google в помощь

Аватар пользователя Root

DanZer
формулу из Maple юзал?

Добавлено спустя 7 минут 31 секунду:

PS: все равно Maple рулит. Не надо формулу перенабивать вручную в паскаль, т.к. прога умеет делать сама преобразование в Сишный код

Цитата:
X0 = (x3 * x3 * y2 - y1 * x3 * x3 - y2 * y1 * y1 + x2 * x2 * y1 + x1 * x1 * y3 + y1 * y1 * y3 - y1 * y3 * y3 - y3 * x2 * x2 + y3 * y3 * y2 + y2 * y2 * y1 - y3 * y2 * y2 - y2 * x1 * x1) / (x3 * y2 - y3 * x2 - x1 * y2 + x1 * y3 + y1 * x2 - y1 * x3) / 0.2e1;
Y0 = -(x3 * x3 * x2 - x3 * x2 * x2 - x3 * y2 * y2 + y3 * y3 * x2 - x1 * x1 * x2 + x1 * x1 * x3 + x1 * x2 * x2 + x1 * y2 * y2 - x1 * x3 * x3 - x1 * y3 * y3 - y1 * y1 * x2 + y1 * y1 * x3) / (x3 * y2 - y3 * x2 - x1 * y2 + x1 * y3 + y1 * x2 - y1 * x3) / 0.2e1;

а на паскале перебить это уже не проблема.

Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P

DanZer писал(-а):
Индейская изба фигвам получается... evil
Беру 3 произвольных точки в квадрате 400*400, например:
119,85

257,201
166,279
И выходит, что центр окружности будет примерно в 241,206, т.е. в аккурат рядом со второй точкой... shock

По моим формулам:

{поиск центра окружности, описанной вокруг треугольника}
{проверка деления на ноль не производится}

Const
x1=119;
y1=85;
x2=257;
y2=201;
x3=166;
y3=279;

Var Xo,Yo:extended;

Function X0:extended;
Var chisl,znam:longint;
Begin
  chisl:=(y3-y2)*(x1*x1+y1*y1)+(y1-y3)*(x2*x2+y2*y2)+(y2-y1)*(x3*x3+y3*y3);
  znam :=2*((y1-y2)*(x1-x3)-(y1-y3)*(x1-x2));
  X0:=chisl/znam;
End;

Function Y0(x0:extended):extended;
Var chisl,znam:extended;
Begin
  chisl:=x1*x1-x2*x2+y1*y1-y2*y2-2*(x1-x2)*x0;
  znam :=2*(y1-y2);
  Y0:=chisl/znam;
End;

Procedure Check(x,y:real);
Var R1,R2,R3:extended;
Begin
  R1:=sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
  R2:=sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));
  R3:=sqrt((x3-x)*(x3-x)+(y3-y)*(y3-y));
  writeln('R1=',R1:4:2);
  writeln('R2=',R2:4:2);
  writeln('R3=',R3:4:2);
End;

BEGIN
  xo:=X0;
  yo:=Y0(xo);
  writeln('X0=',xo:4:2);
  writeln('Y0=',yo:4:2);
  writeln;
  Check(xo,yo);
END.

Результат работы:
-----------------
X0=158.47
Y0=178.13

R1=101.15
R2=101.15
R3=101.15

Аватар пользователя Root

xKVtor
решпект. Только выражение для X0 я бы написал выше выражения Y0, иначе не сразу видно, что у тебя Y0 = f(X0):(

Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • You can use BBCode tags in the text. URLs will automatically be converted to links.

Подробнее о форматировании текста

Антибот - введите цифру.
Ленты новостей