IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Треугольник, И всё что с ним связано.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


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

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Учиться, учиться еще раз учиться
***

Группа: Пользователи
Сообщений: 158
Пол: Мужской
Реальное имя: Яшар

Репутация: -  3  +


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

надеюсь что смог помочь good.gif


--------------------
Чтобы поразить цель важна не точность, а смелость
Шарль Луи Монтескё
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Спасибо! Насчёт радиуса помог, но как координаты этих центров найти?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Для вписанной. Смотри, для угла ВАС. Центр вписанной - точка Х пересечения биссектрис. Опускаем из нее перпендикуляр на АС в точку Н.

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

Для описанной - аналогично, только в треугольнике ты сразу знаешь не угол и катет, а катет (половина стороны, т.к. центр описанной - точка пересечения серединных перпендикуляров) и гипотенузу (радиус описанной).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


спасибо, поидее суть я понял, но вот мучает вопрос:
Как зная первую точку и дину отрезка найти вторую точку?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(Maxim Razor @ 6.01.2008 13:01) *
Как зная первую точку и дину отрезка найти вторую точку?

а ты не найдеш, у тебя будет круг(шар), где может находится точка...

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Мне будет известен радиус, кроме него, для того чтобы построить окружость нужен и ценрт, допустим через советы Michael_Rybak я найду нужные стороны, но как найти точки?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата
Как зная первую точку и дину отрезка найти вторую точку?


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

Для этого отложи единичный отрезок на А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, отвечай в контексте пожалуйста. никакого шара не получится.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Бррр...Вроде и понятно, а вроде и не понятно :wall: . А можно это ввиде кода и с комментами, а то я уже несколько дней над этим корплю, от русских слов и букв отвык... blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


в виде кода - не вижу в этом необходимости. что непонятно - спрашивай.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


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

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


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


А это координаты центра? Правильно расчитал?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Правильно, но есть еще второй "центр":

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

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

Из точек О и О1 нужно выбрать ту, которая на самом деле является центром. Т.е. ту, которая ближе к третьей вершине (В).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Спасибо, буду пытаться, слушай, а можешь посмотреть мои высоты? А то как то криво они иногда рисуются

  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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Нет, извини, искать чужие баги мне лень. Разберись сам, почему криво рисует.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


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));

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Пожалусто, помогите, только это осталось 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));


Сообщение отредактировано: Maxim Razor -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Пожалуйста, запости полный код в последней версии.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Ты меня таки заставил искать баги 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);

Как я уже писал, может оказаться, что там плюс и минус поменяются местами. По-хорошему нужно делать с проверкой.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 13
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Знаешь что я хочу сказать...

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

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

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 22:41
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name