Помощь - Поиск - Пользователи - Календарь
Полная версия: Треугольник
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Maxim Razor
задача по курсовой
По координатам трех точек построить треугольник (если это возможно, в про-тивном случае заново ввести координаты трех точек). Построить на чертеже треугольника все его медианы, биссектрисы, высоты, вписанную и описанную окружности. Рассчитать и вывести рядом с треугольником основные параметры (длины сторон, медиан, биссектрис, высот, радиусов вписанной и описанной окружностей). Построение и расчет характеристик делать одновременно: по-строить треугольник и вывести длины его сторон, начертить все медианы и вы-вести их длины и т.д.

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

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

program
  GrafChast;

uses
 Crt, Graph;

var
  AB, BC, CA:real;
  XA, YA, XB, YB, XC, YC: Integer;
  XMA, YMA, XMB, YMB, XMC, YMC: Integer;
  MA, MB, MC: Real;
  Driver, Mode: integer;
  CosA, CosB, CosC,CosA2, SinA2, TanA2: Real;
  SinA, SinB, SinC: Real;
  XKA, YKA, XKB, YKB, XKC, YKC: Integer;
  KA, KB, KC: Real;
  UA,UB,UC: Real;
  SumU: Real;
  Square, Perimetr, PolPerimetr: Real;
  HA, HB, HC: Real;
  XHA, YHA, XHB, YHB, XHC, YHC: Integer;
  HA1, HA2, HB1, HB2, HC1, HC2: Real;
  T: Real;
  RadiusO: Real;
  XRO, YRO: Integer;
label
  L1;

begin
  L1:clrscr;

