Найти периметр и площадь объекта Rectangle? (С #) - PullRequest
0 голосов
/ 02 декабря 2009

Я знаю, что формула для нахождения площади прямоугольника - это просто длина * ширина, а формула перемитера - 2 (длина) + 2 (ширина). У меня вопрос, какой самый эффективный способ найти площадь и периметр прямоугольного объекта, состоящего из других объектов?

Мой фрагмент кода:

class Rectangle
{

public Line left { get; set; }
public Line top { get; set; }
public Line right { get; set; }
public Line bottom { get; set; }

public Rectangle() : this(new Line(new Point(), new Point())) { }

public Rectangle(Line diaganol)
{
    Point beginningDiagonalPoint = diaganol.startPoint;
    Point endingDiagonalPoint = diaganol.endPoint;

    int begXC = beginningDiagonalPoint.xCoord;
    int begYC = beginningDiagonalPoint.yCoord;

    int endXC = endingDiagonalPoint.xCoord;
    int endYC = endingDiagonalPoint.yCoord;



    Point rightSideEnd = new Point(endXC, begYC);
    Point leftSideEnd = new Point(begXC, endYC);


    right = new Line(endingDiagonalPoint, rightSideEnd);
    left = new Line(beginningDiagonalPoint, leftSideEnd);
    top = new Line(leftSideEnd, endingDiagonalPoint);
    bottom = new Line(rightSideEnd, beginningDiagonalPoint);
}
}

Я хочу написать два метода, один для расчета площади, а другой для расчета периметра, как мне подходить к этому с объектами?

Я знаю, что мог бы взять xfinal координаты - xinitial координаты для ширины и yfinal - yinitial для длины, но есть ли другой и / или лучший способ сделать это с объектами?

Спасибо!

Ответы [ 5 ]

2 голосов
/ 02 декабря 2009

Площадь прямоугольника всегда будет:

area = width * height

Периметр всегда будет:

perimeter = width * 2 + height * 2

Неважно, как вы достигнете ширины или высоты, она всегда будет одинаковой.

1 голос
/ 02 декабря 2009

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

Однако вы на правильном пути - ваш класс Rectangle должен реализовывать методы Area и Perimeter, это «правильный путь» при выполнении ООП.

Вам не нужны линии для расчета площади или периметра, вам нужны только оригинальные диагональные точки. На самом деле вам вообще не нужны left / top / right / bottom, поэтому может быть лучше, чтобы они были инициализированы с отложенной инициализацией и доступны только для чтения.

Area = Math.Abs( (Point1.X - Point2.X) * (Point1.Y - Point2.Y) )

Perimeter = (Math.Abs(Point1.X - Point2.X) + Math.Abs(Point1.Y - Point2.Y)) * 2
0 голосов
/ 02 декабря 2009

Если вы посмотрите на свой класс, вы тратите больше времени на конструктор класса, чем когда-либо теряете, вычисляя площадь и периметр. Почему вы храните линии? Очки гораздо удобнее:

class Rectangle
{

public Point bottomLeft { get; set; }
public Point topRight { get; set; }
public int? area;
public int? perimeter;

public Rectangle() : this(new Line(new Point(), new Point())) { }

public Rectangle(Line diaganol)
{
    bottomLeft = diagonal.StartPoint;
    topRight = diagonal.EndPoint;
}

public int Area()
{
  if (area == null)
  {
     area = Math.Abs(diagonal.StartPoint.X - diagonal.EndPoint.X) *
            Math.Abs(diagonal.StartPoint.Y - diagonal.EndPoint.Y);
  } 
  return (int)area;
}
public int Perimeter()
{
  if (perimeter == null)
  {
     perimeter = Math.Abs(diagonal.StartPoint.X - diagonal.EndPoint.X) * 2 +
            Math.Abs(diagonal.StartPoint.Y - diagonal.EndPoint.Y) * 2;
  } 
  return (int)perimeter;
}
}
0 голосов
/ 02 декабря 2009

Ваш периметр (endXC - begXC) * 2 + (endYC - begYC) * 2

Ваш регион (endXC - begXC) * (endYC - begYC)

... при условии, что точки упорядочены в положительных направлениях x и y (в противном случае каждый калькулятор заключен в abs, например, abs (endXC - begXC)

если площадь и окружность могут быть вызваны, вы можете рассчитать и сохранить их при инициализации

0 голосов
/ 02 декабря 2009

Ваш периметр будет суммой длин четырех линий. Предположительно объекты Line имеют или смогут иметь метод длины.

Аналогично, площадь - это произведение длины правой или левой и верхней или нижней линий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...