查找Rectangle对象的周长和面积? (C#)

时间:2009-12-02 07:55:41

标签: c# oop

我知道找到矩形区域的公式只是长度*宽度,并且peremiter公式是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 coord - xinitial coord用于宽度,yfinal - yinitial用于长度,但是有另一种和/或更好的方法用对象做这个吗?

谢谢!

5 个答案:

答案 0 :(得分:2)

矩形区域始终为:

area = width * height

外围永远是:

perimeter = width * 2 + height * 2

无论你如何到达宽度或高度,它总是一样的。

答案 1 :(得分:1)

您的类构造函数定义了一个矩形,但由于Lines不受保护,外部代码可以将它们更改为平行四边形,其他四边形或仅仅是脱节线。

你走在正确的轨道上 - 你的Rectangle类应该实现Area和Perimeter方法,这是做OOP时的“正确方法”。

您不需要线条来计算面积或周长,您只需要原始的对角线点数。事实上,你根本不需要左/上/右/下,所以最好使它们成为惰性初始化的只读属性。

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

答案 2 :(得分:0)

你的周长是四条线长度的总和。据推测,Line对象已经或将能够使用长度方法。

同样,该区域是右侧或左侧以及顶部或底部线的长度的乘积。

答案 3 :(得分:0)

你的周长是(endXC - begXC)* 2 +(endYC - begYC)* 2

您的区域是(endXC - begXC)*(endYC - begYC)

...假设点在x和y方向上排序(否则将每个calc包含在abs中,例如abs(endXC - begXC)

如果可能会调用区域和周长,您可能需要计算&将它们存储在init

答案 4 :(得分:0)

如果你看看你的班级,你在班级的构造函数中浪费的时间比计算区域和周长的时间要多。你为什么存储线?积分更方便:

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