{-------------------------------------------------------------}

  {Vvod koordinat}
{  writeln('***Vvedite koordinati to4ek***');

  writeln;
  writeln('To4ka A');
  gotoxy(1, 4);
  write('X= ');
  gotoxy(7, 4);
  write('Y=');
  gotoxy(3, 4);
  readln(XA);
  gotoxy(9, 4);
  readln(YA);

  writeln;
  writeln('To4KA B');
  gotoxy(1, 7);
  write('X=');
  gotoxy(7, 7);
  write('Y=');
  gotoxy(3, 7);
  readln(XB);
  gotoxy(9, 7);
  readln(YB);

  writeln;
  writeln('To4KA C');
  gotoxy(1, 10);
  write('X=');
  gotoxy(7, 10);
  write('Y=');
  gotoxy(3, 10);
  readln(XC);
  gotoxy(9, 10);
  readln(YC);

  if (XA > 640) or (XB > 640) or (XC > 640) or (YA > 480) or (YB > 480) or (YC > 480) then
  begin
    writeln('Nepravilno Zadani koordinati to4ek!!!');
    readkey;
    goto l1;
  end; }

  randomize;
  XA:=random(640);
  YA:=random(480);
  XB:=random(640);
  YB:=random(480);
  XC:=random(640);
  YC:=random(480);
{ XA:=320;
  YA:=60;
  XB:=90;
  YB:=380;
  XC:=549;
  YC:=130;

{-------------------------------------------------------------}

  {Storoni}
  AB := sqrt((XB - XA) * (XB - XA) + (YB - YA) * (YB - YA));
  BC := sqrt((XC - XB) * (XC - XB) + (YC - YB) * (YC - YB));
  CA := sqrt((XA - XC) * (XA - XC) + (XA - YC) * (YA - YC));

  if (AB + BC <= CA) or (BC + CA <= AB) or (CA + AB <= BC) then
  begin
    writeln('Postroenia treugolniKA nevozmogno!!!');
    readkey;
    goto l1;
  end;

  Perimetr := AB + BC + CA;
  PolPerimetr := Perimetr / 2;
  Square := sqrt(PolPerimetr * (PolPerimetr - AB)*(PolPerimetr - BC)*(PolPerimetr - CA));
{-------------------------------------------------------------}

  {Mediani}
  XMA := trunc((XB + XC) / 2);
  YMA := trunc((YB + YC) / 2);
  MA := sqrt((XA - XMA) * (XA - XMA) + (YA - YMA) * (YA - YMA));

  XMB := trunc((XC + XA) / 2);
  YMB := trunc((YC + YA) / 2);
  MB := sqrt((XB - XMB) * (XB - XMB) + (YB - YMB) * (YB - YMB));

  XMC := trunc((XA + XB) / 2);
  YMC := trunc((YA + YB) / 2);
  MC :=sqrt((XC - XMC) * (XC - XMC) + (YC - YMC) * (YC - YMC));

  {Cos and Sin}
  CosA := (BC * BC - AB * AB - CA * CA) / ((-2) * AB * CA);
  SinA := sqrt(1 - CosA * CosA);

  CosB := (CA * CA - AB  * AB - BC * BC) / ((-2) * AB * BC);
  SinB := sqrt(1 -CosB * CosB);

  CosC := (AB * AB - BC * BC - CA * CA) / ((-2) * BC * CA);
  SinC := sqrt(1 - CosC * CosC);

{-------------------------------------------------------------}

  {Bissektrisi}
  XKA := trunc((CA * XB + AB * XC) / (CA + AB));
  YKA := trunc((CA * YB + AB * YC) / (CA + AB));
  KA := sqrt((XA - XKA) * (XA - XKA) + (YA - YKA) * (YA - YKA));

  XKB := trunc((AB * XC + BC * XA) / (AB + BC));
  YKB := trunc((AB * YC + BC * YA) / (AB + BC));
  KB := sqrt((XB - XKB) * (XB - XKB) + (YB - YKB) * (YB - YKB));

  XKC := trunc((BC * XA + CA * XB) / (BC + CA));
  YKC := trunc((BC * YA + CA * YB) / (BC + CA));
  KC := sqrt((XC - XKC)*(XC - XKC)+(YC - YKC)*(YC - YKC));

{-------------------------------------------------------------}

  HA := 2 * Square / BC;
  HB := 2 * Square / CA;
  HC := 2 * Square / AB;

  T := arctan((YC - YB) / BC / sqrt(1 - ((YC - YB) / BC) * ((YC - YB) / BC)));
  if XB > XC then
  T := Pi - T;
  HA1 := sqrt(sqr(AB) - sqr(HA));
  HA2 := sqrt(sqr(CA) - sqr(HA));

  if (HA1 + HA2 > BC) and (HA1 < HA2) then
  HA1 := -HA1;

  XHA := round(HA1 * cos(T))+XB;
  YHA := round(HA1 * sin(T))+YB;

  T := arctan((YA - YC) / CA / sqrt(1 - ((YA - YC) / CA) * ((YA - YC) / CA)));
  if XC > XA then
  T := Pi - T;
  HB1 := sqrt(sqr(BC) - sqr(HB));
  HB2 := sqrt(sqr(AB) - sqr(HB));

  if (HB1 + HB2 > CA) and (HB1 < HB2) then
  HB1 := -HB1;

  XHB := round(HB1 * cos(T))+XC;
  YHB := round(HB1 * sin(T))+YC;

  T := arctan((YB - YA) / AB / sqrt(1 - ((YB - YA) / AB) * ((YB - YA) / AB)));
  if XA > XB then
  T := Pi - T;
  HC1 := sqrt(abs(sqr(CA) - sqr(HB)));
  HC2 := sqrt(abs(sqr(BC) - sqr(HB)));

  if (HC1 + HC2 > AB) and (HC1 < HC2) then
  HC1 := -HC1;

  XHC := round(HC1 * cos(T))+XA;
  YHC := round(HC1 * sin(T))+YA;

{-------------------------------------------------------------}

  {Ugli}
  if CosA < 0 then
  UA := 180 - arctan(SinA / sqrt(1 - SinA * SinA)) * 180 / pi
  else   UA := arctan(SinA / sqrt(1 - SinA * SinA)) * 180 / pi;

  if CosB < 0 then
  UB := 180 - arctan(SinB / sqrt(1 - SinB * SinB)) * 180 / pi
  else   UB := arctan(SinB / sqrt(1 - SinB * SinB)) * 180 / pi;

  if CosC < 0 then
  UC := 180 - arctan(SinC / sqrt(1 - SinC * SinC)) * 180 / pi
  else   UC := arctan(SinC / sqrt(1 - SinC * SinC)) * 180 / pi;
  SumU := UA + UB + UC;

{-------------------------------------------------------------}

  RadiusO :=Square / PolPerimetr;
  CosA2 := sqrt((1 + CosA) / 2);
  SinA2 := sqrt(1 - sqr(CosA2));
  TanA2 := SinA2 / CosA2;
  XRO := round(RadiusO / TanA2);
  YRO := round(RadiusO);

{-------------------------------------------------------------}

  {Vivod INFO}
  writeln;
  writeln('***AB=', AB:5:2, '*** ');
  writeln('***BC=', BC:5:2, '*** ');
  writeln('***CA=', CA:5:2, '*** ');

  writeln;
  writeln('***MA=', MA:5:2, '*** ');
  writeln('***MB=', MB:5:2, '*** ');
  writeln('***MC=', MC:5:2, '*** ');

  writeln;
  writeln('***KA=', KA:5:2, '*** ');
  writeln('***KB=', KB:5:2, '*** ');
  writeln('***KC=', KC:5:2, '*** ');

  writeln;
  writeln('***CosA=', CosA:5:2, '*** ');
  writeln('***CosB=', CosB:5:2, '*** ');
  writeln('***CosC=', CosC:5:2, '*** ');

  writeln;
  writeln('***^A=', UA:5:2, '*** ');
  writeln('***^B=', UB:5:2, '*** ');
  writeln('***^C=', UC:5:2, '*** ');
  writeln('***^A + ^B + ^C = ', SumU:5:2, '***');

  driver := 9;
  mode := 2;
  initgraph(driver, mode, 'EGAVGA.BGI');

  setbkcolor(black);

{-------------------------------------------------------------}
  circle(XRO, YRO, Round(RadiusO));

  {Storoni}
  setcolor(white);

  putpixel(XA, YA, white);
  outtextxy(XA + 4, YA + 4, 'A');

  putpixel(XB, YB, white);
  outtextxy(XB + 4, YB + 4, 'B');

  putpixel(XC, YC, white);
  outtextxy(XC + 4, YC + 4, 'C');

  setcolor(green);

  line(XA, YA, XB, YB);
  line(XB, YB, XC, YC);
  line(XC, YC, XA, YA);

{-------------------------------------------------------------}

  {Visoti}
  setcolor(white);

  putpixel(XHA, YHA, white);
  outtextxy(XhA + 4, YhA + 4, 'H1');

  putpixel(XHB, YHB, white);
  outtextxy(XHB + 4, YHB + 4, 'H2');

  putpixel(XHC, YHC, white);
  outtextxy(XHC + 4, YHC + 4, 'H3');

  setcolor(yellow);

  line(XA, YA, XHA, YHA);
  line(XB, YB, XHB, YHB);
  line(XC, YC, XHC, YHC);

{-------------------------------------------------------------}

  {Mediani}
  setcolor(white);

  putpixel(XMA, YMA, white);
  outtextxy(XMA + 4, YMA + 4, 'M1');

  putpixel(XMB, YMB, white);
  outtextxy(XMB + 4, YMB + 4, 'M2');

  putpixel(XMC, YMC, white);
  outtextxy(XMC + 4, YMC + 4, 'M3');

  setcolor(red);

  line(XA, YA, XMA, YMA);
  line(XB, YB, XMB, YMB);
  line(XC, YC, XMC, YMC);

{-------------------------------------------------------------}

  {Bissektrisi}
  setcolor(white);

  putpixel(XKA, YKA, white);
  outtextxy(XKA + 4, YKA + 4, 'K1');

  putpixel(XKB, YKB, white);
  outtextxy(XKB + 4, YKB + 4, 'K2');

  putpixel(XKC, YKC, white);
  outtextxy(XKC + 4, YKC + 4, 'K3');

  setcolor(blue);

  line(XA, YA, XKA, YKA);
  line(XB, YB, XKB, YKB);
  line(XC, YC, XKC, YKC);

{-------------------------------------------------------------}

  readkey;

  closegraph;

end.

Bard
Ну пожалуй я тебе смогу помочь только формулами yes2.gif . К сожалению я уже давно не занимаюсь графикой, но вот в формулах еще разбираюсь. значить так:
1) r (вписанной) = (2*s)/Perimetr { s - площадь треугольника}
2) R (описанной) = (AB*BC*AC)/(PolPerimetr*s) { s - площадь треугольника}

