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