925. Периметр и площадь треугольника

 

Заданы шесть действительных чисел x1, y1, x2, y2, x3, y3 – координаты вершин треугольника. Найдите периметр и площадь треугольника.

 

 

Вход. Содержит шесть действительных чисел – координаты вершин треугольника: x1, y1, x2, y2, x3, y3, значения которых не превышают по модулю 100.

 

Выход. Выведите периметр и площадь треугольника с точностью до 4-х десятичных знаков.

 

Пример входа

Пример выхода

3 2 7 6.5 10 1

19.3568 17.7500

 

 

РЕШЕНИЕ

геометрия

 

Анализ алгоритма

Имея координаты вершин треугольника, вычислим длины его сторон. Далее вычисляем периметр как сумму длин сторон и площадь  по формуле Герона.

 

Площадь треугольника ABC, заданного кооридинатами вершин A(x1, y1), B(x2, y2), C(x3,y3), можно вычислить по формуле

S = abs

Вычтем первую строку из второй и третьей и вычислим детерминант по третьему столбцу:

S = abs = abs =

| (x2x1) * (y3y1) – (x3x1) * (y2y1) |

 

Реализация алгоритма

Читаем входные данные.

 

scanf("%lf %lf %lf %lf %lf %lf",&xx1,&yy1,&xx2,&yy2,&xx3,&yy3);

 

Вычисляем длины сторон треугольника a, b, c.

 

a = sqrt((xx2 - xx1)*(xx2 - xx1) + (yy2 - yy1)*(yy2 - yy1));

b = sqrt((xx3 - xx1)*(xx3 - xx1) + (yy3 - yy1)*(yy3 - yy1));

c = sqrt((xx3 - xx2)*(xx3 - xx2) + (yy3 - yy2)*(yy3 - yy2));

 

Вычисляем периметр p и полупериметр pp треугольника.

 

p = a + b + c; pp = p / 2;

 

Площадь треугольника считаем по формуле Герона.

 

s = sqrt(pp * (pp - a) * (pp - b) * (pp - c));

 

Выводим периметр и площадь треугольника с заданной точностью.

 

printf("%.4lf %.4lf\n",p,s);

 

Реализация алгоритма площадь через детерминант

 

#include <stdio.h>

#include <math.h>

 

double xx1, yy1, xx2, yy2, xx3, yy3;

double a, b, c, p, s;

 

double TriangleArea(double x1, double y1, double x2, double y2,

                    double x3, double y3)

{

  return fabs((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) / 2.0;

}

 

int main(void)

{

  scanf("%lf %lf %lf %lf %lf %lf", &xx1, &yy1, &xx2, &yy2, &xx3, &yy3);

  a = sqrt((xx2 - xx1) * (xx2 - xx1) + (yy2 - yy1) * (yy2 - yy1));

  b = sqrt((xx3 - xx1) * (xx3 - xx1) + (yy3 - yy1) * (yy3 - yy1));

  c = sqrt((xx3 - xx2) * (xx3 - xx2) + (yy3 - yy2) * (yy3 - yy2));

 

  p = a + b + c;

  s = TriangleArea(xx1, yy1, xx2, yy2, xx3, yy3);

 

  printf("%.4lf %.4lf\n", p, s);

  return 0;

}

 

Реализация алгоритма класс треугольник

 

#include <stdio.h>

#include <math.h>

 

class Triangle

{

private:

  double x[3], y[3];

  double a, b, c;

public:

  Triangle(void)

  {

    scanf("%lf %lf %lf %lf %lf %lf",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2]);

    a = sqrt((x[1] - x[0])*(x[1] - x[0]) + (y[1] - y[0])*(y[1] - y[0]));

    b = sqrt((x[2] - x[0])*(x[2] - x[0]) + (y[2] - y[0])*(y[2] - y[0]));

    c = sqrt((x[2] - x[1])*(x[2] - x[1]) + (y[2] - y[1])*(y[2] - y[1]));

  }

  double Perimeter(void)

  {

    return a + b + c;

  }

  double Area(void)

  {

    double p = Perimeter() / 2;

    return sqrt(p * (p - a) * (p - b) * (p - c));

  }

};

 

int main(void)

{

  Triangle tri;

  printf("%.4lf %.4lf\n",tri.Perimeter(),tri.Area());

  return 0;

}

 

Реализация алгоритма два класса

 

#include <stdio.h>

#include <math.h>

 

class Point {

public:

  Point(double x, double y);

  double GetX();

  double GetY();

  double GetDist(Point &a);

  void Read();

private:

  double x;

  double y;

};

 

Point::Point(double x = 0, double y = 0) {

  this->x = x;

  this->y = y;

}

 

double Point::GetX() {

  return x;

}

 

double Point::GetY() {

  return y;

}

 

double Point::GetDist(Point &a) {

  return sqrt((this->x - a.GetX()) * (this->x - a.GetX()) +

              (this->y - a.GetY())*(this->y - a.GetY()));

}

 

void Point::Read() {

  scanf("%lf %lf",&x,&y);

}

 

class Triangle {

public:

  Triangle(Point x, Point y, Point z);

  double GetPerimeter();

  double GetArea();

private:

  double a;

  double b;

  double c;

};

 

Triangle::Triangle(Point x, Point y, Point z) {

  a = x.GetDist(y);

  b = y.GetDist(z);

  c = z.GetDist(x);

}

 

double Triangle::GetPerimeter() {

  return a + b + c;

}

 

double Triangle::GetArea() {

  double p = GetPerimeter() / 2;

  return sqrt(p * (p - a) * (p - b) * (p - c));

}

 

int main(void)