надеюсь что смог помочь good.gif
Maxim Razor
Спасибо! Насчёт радиуса помог, но как координаты этих центров найти?
Michael_Rybak
Для вписанной. Смотри, для угла ВАС. Центр вписанной - точка Х пересечения биссектрис. Опускаем из нее перпендикуляр на АС в точку Н.

В треугольнике АХН ты знаешь катет (радиус) и угол (половина ВАС). Можешь вычислить второй катет АН, а значит и точку Н, а из нее - точку Х.

Для описанной - аналогично, только в треугольнике ты сразу знаешь не угол и катет, а катет (половина стороны, т.к. центр описанной - точка пересечения серединных перпендикуляров) и гипотенузу (радиус описанной).
Maxim Razor
спасибо, поидее суть я понял, но вот мучает вопрос:
Как зная первую точку и дину отрезка найти вторую точку?
compiler
Цитата(Maxim Razor @ 6.01.2008 13:01) *
Как зная первую точку и дину отрезка найти вторую точку?

а ты не найдеш, у тебя будет круг(шар), где может находится точка...
Maxim Razor
Мне будет известен радиус, кроме него, для того чтобы построить окружость нужен и ценрт, допустим через советы Michael_Rybak я найду нужные стороны, но как найти точки?
Michael_Rybak
Цитата
Как зная первую точку и дину отрезка найти вторую точку?


