Как построить окружность по трем точкам?
Чтоб построить окружность необходимо найти ее центр и радиус. Воспользуйтесь готовым классом TTriangle для расчета центра и радиуса описанной около треугольника окружности, исходный код которого представлен на странице "Как рассчитать все параметры треугольника?"
procedure TForm1.Button1Click(Sender: TObject); Var T: TTriangle; begin T := TTriangle.Create( 0, 0, 1, 0, 1, 1); PaintBox1.Canvas.Ellipse(T.CenterOut.X - T.RadiusOut, T.CenterOut.Y - T.RadiusOut, T.CenterOut.X + T.RadiusOut, T.CenterOut.Y + T.RadiusOut); end;
Как найти периметр треугольника?
Воспользуйтесь готовым классом для расчета треугольника TTriangle, исходный код которого представлен на странице "Как рассчитать все параметры треугольника?"
Как найти площадь треугольника?
Воспользуйтесь готовым классом для расчета треугольника TTriangle, исходный код которого представлен на странице "Как рассчитать все параметры треугольника?"
Как рассчитать все параметры треугольника?
Для расчета основных параметров треугольника (таких как: периметр, площадь, длины сторон, углы, координаты, радиусы вписанной и описанной окружностей, а также координаты их центров) можно воспользоваться следующим классом TTriangle. Все формулы, используемые в коде, а также пример работы класса в практической реализации см. на странице "Расчет треугольника"
TTriangle = class private fx1, fy1 : Double; fx2, fy2 : Double; fx3, fy3 : Double; function GetDistAB: Double; function GetDistAC: Double; function GetDistBC: Double; function GetPerimeter: Double; function GetArea: Double; function GetAngleA: Double; function GetAngleB: Double; function GetAngleC: Double; function GetRadiusIn: Double; function GetRadiusOut: Double; function GetCenterOut: TFPoint; function GetCenterIn: TFPoint; function PointsInLine: Boolean; public // Задание треугольника координатами его вершин constructor Create( ax1,ay1, ax2,ay2, ax3,ay3: Double); overload; // Задание треугольника длинами его сторон constructor Create( a, b, c: Double); overload; //функция нахождения длины отрезка function Dist( ax1, ay1, ax2, ay2: Double): Double; published // координаты первой вершины A property X1: Double read fx1 write fx1; property Y1: Double read fy1 write fy1; // координаты второй вершины B property X2: Double read fx2 write fx2; property Y2: Double read fy2 write fy2; // координаты третьей вершины С property X3: Double read fx3 write fx3; property Y3: Double read fy3 write fy3; property DistAB: Double read GetDistAB; // Длина AB property DistBC: Double read GetDistBC; // Длина BC property DistAC: Double read GetDistAC; // Длина AC property Perimeter: Double read GetPerimeter; // Периметр property Area: Double read GetArea; // Площадь property AngleA: Double read GetAngleA; // Угол A property AngleB: Double read GetAngleB; // Угол B property AngleC: Double read GetAngleC; // Угол C // Радиус вписанной окружности property RadiusIn: Double read GetRadiusIn; // Радиус описанной окружности property RadiusOut: Double read GetRadiusOut; // Центр описанной окружности property CenterOut: TFPoint read GetCenterOut; // Центр вписанной окружности property CenterIn: TFPoint read GetCenterIn; end; { TTriangle } constructor TTriangle.Create(ax1, ay1, ax2, ay2, ax3, ay3: Double); begin fx1 := ax1; fy1 := ay1; fx2 := ax2; fy2 := ay2; fx3 := ax3; fy3 := ay3; end; constructor TTriangle.Create(a, b, c: Double); Var cosa: Double; begin fx1 := 0; fy1 := 0; fx2 := 0; fy2 := c; cosa := (b*b+c*c - a*a)/(2*b*c); fy3 := b * cosa; fx3 := b * sin(arccos(cosA)); end; function TTriangle.Dist(ax1, ay1, ax2, ay2: Double): Double; begin Result := sqrt((ax2-ax1)*(ax2-ax1)+(ay2-ay1)*(ay2-ay1)); end; function TTriangle.GetAngleA: Double; Var a, r: Double; begin a := (fx2-fx1)*(fx3-fx1)+(fy2-fy1)*(fy3-fy1); r := a/DistAB/DistAC; Result := arccos(r); end; function TTriangle.GetAngleB: Double; Var a, r: Double; begin a := (fx1-x2)*(fx3-fx2)+(fy1-fy2)*(fy3-fy2); r := a/DistAB/DistBC; Result := arccos(r); end; function TTriangle.GetAngleC: Double; Var a, r: Double; begin a := (fx2-x3)*(fx1-fx3)+(fy2-fy3)*(fy1-fy3); r := a/DistBC/DistAC; Result := arccos(r); end; function TTriangle.GetArea: Double; begin Result := sqrt((Perimeter/2*(Perimeter/2-DistAB)* (Perimeter/2-DistBC)*(Perimeter/2-DistAC))); end; function TTriangle.GetCenterIn: TFPoint; Var Lc, Lb, La : Double; cx, cy, bx, by, ax, ay : Double; K1, K2 : Double; begin Lb := DistBC/DistAB; Lc := DistBC/DistAC; cx := (fx2+Lc*fx1)/(Lc+1); cy := (fy2+Lc*fy1)/(Lc+1); bx := (fx3+Lb*fx1)/(Lb+1); by := (fy3+Lb*fy1)/(Lb+1); if cx <> fx3 then K1 := (cy-fy3)/(cx-fx3) else K1 := 1e+96; if bx <> fx2 then K2 := (by-fy2)/(bx-fx2) else K2 := 1e+96; Result.x := (K1*fx3-K2*fx2+(fy2-fy3))/(K1-K2); if Result.x <> fx3 then Result.y := K1*(Result.x-fx3)+fy3 else Result.y := K2*(Result.x-fx2)+fy2; end; function TTriangle.GetCenterOut: TFPoint; Var ma, mb : Double; // коэффициенты наклона линий begin if fx2 <> fx1 then ma := (fy2-fy1)/(fx2-fx1) else ma := 1e95; if fx3 <> fx2 then mb := (fy3-fy2)/(fx3-fx2) else mb := 1e95; Result.x := (ma*mb*(fy1-fy3) + mb*(fx1+fx2) - ma*(fx2+fx3))/(2*(mb-ma)); if ma <> 0 then Result.y := -1/ma*(Result.x - (fx1+fx2)/2) + (fy1+fy2)/2 else Result.y := -1/mb*(Result.x - (fx2+fx3)/2) + (fy2+fy3)/2; end; function TTriangle.GetDistAB: Double; begin Result := Dist ( fx1, fy1, fx2, fy2); end; function TTriangle.GetDistAC: Double; begin Result := Dist ( fx1, fy1, fx3, fy3); end; function TTriangle.GetDistBC: Double; begin Result := Dist ( fx2, fy2, fx3, fy3); end; function TTriangle.GetPerimeter: Double; begin Result := DistAB + DistBC + DistAC; end; function TTriangle.GetRadiusIn: Double; begin if not PointsInLine then Result := 2 * Area / Perimeter; end; function TTriangle.GetRadiusOut: Double; begin if not PointsInLine then Result := (DistAB*DistBC*DistAC)/(4*Area); end; function TTriangle.PointsInLine: Boolean; Var a : double; begin Result := false; a := fx1*fy2+fx2*fy3+fx3*fy1-fx3*fy2-fx2*fy1-fx1*fy3; if abs(a - 1e-20) < 1e-19 then Result := true; end;
Пример использования класса для задачи "Как найти площадь треугольника, заданного длинами сторон a=10, b=12, c=11?"
procedure TForm1.Button1Click(Sender: TObject); Var T: TTriangle; begin T := TTriangle.Create( 10, 12, 11); showmessage( FloatToStr( T.Area)); end;
Пример использования класса для задачи "Как найти периметр треугольника, заданного координатами вершин A(0,0), B(1,0), C(1,1)?"
procedure TForm1.Button1Click(Sender: TObject); Var T: TTriangle; begin T := TTriangle.Create( 0, 0, 1, 0, 1, 1); showmessage(FloatToStr( T.Perimeter)); end;
Как возвести число в степень?
Можно воспользоваться известным математическим выражением:
X в степени Y = exp(ln(X) * Y) c условием, что X не может быть нулем.