Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.01.2008, 19:44
4ingiz 4ingiz вне форума
Прохожий
 
Регистрация: 18.01.2008
Сообщения: 1
Репутация: 10
По умолчанию задача

Нужно написать прогу,которая определяет,можно ли вписать в четырехугольник окружность,если даны координаты вершин(х,у)и,если можно,найти центр.
Ответить с цитированием
  #2  
Старый 20.01.2008, 12:17
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Радость Задача

Вообще-то никто за тебя решать задачу не будет, и я бы не стал, но стало самому интересно...

Найти координаты центра вписанной в треугольник окружности
с координатами вершин P1(X,Y) P2(X,Y) P3(X,Y)
можно, решив систему уравнений
(x-P1.X)^2 + (y-P1.Y)^2 = (x-P2.X)^2 + (y-P2.Y)^2
(x-P1.X)^2 + (y-P1.Y)^2 = (x-P3.X)^2 + (y-P3.Y)^2
где найденные x и y - координаты центра.
Раскрывая скобки и перемещая свободные члены вправо, а x и y с коэффициентами влево
решаем систему методом Крамера.
Первые две точки треугольника - какие-то две ближайшие вершины 4-угольника
Третья точка треугольника находиться пересечением продолжений двух противолежащих сторон 4-угольника
Но надо ещё сделать много проверок на параллельность и т.п
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием
  #3  
Старый 20.01.2008, 12:19
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Сообщение Вот код консольного приложения

Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type TRecCoord = record
      X,Y:single;
     end;

var
  A,B,C,D,O,F:TRecCoord;
  T:Boolean;

procedure Centr(P1,P2,P3:TRecCoord; out CNTR:TRecCoord);
var A1,B1,C1,A2,B2,C2:Single;
begin
 A1:=2*(P1.X-P2.X); B1:=-2*(P1.Y-P2.Y);
 C1:=P1.X*P1.X - P2.X*P2.X + P1.Y*P1.Y - P2.Y*P2.Y;
 A2:=2*(P1.X-P3.X); B2:=-2*(P1.Y-P3.Y);
 C2:=P1.X*P1.X - P3.X*P3.X + P1.Y*P1.Y - P3.Y*P3.Y;
 CNTR.X:=(C1*B2-C2*B1)/(A1*B2-A2*B1);
 CNTR.Y:=(A1*C2-A2*C1)/(A1*B2-A2*B1);
end;

function L(P1,P2:TRecCoord):Single;
begin
 Result:=Sqrt(Sqr(P2.X-P1.X)+Sqr(P2.Y-P1.Y));
end;

function PR(P1,P2,P3,P4:TRecCoord; out TP:TRecCoord):Boolean;
var k1,k2:Single;
begin // P1P2 and P3P4
Result:=false;
 if (P2.X-P1.X = 0) and (P4.X-P3.X = 0) then Exit;
 if P2.X-P1.X = 0 then begin
   TP.X:=P1.X;
   TP.Y:=((P4.Y-P3.Y)/(P4.X-P3.X))*(TP.X-P3.X)+P3.Y;
   Result:=true; Exit;
  end;
 if P4.X-P3.X = 0 then begin
   TP.X:=P3.X;
   TP.Y:=((P2.Y-P1.Y)/(P2.X-P1.X))*(TP.X-P1.X)+P1.Y;
   Result:=true; Exit;
  end;
 k1:=(P2.Y-P1.Y)/(P2.X-P1.X);
 k2:=(P4.Y-P3.Y)/(P4.X-P3.X);
 if k1 <> k2 then begin
   TP.X:=(k1*P1.X-k2*P3.X+P3.Y-P1.Y)/(k1-k2);
   TP.Y:=k1*(TP.X-P1.X)+P1.Y;
   Result:=true;
  end;
end;

begin
 Writeln('Write coordinate A(X1,Y1) B(X2,Y2) C(X3,Y3) D(X4,Y4)');
 Writeln;
 Writeln('X1 Y1 X2 Y2 X3 Y3 X4 Y4');
 Writeln;
 Readln(A.X,A.Y,B.X,B.Y,C.X,C.Y,D.X,D.Y);
 Writeln;
 T:=L(A,B) + L(C,D) = L(A,D) + L(B,C);
 if T then
  Begin
   if PR(A,B,C,D,F) then
    begin
     if L(A,B) > L(C,D) then Centr(A,B,F,O)
     else Centr(C,D,F,O);
    end
   else
    begin
     if PR(A,D,B,C,F) then
      begin
       if L(A,D) > L(B,C) then Centr(A,D,F,O)
       else Centr(B,C,F,O);
      end
     else
      begin
       PR(A,C,B,D,O);
      end;
    end;
   Writeln('Yes'+#13#10+Format('oX = %8.2f',[O.X])+#13#10+Format('oY = %8.2f',[O.Y]));
  End
 else Writeln('No');
 Readln;
end.
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:55.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025