Ты знаешь луч АС, на котором находится точка Н, и тебе нужно отмерить расстояние АН.

Для этого отложи единичный отрезок на АC, и умножь его на нужную длину:

DX = (C.X - A.X) / AC
DY = (C.Y - A.Y) / AY

H.X = A.X + DX * AH
H.Y = A.Y + DY * AH

Или, если так понятнее: тебе нужна точка Н, которая делит отрезок АС в отношении АНsad.gifАС-АН). Получается H = A + (C - A) * AH/AC для каждой из координат. (Формулы в итоге те же самые).

Чтобы теперь найти центр, поступаем чуть хитрее: единичный отрезок, который был получен для АС, поворачиваем на 90 градусов:

NEWDX = DY
NEWDY = -DX

Только теперь непонятно, в какую сторону откладывать радиус (умножать на +r или на -r). Можешь из двух точек выбрать ближайшую к B.


Добавлено через 1 мин.
compiler, отвечай в контексте пожалуйста. никакого шара не получится.
Maxim Razor
Бррр...Вроде и понятно, а вроде и не понятно :wall: . А можно это ввиде кода и с комментами, а то я уже несколько дней над этим корплю, от русских слов и букв отвык... blink.gif
Michael_Rybak
в виде кода - не вижу в этом необходимости. что непонятно - спрашивай.
Maxim Razor
Или, если так понятнее: тебе нужна точка Н, которая делит отрезок АС в отношении АНАС-АН).
Получается H = A + (C - A) * AH/AC для каждой из координат. (Формулы в итоге те же самые).

Как я понял это мы находим точку H.


O.X = H.X + NEWDX * OH
O.Y = H.Y - NEWDY * OH


А это координаты центра? Правильно расчитал?
Michael_Rybak
Правильно, но есть еще второй "центр":

O1.X = H.X - NEWDX * OH
O1.Y = H.Y [b]+ NEWDY * OH

Т.е. плюс либо сверху, либо снизу (комбинация +- или -+ соответствует одному из двух перпендикулярных отрезку АН лучей в точке Н).

Из точек О и О1 нужно выбрать ту, которая на самом деле является центром. Т.е. ту, которая ближе к третьей вершине (В).
Maxim Razor
Спасибо, буду пытаться, слушай, а можешь посмотреть мои высоты? А то как то криво они иногда рисуются

  HA := 2 * Square / BC;
  HB := 2 * Square / CA;
  HC := 2 * Square / AB;

  T := arctan((YC - YB) / BC / sqrt(1 - ((YC - YB) / BC) * ((YC - YB) / BC)));
  if XB > XC then
  T := Pi - T;
  HA1 := sqrt(sqr(AB) - sqr(HA));
  HA2 := sqrt(sqr(CA) - sqr(HA));

  if (HA1 + HA2 > BC) and (HA1 < HA2) then
  HA1 := -HA1;

  XHA := round(HA1 * cos(T))+XB;
  YHA := round(HA1 * sin(T))+YB;

  T := arctan((YA - YC) / CA / sqrt(1 - ((YA - YC) / CA) * ((YA - YC) / CA)));
  if XC > XA then
  T := Pi - T;
  HB1 := sqrt(sqr(BC) - sqr(HB));
  HB2 := sqrt(sqr(AB) - sqr(HB));

  if (HB1 + HB2 > CA) and (HB1 < HB2) then
  HB1 := -HB1;

  XHB := round(HB1 * cos(T))+XC;
  YHB := round(HB1 * sin(T))+YC;

  T := arctan((YB - YA) / AB / sqrt(1 - ((YB - YA) / AB) * ((YB - YA) / AB)));
  if XA > XB then
  T := Pi - T;
  HC1 := sqrt(abs(sqr(CA) - sqr(HB)));
  HC2 := sqrt(abs(sqr(BC) - sqr(HB)));

  if (HC1 + HC2 > AB) and (HC1 < HC2) then
  HC1 := -HC1;

  XHC := round(HC1 * cos(T))+XA;
  YHC := round(HC1 * sin(T))+YA;
