这并不是说这没有道理,而是在99%的时间中奏效了。

通常,在2D图形中,矩形初始化,存储和操纵为一对。没有特定的语言,

class Rect:
   p1, p2: point

将矩形定义为两个x值和两个y值,这是更有意义的:

class Rect
   xleft, xright: int
   ytop, ybottom: int

有两个点,如果在源代码中的某个位置,您要使用顶部的y值,则必须说rect.p1.y(hmmm,停止和思考,是p1或p2),但是以四个值为普通数据成员的值,它是清晰而直接的:rect.ytop(不需要思考!)使用两个点意味着在处理垂直方向时,您必须纠缠水平;独立元素之间存在无关的关系。

这个两点的想法是如何产生的?为什么它仍然存在?它比裸X和Y坐标有一些好处吗?

添加注意:这个问题是在XY对齐的矩形的上下文中,例如Windows Manager和GUI工具包中,而不是在绘图和绘画应用程序中的任意形状的背景下。

有帮助吗?

解决方案

您是否认为易于易于的错误?

如果您使用(Point1,Point2),则 非常 清除您要指定的内容。如果您提供2分,那么唯一可能的错误是用户在构造点时将其X和y混合在一起,因为点的顺序无关紧要。

如果您提供4个整数,则如果某人不关注,则在您想要的时候(X1,X2,Y1,Y2)可能会提供(X1,Y1,X2,Y2),反之亦然。另外,一些API,例如WCF 矩形 结构将矩形定义为(x,y,宽度,高度),然后可能会引起(1、2、3、4)的含义。那是(x,y,w,h)还是(x1,y1,x2,y2)或(x1,x2,y1,y2)?

总而言之,(Point1,Point2)对我来说似乎更安全。

其他提示

我一直喜欢将矩形定义为点 +宽度和高度,其中点是矩形的左上角。

class Rect {
  float x, y;
  float width, height;
}

然后添加您需要获取其他指标的任何方法。像 爪哇 版本

实际上,直接并未定义2分。仅当矩形与轴平行时,只能由两个点定义。

有几种表示与轴平行的矩形的方法:

  1. 两个对角线相反
  2. 一个角点,高度和宽度
  3. 中心点,一半的高度和宽度(罕见,但有时很有用)。
  4. 作为两个X坐标和两个Y坐标

对于(1),许多库都使用约定来确定使用哪个点 - 例如,底线和底部右边。

代表的选择可能是由矩形定义的原始目的驱动的,但我想 通常是任意的. 。这些表示形式在其携带的信息上等效。但是,它们确实可以计算出矩形的属性以及在reectangle上执行操作的便利性的易用性。

定义的好处(1)比其他的包括:

  • API与其他多边形,线等的一致性
  • 高级,底部右边可以传递给任何接受点的方法
  • 点类方法可以在台阶上调用,底部右
  • 大多数属性可以轻松得出,例如。底部,最佳,宽度,高度,中心,对角线长度等。

出色地 p1: Pointp2: Point 每个人都会有 int 坐标 无论如何,在他们中,你的班级不是同一件事吗?

如果您将这两个积分存储为一流 Point 对象,您不从中获得更多的实用性吗?在我所知道的大多数图形坐标系统中,要以这种方式进行分类以创建对象的层次结构: point -> circle -> ellipse 等等。

因此,如果您制作一个不使用的对象 Point 班级,您已将该对象与级别层次结构的其余部分离婚。

这就是为什么我喜欢Delphi的 TRect. 。它被定义为一种变体记录(C-Speat中的联合结构),可以解释为底线和底部右点,或者顶部,左,底部和右整数,以目前更方便。

当然,如果您将矩形定义为:

class Rect
{
    Point bottomLeft;
    Point topRight;
}

然后,您立即知道哪个点是什么。

甚至更好的是添加额外的属性,使您可以操纵矩形应用程序所需的方式。这些只需更新基础数据结构。

通过将转换添加到形状上,您可以任何想要的方式定向矩形。您仍然需要一个轴对齐的边界框,以便快速接受/拒绝支票:)

