Найти длины сторон треугольника, площадь треугольника, углы треугольника, описать и вписать окружность

soltriangle.jpg

Треугольник задан координатами своих вершин.
Найти длины сторон треугольника, площадь треугольника, углы треугольника, описать и вписать окружность.

Входные данные:
- Координаты вершин треугольника

Решение:
Для нахождения длин сторон треугольника воспользуемся формулой нахождения расстояния между двумя данными точками

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 - полупериметр треугольника.

Центр описанной окружности лежит на пересечении серединных перпендикуляров сторон треугольника.
Сначала построем серединные перпендикуляры - воспользуемся формулами поворота и повернем одну точку относительно другой на угол 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;

Центр вписанной окружности лежит на пересечении биссектрисс.
Биссекстриссы построем с помощью формул поворота.Поворачивать будем одну вершину треугольника относительно другой, на угол равный половине угла между данными сторонами треугольника.

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;

#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;
 
 
 
}

Ключевые слова: 
длина сторон треугольника, периметр треугольника, углы треугольника, окружности, биссектриса, координаты вершин, расстояние между точками
ВложениеРазмер
Расчеты по треугольнику41.25 кб