Michael_Rybak
Нет, извини, искать чужие баги мне лень. Разберись сам, почему криво рисует.
Maxim Razor
Help, вписанную скошено рисует, а описанная тоже скошена, и кажется большим радиусом.
 
  RadiusV :=Square/PolPerimetr;
  OH := RadiusV;
  AH:=oh/(sin(0.5*UA)/cos(0.5*UA));
  DX := (XC - XA)/CA;
  DY := (YC - YA)/CA;
  HX := XA + DX*AH;
  HY := YA + DY*AH;
  NEWDX := DY;
  NEWDY := DX;
  XRO := trunc(HX - NEWDX*OH);
  YRO := trunc(HY + NEWDY*OH);
  circle(XRO, YRO, trunc(OH));

  RadiusO :=(AB* BC* CA)/(Square*4);
  AO := RadiusO;
  OH:=sqrt(ao*ao - ah*ah) ;
  DX := (XC - XA)/CA;
  DY := (YC - YA)/CA;
  HX := XA + DX*AH;
  HY := YA + DY*AH;
  NEWDX := DY;
  NEWDY := DX;
  XRO := trunc(HX - NEWDX*OH);
  YRO := trunc(HY + NEWDY*OH);
  writeln(xro,' ', yro, ' ', round(ao));
  circle(XRO, YRO, ROUND(AO));

Maxim Razor
Пожалусто, помогите, только это осталось mega_chok.gif
рисует вот так
Изображение
RadiusV :=Square/PolPerimetr;
  OH := RadiusV;
  AH:=oh/(sin(0.5*UA)/cos(0.5*UA));
  DX := (XC - XA)/CA;
  DY := (YC - YA)/CA;
  HX := XA + DX*AH;
  HY := YA + DY*AH;
  NEWDX := DY;
  NEWDY := DX;
  XRO := trunc(HX - NEWDX*OH);
  YRO := trunc(HY + NEWDY*OH);
  circle(XRO, YRO, trunc(OH));

  RadiusO :=(AB* BC* CA)/(Square*4);
  AO := RadiusO;
  
  ah := 0.5 * ca;
 
  OH:=sqrt(ao*ao - ah*ah) ;
  DX := (XC - XA)/CA;
  DY := (YC - YA)/CA;
  HX := XA + DX*AH;
  HY := YA + DY*AH;
  NEWDX := DY;
  NEWDY := DX;
  XRO := trunc(HX - NEWDX*OH);
  YRO := trunc(HY + NEWDY*OH);
  writeln(xro,' ', yro, ' ', round(ao));
  circle(XRO, YRO, ROUND(AO));
Michael_Rybak
Пожалуйста, запости полный код в последней версии.
Maxim Razor
program
  GrafChast;

uses
 Crt, Graph;

var
  AB, BC, CA:real;
  XA, YA, XB, YB, XC, YC: Integer;
  XMA, YMA, XMB, YMB, XMC, YMC: Integer;
  MA, MB, MC: Real;
  Driver, Mode: integer;
  CosA, CosB, CosC,CosA2, SinA2, TanA2: Real;
  SinA, SinB, SinC: Real;
  XKA, YKA, XKB, YKB, XKC, YKC: Integer;
  KA, KB, KC: Real;
  UA,UB,UC: Real;
  SumU: Real;
  Square, Perimetr, PolPerimetr: Real;
  HA, HB, HC: Real;
  XHA, YHA, XHB, YHB, XHC, YHC: Integer;
  HA1, HA2, HB1, HB2, HC1, HC2: Real;
  T: Real;
  RadiusV,RadiusO: Real;
  XRO, YRO: Integer;
  OH,DX,DY,HX,AH, HY,AY,NEWDX,NEWDY,AO:real;
