Треугольник задан координатами своих вершин. Входные данные: Решение: s = ((x2 - x1)^2+(y2-y1)^2)^(1/2) где (x1,y1) и (x2, y2) - это координаты начала и конца отрезка Для нахождения площади треугольника воспользуемся формулой Герона Sqr = (p*(p-s1)*(p-s2)*(p-s3))^(1/2) где p - полупериметр треугольника и находится по формуле (s1+s2+s3)/2; Для нахождения углов треугольника будем использовать формулу скалярного произведения векторов cos (ang) = a/(s1*s2) где a - скалярное произведение векторов s1 и s2,а s1 и s2 - стороны треугольника(абсолютные величины векторов). Для нахождения радиуса описанной окружности воспользуемся формулой R = (s1*s2*s3)/(4*S) где S - площадь треугольника, а s1,s2 и s3 - стороны треугольника. Для нахождения радиуса вписанной окружности воспользуемся формулой r = S/p где S - площадь треугольника, а p - полупериметр треугольника. Центр описанной окружности лежит на пересечении серединных перпендикуляров сторон треугольника. x1 = a[2].x; y1 = a[2].y; Центр вписанной окружности лежит на пересечении биссектрисс. x1 = a[2].x; y1 = a[2].y; #include<graphics.h> #include<iostream.h> #include<stdlib.h> #include<conio.h> #include<time.h> #include<dos.h> #include<math.h> struct Pt { double x; double y; }; //функция нахождения длины стороны треугольника. // входными параметрами служат координаты конца и начала стороны. double SideLength(double x1,double y1,double x2,double y2) { double a = sqrt((x2-x1)/10*(x2-x1)/10+(y2-y1)/10*(y2-y1)/10); return a*10; } //функция нахождения углов треугольника, находим cos угла по формуле скалярного произведения векторов //входные параметры - вершины треугольника - double Angles(Pt p1,Pt p2, Pt p3) { double a=(p2.x-p1.x)*(p3.x-p1.x)+(p2.y-p1.y)*(p3.y-p1.y); double exp=a/SideLength(p1.x,p1.y,p2.x,p2.y)/SideLength(p1.x,p1.y,p3.x,p3.y); return acos(exp); } //функция, рисующая обе окружности вписанную и описанную //входные параметры - радиус окружности; координаты точки,лежащей на прямой; координаты направляющего вектора прямой. void DescrCircle(double R, int x01, int y01, int x02, int y02, double l1, double m1, double l2, double m2) { double X, Y; //вычисление координат точки пересечения прямых, заданных координатами точки на прямой и координатами направляющих векторов if ((l1!=0)&&((m1/l1)-(m2/l2)!=0)&&(l2!=0)) { X = ((m1/l1)*x01-y01-(m2/l2)*x02+y02)/((m1/l1)-(m2/l2)); Y = (m1*X-m1*x01+l1*y01)/l1; circle(X,Y,2); //центр окружности circle (int(X), int(Y), int(R));//рисуем окружность } } //функция нахождения периметра треугоника. //входные параметры - стороны треугольника double Perimetr (double s1, double s2, double s3) { return (s1+s2+s3); } //функция нахождения площади треугольника (по формуле Герона) //входные параметры - стороны треугольника double Sqare (double s1, double s2, double s3) { double p; p = (Perimetr(s1, s2, s3))/2; return sqrt((p*(p-s1)*(p-s2)*(p-s3))); } //функция нахождения радиуса вписанной окружности //входные параметры - площадь и полупериметр треугольника double radius(double S, double p) { return S/p; } //функция нахождения радиуса описанной окружности //входные параметры - площадь и стороны треугоника double Radius(double S, double s1, double s2, double s3) { return (s1*s2*s3)/(4*S); } void main() { int gd,gm,flag,i; double s1,s2,s3,S,p,r,R,ang1,ang2,ang3, x1, x2, y1, y2, det; Pt t,m1,m2, v1, v2, v3, n1, n2, n3, b1, b2,B1,B2, a[3]; gd=DETECT; initgraph(&gd,&gm,"d:\\borlandc\\bgi"); start: cleardevice(); randomize(); for(i=0;i<3;i++) //произвольным образом задаем вершины треугольника { a[i].x=random(280)+200; a[i].y=random(280)+200; } //упорядочиваем вершины треугольника по возрастанию их y-координаты if(a[0].y>a[1].y) {t=a[0]; a[0]=a[1]; a[1]=t;} if(a[1].y>a[2].y) {t=a[1]; a[1]=a[2]; a[2]=t;} if(a[0].y>a[2].y) {t=a[0]; a[0]=a[2]; a[2]=t;} if(a[0].y>a[1].y) {t=a[0]; a[0]=a[1]; a[1]=t;} setcolor(YELLOW); circle(a[0].x,a[0].y,3); setcolor(WHITE); circle(a[2].x,a[2].y,3); //чертим треугольник for(i = 0; i < 3; i++) putpixel(a[i].x,a[i].y, WHITE); line(a[0].x, a[0].y, a[1].x,a[1].y); line(a[1].x, a[1].y, a[2].x,a[2].y); line(a[2].x, a[2].y, a[0].x,a[0].y); setcolor(YELLOW); circle(a[0].x,a[0].y,3); setcolor(WHITE); circle(a[2].x,a[2].y,3); //Находим длины сторон треугольника s1=SideLength(a[0].x,a[0].y, a[1].x,a[1].y); s2=SideLength(a[1].x,a[1].y, a[2].x,a[2].y); s3=SideLength(a[2].x,a[2].y, a[0].x,a[0].y); // Находим полупериметр треугольника и его площадь p = (Perimetr(s1, s2, s3))/2; S = Sqare (s1, s2, s3); //Находим радиус вписанной и описанной окружности r = radius(S, p); R =Radius(S, s1, s2, s3); //Находим углы треугольника ang1 = Angles(a[2],a[0],a[1]); ang2 = Angles(a[0],a[1],a[2]); ang3 = Angles(a[1],a[2],a[0]); //ищем середины сторон s1 и s2 m1.x = (a[0].x+a[1].x)/2; m1.y = (a[0].y+a[1].y)/2; m2.x = (a[1].x+a[2].x)/2; m2.y = (a[1].y+a[2].y)/2; //поворачиваем точку а[2] вокруг середины стороны s2 на угол 90 градусов x1 = a[2].x; y1 = a[2].y; x1 -= m2.x; y1 -= m2.y; b1.x = x1*cos(M_PI/2)-y1*sin(M_PI/2); b1.y = x1*sin(M_PI/2)+y1*cos(M_PI/2); b1.x += m2.x; b1.y += m2.y; v1.x = b1.x - m2.x; v1.y = b1.y - m2.y; //поворачиваем точку а[0] вокруг середины стороны s1 на угол 90 градусов x1 = a[0].x; y1 = a[0].y;//временные переменные x1 -= m1.x; y1 -= m1.y; b2.x = x1*cos(M_PI/2)-y1*sin(M_PI/2); b2.y = x1*sin(M_PI/2)+y1*cos(M_PI/2); b2.x += m1.x; b2.y += m1.y; v2.x = b2.x - m1.x; v2.y = b2.y - m1.y; //строим описанную окружность(с центром в точке пересечения серединных перепендикуляров) DescrCircle(R, m1.x, m1.y, m2.x, m2.y, v2.x, v2.y, v1.x, v1.y); int coef1=1,coef2=1;//коэффициенты,указывающие напрвление поворота //вычисляем знак третьей координаты векторного произведения векторов, между которыми строится биссектриса det=(a[1].x-a[0].x)*(a[2].y-a[0].y)-(a[2].x-a[0].x)*(a[1].y-a[0].y); if(det>0) coef1=-1; //если плюс, то поворачивать необходимо по часовой стрелке(т.к. полученная тройка векторов всегда правая) det=(a[1].x-a[2].x)*(a[0].y-a[2].y)-(a[0].x-a[2].x)*(a[1].y-a[2].y); if(det>0) coef2=-1; //поворачиваем a[2] вокруг a[0] на угол равный половине угла ang2 x1 = a[2].x; y1 = a[2].y; //временные переменные x1 -= a[0].x; y1 -= a[0].y; b1.x = x1*cos(coef1*ang2/2)-y1*sin(coef1*ang2/2); b1.y = x1*sin(coef1*ang2/2)+y1*cos(coef1*ang2/2); b1.x += a[0].x; b1.y += a[0].y; v1.x = b1.x - a[0].x; v1.y = b1.y - a[0].y; x2 = a[0].x; y2 = a[0].y; x2 -= a[2].x; y2 -= a[2].y; b2.x = x2*cos(coef2*ang1/2)-y2*sin(coef2*ang1/2); b2.y = x2*sin(coef2*ang1/2)+y2*cos(coef2*ang1/2); b2.x += a[2].x; b2.y += a[2].y; //b1 - a[2] после поворота v2.x = b2.x - a[2].x; v2.y = b2.y - a[2].y; //v1.x v1.y- координаты направляющего вектора биссектрисы setcolor(RED); //строим вписанную окружность(с центром в точке пересечения биссектрисс) DescrCircle(r, a[2].x, a[2].y, a[0].x, a[0].y, v2.x, v2.y, v1.x, v1.y); setcolor(GREEN); line(a[0].x, a[0].y,b1.x,b1.y); setcolor(RED); line(a[2].x,a[2].y,b2.x,b2.y); cout<<"s1 = "<<s1<<endl; cout<<"s2 = "<<s2<<endl; cout<<"s3 = "<<s3<<endl; cout<<"p = "<<p<<endl; cout<<"S = "<<S<<endl; cout<<"r = "<<r<<endl; cout<<"R = "<<R<<endl; cout<<"angl1 = "<<ang1<<endl; cout<<"angl2 = "<<ang2<<endl; cout<<"angl3 = "<<ang3<<endl; if(getch()!=27) goto start; }
Ключевые слова:
длина сторон треугольника, периметр треугольника, углы треугольника, окружности, биссектриса, координаты вершин, расстояние между точками
|
|||||||