但是,如果您的模型允许任何方向的矩形不应用转换,则“左下”和“右上”没有含义,这会导致“ P1”和“ P2”(或等效的东西)。

我认为,矩形由X和y的范围和点表示更有意义。您甚至可以使位置点为矩形的中心,因此它与旋转无关

但这可能最容易将其编码为两点!

我不喜欢它,因为我们已经抛出了潜在的自由度,这实质上允许任意旋转。一般的2D矩形有五个未知数(自由度)。我们可以将它们指定为一个点的坐标,两侧的长度与该点形成顶点,以及从第一线的水平的角度(另一个假定的角度更大90度)。也可以使用无限数量的其他可能性,但是必须指定五个独立数量。根据对它们的做法,有些选择将导致比其他选择更容易代数。

这与2分完全一样吗?这个尴尬...大多数绘图例程都需要点,而不是分开的X/Y组件。

将矩形定义为点对,使您可以将点作为顶点重复使用,以使其成为另一种形状。只是一个想法...

我相信,主要是在所有形状原始素之间建立统一性。

当然,您可以以多种不同的方式定义矩形,但是如何以可以使用类似数据结构的方式定义三角形或星形或圆圈?

所有多边形都可以通过其点来定义,并使用短逻辑来确定如何处理这些点。

图形库主要在这些多边形上以顶点和边缘的形式进行操作,因此点和它们之间的界线,所有计算在这两个功能上都可以使用,良好和方面,但这本身只是边缘的函数。

在两个维度中,将矩形存储为两个点要比定义特定角和宽度和高度更清晰 - 考虑负宽度或高度,或确定彼此确定每个选项所需的计算。

在由点定义的矩形上执行旋转也比用点加宽度和高度定义的一个要简单得多。

我希望封装使这种差异化不重要,作为班级的用户。

矩形应定义为在3个维度中正确定义的三个点。我不确定在4个或更多维度中定义矩形的要求。

这是完全任意的。您需要四个信息来绘制矩形。图书馆设计师决定用两个点(每个坐标)表示它,但可以轻松地使用X/Y/W/H或TOP/TOP/BOTTEN/左/右表示。

我想OP的真正问题是: 为什么 这个特殊的选择吗?

参数的选择仅对低级设计师 /编码器很重要。

高级用户只需要考虑:

  • ISPointIntiNect
  • 区域
  • 交叉点(或剪裁)
  • HasoverLap(与交叉点相同。区域> 0)
  • 联合(成为矩形清单)
  • 减法(代表矩形集A中的相同点集但不在rect B中的矩形列表)
  • 转换
    • x和y的变化
    • 旋转(0,90,180,270)
    • 缩放x和y (看注释)
  • 属性XMIN,XMAX,YMIN,YMAX,宽度,高度的简单语法,因此用户不需要知道参数的确切选择。

注意:为了最大程度地减少缩放变换期间的精度损失,有时可以实现使用浮点坐标的第二个一个Rect类,以便可以将中间结果准确地存储在一系列变换序列中,并且仅在整数中圆形到整数。最后一步。

正如@Steven所说,我认为应该以一个(x,y)点和A(w,h)尺寸向量为单位。那是因为很容易陷入歧义。假设您从点(0,0)开始有以下填充矩形。

  012
0 XXX
1 XXX
2 XXX

显然,它的宽度是(3,3),但是第二点是什么?是(2,2)还是(3,3)?

这种歧义会导致各种问题。

几年前,我了解到很难看,最好将图形坐标视为线条 之间 像素,不是像素的线 。这样就没有歧义。

Pa(x,y)*-----------------------------------*Pb(x,y)
       |                                   |
       |                                   |
       |                                   |
       |                                   |
       |                                   |
       |                                   |
Pc(x,y)*-----------------------------------*Pd(x,y)

我们可以这样定义PB和PC:

PB(PD(X),PA(Y))

PC(PA(X),PD(Y))

因此,由于对称性而无需定义所有四个点

许可以下: CC-BY-SA归因
scroll top