label
  L1;

begin
  L1:clrscr;

{-------------------------------------------------------------}

  {Vvod koordinat}
{  writeln('***Vvedite koordinati to4ek***');

  writeln;
  writeln('To4ka A');
  gotoxy(1, 4);
  write('X= ');
  gotoxy(7, 4);
  write('Y=');
  gotoxy(3, 4);
  readln(XA);
  gotoxy(9, 4);
  readln(YA);

  writeln;
  writeln('To4KA B');
  gotoxy(1, 7);
  write('X=');
  gotoxy(7, 7);
  write('Y=');
  gotoxy(3, 7);
  readln(XB);
  gotoxy(9, 7);
  readln(YB);

  writeln;
  writeln('To4KA C');
  gotoxy(1, 10);
  write('X=');
  gotoxy(7, 10);
  write('Y=');
  gotoxy(3, 10);
  readln(XC);
  gotoxy(9, 10);
  readln(YC);

  if (XA > 640) or (XB > 640) or (XC > 640) or (YA > 480) or (YB > 480) or (YC > 480) then
  begin
    writeln('Nepravilno Zadani koordinati to4ek!!!');
    readkey;
    goto l1;
  end; }

{  randomize;
  XA:=random(640);
  YA:=random(480);
  XB:=random(640);
  YB:=random(480);
  XC:=random(640);
  YC:=random(480);}
 XA:=320;
  YA:=120;
  XB:=90;
  YB:=440;
  XC:=549;
  YC:=180;

{-------------------------------------------------------------}

  {Storoni}
  AB := sqrt((XB - XA) * (XB - XA) + (YB - YA) * (YB - YA));
  BC := sqrt((XC - XB) * (XC - XB) + (YC - YB) * (YC - YB));
  CA := sqrt((XA - XC) * (XA - XC) + (XA - YC) * (YA - YC));

  if (AB + BC <= CA) or (BC + CA <= AB) or (CA + AB <= BC) then
  begin
    writeln('Postroenia treugolniKA nevozmogno!!!');
    readkey;
    goto l1;
  end;

  Perimetr := AB + BC + CA;
  PolPerimetr := Perimetr / 2;
  Square := sqrt(PolPerimetr * (PolPerimetr - AB)*(PolPerimetr - BC)*(PolPerimetr - CA));
{-------------------------------------------------------------}

  {Mediani}
  XMA := trunc((XB + XC) / 2);
  YMA := trunc((YB + YC) / 2);
  MA := sqrt((XA - XMA) * (XA - XMA) + (YA - YMA) * (YA - YMA));

  XMB := trunc((XC + XA) / 2);
  YMB := trunc((YC + YA) / 2);
  MB := sqrt((XB - XMB) * (XB - XMB) + (YB - YMB) * (YB - YMB));

  XMC := trunc((XA + XB) / 2);
  YMC := trunc((YA + YB) / 2);
  MC :=sqrt((XC - XMC) * (XC - XMC) + (YC - YMC) * (YC - YMC));

  {Cos and Sin}
  CosA := (BC * BC - AB * AB - CA * CA) / ((-2) * AB * CA);
  SinA := sqrt(1 - CosA * CosA);

  CosB := (CA * CA - AB  * AB - BC * BC) / ((-2) * AB * BC);
  SinB := sqrt(1 -CosB * CosB);

  CosC := (AB * AB - BC * BC - CA * CA) / ((-2) * BC * CA);
  SinC := sqrt(1 - CosC * CosC);

{-------------------------------------------------------------}

  {Bissektrisi}
  XKA := trunc((CA * XB + AB * XC) / (CA + AB));
  YKA := trunc((CA * YB + AB * YC) / (CA + AB));
  KA := sqrt((XA - XKA) * (XA - XKA) + (YA - YKA) * (YA - YKA));

  XKB := trunc((AB * XC + BC * XA) / (AB + BC));
  YKB := trunc((AB * YC + BC * YA) / (AB + BC));
  KB := sqrt((XB - XKB) * (XB - XKB) + (YB - YKB) * (YB - YKB));

  XKC := trunc((BC * XA + CA * XB) / (BC + CA));
  YKC := trunc((BC * YA + CA * YB) / (BC + CA));
  KC := sqrt((XC - XKC)*(XC - XKC)+(YC - YKC)*(YC - YKC));