{

  Point A, B, C;

  A.Read();

  B.Read();

  C.Read();

  Triangle tri(A,B,C);

  printf("%.4lf %.4lf\n",tri.GetPerimeter(),tri.GetArea());

  return 0;

}

 

Java реализация

 

import java.util.*;

 

public class Main

{

  public static void main(String []args)

  {

    Scanner con = new Scanner(System.in);

    double x1 = con.nextDouble(), y1 = con.nextDouble();

    double x2 = con.nextDouble(), y2 = con.nextDouble();

    double x3 = con.nextDouble(), y3 = con.nextDouble();

 

    double a = Math.sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));

    double b = Math.sqrt((x3 - x1)*(x3 - x1) + (y3 - y1)*(y3 - y1));

    double c = Math.sqrt((x3 - x2)*(x3 - x2) + (y3 - y2)*(y3 - y2));

   

    double p = a + b + c, pp = p / 2;

    double s = Math.sqrt(pp * (pp - a) * (pp - b) * (pp - c));

   

    System.out.printf("%.4f %.4f\n",p,s);

    con.close();

  }

}

 

Java реализация класс треугольник

 

import java.util.*;

 

class Triangle

{

  double x[], y[];

  double a, b, c;

  public Triangle()

  {

    x = new double[3];

    y = new double[3];

    Scanner con = new Scanner(System.in);

    x[0] = con.nextDouble(); y[0] = con.nextDouble();

    x[1] = con.nextDouble(); y[1] = con.nextDouble();

    x[2] = con.nextDouble(); y[2] = con.nextDouble();

    a = Math.sqrt((x[1] - x[0])*(x[1] - x[0]) + (y[1] - y[0])*(y[1] - y[0]));

    b = Math.sqrt((x[2] - x[0])*(x[2] - x[0]) + (y[2] - y[0])*(y[2] - y[0]));

    c = Math.sqrt((x[2] - x[1])*(x[2] - x[1]) + (y[2] - y[1])*(y[2] - y[1]));

    con.close();

  }

 

  public double Perimeter()

  {

    return a + b + c;

  }

 

  public double Area()

  {

    double p = Perimeter() / 2;

    return Math.sqrt(p * (p - a) * (p - b) * (p - c));

  }

}

 

public class Main

{

  public static void main(String []args)

  {

    Triangle tri = new Triangle();   

    System.out.printf("%.4f %.4f\n",tri.Perimeter(),tri.Area());

  }

}

 

Java реализация – класс треугольник

 

import java.util.*;

 

class Triangle

{

  double a, b, c;

  public Triangle(double x[], double y[])

  {

    a = Math.sqrt((x[1] - x[0])*(x[1] - x[0]) + (y[1] - y[0])*(y[1] - y[0]));

    b = Math.sqrt((x[2] - x[0])*(x[2] - x[0]) + (y[2] - y[0])*(y[2] - y[0]));

    c = Math.sqrt((x[2] - x[1])*(x[2] - x[1]) + (y[2] - y[1])*(y[2] - y[1]));

  }

 

  public double Perimeter()

  {

    return a + b + c;

  }

 

  public double Area()

  {

    double p = Perimeter() / 2;

    return Math.sqrt(p * (p - a) * (p - b) * (p - c));

  }

}

 

public class Main

{

  public static void main(String []args)

  {

    Scanner con = new Scanner(System.in);

    double x[] = new double[3];

    double y[] = new double[3];

    x[0] = con.nextDouble(); y[0] = con.nextDouble();

    x[1] = con.nextDouble(); y[1] = con.nextDouble();

    x[2] = con.nextDouble(); y[2] = con.nextDouble();

   

    Triangle tri = new Triangle(x,y);   

    System.out.printf("%.4f %.4f\n",tri.Perimeter(),tri.Area());

    con.close();

  }

}

 

Java реализация – классы точка, треугольник

 

import java.util.*;

 

class Point

{

  private double x, y;

 

  Point()

  {

    x = y = 0;

  }

 

  Point(double x, double y)

  {

    this.x = x;

    this.y = y;

  } 

 

  public double GetDistance(Point a)

  {

    return Math.sqrt((this.x - a.x)*(this.x - a.x) + (this.y - a.y)*(this.y - a.y));

  }

};

 

class Triangle

{

  double a, b, c;

 

  public Triangle(Point a, Point b, Point c)

  {

    this.a = a.GetDistance(b); // a = AB

    this.b = b.GetDistance(c); // b = BC

    this.c = c.GetDistance(a); // c = AC

  }

 

  public double Perimeter()

  {

    return a + b + c;

  }

 

  public double Area()

  {

    double p = Perimeter() / 2;

    return Math.sqrt(p * (p - a) * (p - b) * (p - c));

  }

}

 

public class Main

{

  public static void main(String []args)

  {

    Scanner con = new Scanner(System.in);

    Point a = new Point(con.nextDouble(), con.nextDouble());

    Point b = new Point(con.nextDouble(), con.nextDouble());

    Point c = new Point(con.nextDouble(), con.nextDouble());

   

    Triangle tri = new Triangle(a,b,c);   

    System.out.printf("%.4f %.4f\n",tri.Perimeter(),tri.Area());

    con.close();

  }

}

 

Python реализация

 

import math

x1,y1,x2,y2,x3,y3 = map(float,input().split())

 

a = math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));

b = math.sqrt((x3 - x1) * (x3 - x1) + (y3 - y1) * (y3 - y1));

c = math.sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3));

 

p = a + b + c

sp = p / 2

s = math.sqrt(sp * (sp - a) * (sp - b) * (sp - c));

 

print(p, s)