Помощь - Поиск - Пользователи - Календарь
Полная версия: Треугольник
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.