{-------------------------------------------------------------}

  HA := 2 * Square / BC;
  HB := 2 * Square / CA;
  HC := 2 * Square / AB;

  T := arctan((YC - YB) / BC / sqrt(1 - ((YC - YB) / BC) * ((YC - YB) / BC)));
  if XB > XC then
  T := Pi - T;
  HA1 := sqrt(sqr(AB) - sqr(HA));
  HA2 := sqrt(sqr(CA) - sqr(HA));

  if (HA1 + HA2 > BC) and (HA1 < HA2) then
  HA1 := -HA1;

  XHA := round(HA1 * cos(T))+XB;
  YHA := round(HA1 * sin(T))+YB;

  T := arctan((YA - YC) / CA / sqrt(1 - ((YA - YC) / CA) * ((YA - YC) / CA)));
  if XC > XA then
  T := Pi - T;
  HB1 := sqrt(sqr(BC) - sqr(HB));
  HB2 := sqrt(sqr(AB) - sqr(HB));

  if (HB1 + HB2 > CA) and (HB1 < HB2) then
  HB1 := -HB1;

  XHB := round(HB1 * cos(T))+XC;
  YHB := round(HB1 * sin(T))+YC;

  T := arctan((YB - YA) / AB / sqrt(1 - ((YB - YA) / AB) * ((YB - YA) / AB)));
  if XA > XB then
  T := Pi - T;
  HC1 := sqrt(abs(sqr(CA) - sqr(HC)));
  HC2 := sqrt(abs(sqr(BC) - sqr(HC)));

  if (HC1 + HC2 > AB) and (HC1 < HC2) then
  HC1 := -HC1;

  XHC := round(HC1 * cos(T))+XA;
  YHC := round(HC1 * sin(T))+YA;

{-------------------------------------------------------------}

  {Ugli}
  if CosA < 0 then
  UA := 180 - arctan(SinA / sqrt(1 - SinA * SinA)) * 180 / pi
  else   UA := arctan(SinA / sqrt(1 - SinA * SinA)) * 180 / pi;

  if CosB < 0 then
  UB := 180 - arctan(SinB / sqrt(1 - SinB * SinB)) * 180 / pi
  else   UB := arctan(SinB / sqrt(1 - SinB * SinB)) * 180 / pi;

  if CosC < 0 then
  UC := 180 - arctan(SinC / sqrt(1 - SinC * SinC)) * 180 / pi
  else   UC := arctan(SinC / sqrt(1 - SinC * SinC)) * 180 / pi;
  SumU := UA + UB + UC;

{-------------------------------------------------------------}


{-------------------------------------------------------------}

  {Vivod INFO}
  writeln;
  writeln('***AB=', AB:5:2, '*** ');
  writeln('***BC=', BC:5:2, '*** ');
  writeln('***CA=', CA:5:2, '*** ');

  writeln;
  writeln('***MA=', MA:5:2, '*** ');
  writeln('***MB=', MB:5:2, '*** ');
  writeln('***MC=', MC:5:2, '*** ');

  writeln;
  writeln('***KA=', KA:5:2, '*** ');
  writeln('***KB=', KB:5:2, '*** ');
  writeln('***KC=', KC:5:2, '*** ');

  writeln;
  writeln('***CosA=', CosA:5:2, '*** ');
  writeln('***CosB=', CosB:5:2, '*** ');
  writeln('***CosC=', CosC:5:2, '*** ');

  writeln;
  writeln('***^A=', UA:5:2, '*** ');
  writeln('***^B=', UB:5:2, '*** ');
  writeln('***^C=', UC:5:2, '*** ');
  writeln('***^A + ^B + ^C = ', SumU:5:2, '***');

  driver := 9;
  mode := 2;
  initgraph(driver, mode, 'EGAVGA.BGI');

  setbkcolor(black);

{-------------------------------------------------------------}
  RadiusV :=Square/PolPerimetr;
  OH := RadiusV;
  AH:=oh/(sin(0.5*UA)/cos(0.5*UA));
  DX := (XC - XA)/CA;
  DY := (YC - YA)/CA;
  HX := XA + DX*AH;
  HY := YA + DY*AH;
  NEWDX := DY;
  NEWDY := DX;
  XRO := trunc(HX - NEWDX*OH);
  YRO := trunc(HY + NEWDY*OH);
  circle(XRO, YRO, trunc(OH));

  RadiusO :=(AB* BC* CA)/(Square*4);
  AO := RadiusO;
  AH := 0.5 * ca;
  OH:=sqrt(ao*ao - ah*ah) ;
  DX := (XC - XA)/CA;
  DY := (YC - YA)/CA;
  HX := XA + DX*AH;
  HY := YA + DY*AH;
  NEWDX := DY;
  NEWDY := DX;
  XRO := trunc(HX - NEWDX*OH);
  YRO := trunc(HY + NEWDY*OH);
  writeln(xro,' ', yro, ' ', round(ao));
  circle(XRO, YRO, ROUND(AO));
  {Storoni}
  setcolor(white);

  putpixel(XA, YA, white);
  outtextxy(XA + 4, YA + 4, 'A');

  putpixel(XB, YB, white);
  outtextxy(XB + 4, YB + 4, 'B');

  putpixel(XC, YC, white);
  outtextxy(XC + 4, YC + 4, 'C');

  setcolor(green);

  line(XA, YA, XB, YB);
  line(XB, YB, XC, YC);
  line(XC, YC, XA, YA);

{-------------------------------------------------------------}

  {Visoti}
  setcolor(white);

  putpixel(XHA, YHA, white);
  outtextxy(XhA + 4, YhA + 4, 'H1');

  putpixel(XHB, YHB, white);
  outtextxy(XHB + 4, YHB + 4, 'H2');

  putpixel(XHC, YHC, white);
  outtextxy(XHC + 4, YHC + 4, 'H3');

  setcolor(yellow);

  line(XA, YA, XHA, YHA);
  line(XB, YB, XHB, YHB);
  line(XC, YC, XHC, YHC);

{-------------------------------------------------------------}

  {Mediani}
  setcolor(white);

  putpixel(XMA, YMA, white);
  outtextxy(XMA + 4, YMA + 4, 'M1');

  putpixel(XMB, YMB, white);
  outtextxy(XMB + 4, YMB + 4, 'M2');

  putpixel(XMC, YMC, white);
  outtextxy(XMC + 4, YMC + 4, 'M3');

  setcolor(red);

  line(XA, YA, XMA, YMA);
  line(XB, YB, XMB, YMB);
  line(XC, YC, XMC, YMC);

{-------------------------------------------------------------}

  {Bissektrisi}
  setcolor(white);

  putpixel(XKA, YKA, white);
  outtextxy(XKA + 4, YKA + 4, 'K1');

  putpixel(XKB, YKB, white);
  outtextxy(XKB + 4, YKB + 4, 'K2');

  putpixel(XKC, YKC, white);
  outtextxy(XKC + 4, YKC + 4, 'K3');

  setcolor(blue);

  line(XA, YA, XKA, YKA);
  line(XB, YB, XKB, YKB);
  line(XC, YC, XKC, YKC);

{-------------------------------------------------------------}

  readkey;

  closegraph;

end.
 
Michael_Rybak
Ты меня таки заставил искать баги smile.gif

Ок. Только все-таки учись это делать сам.

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

Ошибка два:

Цитата
AB := sqrt((XB - XA) * (XB - XA) + (YB - YA) * (YB - YA));
BC := sqrt((XC - XB) * (XC - XB) + (YC - YB) * (YC - YB));
CA := sqrt((XA - XC) * (XA - XC) + (XA - YC) * (YA - YC));

И на всякий случай: сейчас будет работать нормально, но в общем случае вот это место неверно:

  XRO := trunc(HX - NEWDX*OH);
  YRO := trunc(HY + NEWDY*OH);

Как я уже писал, может оказаться, что там плюс и минус поменяются местами. По-хорошему нужно делать с проверкой.
Maxim Razor
Знаешь что я хочу сказать...

ОГРОМНОЕ ЧЕЛОВЕЧЕСКОЕ ПРОГРАММЕРСКОЕ СПАСИБО!!!

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

ЕЩЕ РАЗ СПАСИБО!

Michael_Rybak
Всегда пожалуйста smile.gif Удачи! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.