두 점으로 직사각형을 정의하는 아이디어는 무엇입니까? [닫은]


14

이것이 의미가있는 것은 아니지만 99 %의 시간을 어색하게 처리합니다.

종종 2D 그래픽에서 직사각형은 한 쌍의 점으로 초기화, 저장 및 조작됩니다. 특별한 언어는 없습니다.

class Rect:
   p1, p2: point

다음과 같이 사각형을 두 개의 x 값과 두 개의 y 값으로 정의하는 것이 더 합리적입니다.

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

소스 코드의 어느 곳에서 상단의 y 값을 사용하려면 rect.p1.y (hmmm, stop and think, p1 또는 p2)라고 말해야합니다. 네 개의 값을 일반 데이터 멤버로 사용하면 명확하고 직접적입니다. rect.ytop (생각할 필요가 없습니다!) 두 점을 사용하면 세로를 처리 할 때 가로를 엉켜 야합니다. 무의미한 요소 사이에는 관계가 없습니다.

이 2 점 아이디어는 어떻게 나타 났으며 왜 지속됩니까? 베어 x 및 y 좌표보다 이점이 있습니까?

ADDED NOTE :이 질문은 그리기 및 페인팅 앱의 임의의 모양이 아니라 Windows 관리자 및 GUI 툴킷과 같은 XY 정렬 사각형과 관련이 있습니다.


8
Rects를 사용하여 상당한 양의 코드를 작성 했습니까?

6
사각형은 두 점으로 정의되므로 두 점으로 표시하면 의미가 있습니다.
Adam Crossland

2
직사각형은보다 자연스럽게 x 값의 범위와 y 값의 범위로 정의됩니다.
DarenW

2
좋은 질문입니다! 나는 그것에 대해 스스로 생각하지 않았지만, 당신은 흥미로운 주장을합니다! FWIW는, 윈도우는이 RECT를 당신이 (위, 왼쪽, 아래, 오른쪽)과 설명처럼
딘 하딩

3
두 점으로 직사각형을 어떻게 정의합니까? 회전이 없다고 가정합니까?
Nick T

답변:


8

오류가 적은 경향이 있다고 생각 했습니까?

(Point1, Point2)를 사용하면 지정한 것을 명확하게 알 수 있습니다. 2 점을 제공하면 가능한 순서 오류는 점의 순서가 중요하지 않으므로 점을 구성 할 때 사용자가 x와 y를 섞 었다는 것입니다.

4 개의 정수를 제공하면 누군가주의를 기울이지 않으면 원할 때 (x1, y1, x2, y2) 또는 그 반대로 (x1, x2, y1, y2)를 제공 할 수 있습니다. 또한 WCF의 Rect 구조 와 같은 일부 API 는 사각형을 (x, y, 너비, 높이)로 정의하여 (1, 2, 3, 4)의 의미를 혼동시킬 수 있습니다. (x, y, w, h) 또는 (x1, y1, x2, y2) 또는 (x1, x2, y1, y2)입니까?

대체로 (Point1, Point2)는 조금 더 안전 해 보입니다.


3
Rect (xrange (x1, x2), yrange (y1, y2))와 같은 것은 어떻습니까? 그것은 API 사용 안전성과 우아함의 궁극적 인 것 같습니다.
DarenW

9

나는 사각형을 점 + 너비와 높이로 정의하는 것을 좋아했습니다. 여기서 점은 사각형의 왼쪽 위 모서리입니다.

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

그런 다음 다른 측정 항목을 가져 오는 데 필요한 메소드를 추가하십시오. 자바 버전 처럼


4
상단 y + 높이, y- 높이 또는 그냥 y입니까?
Cameron MacFarland

2
@Cameron MacFarland : 응용 프로그램의 좌표계에 따라 다르며 사각형이 적을 염려가 없습니다.
Jon Purdy

2
@Martin Wickman : 2 점을 사용할 때의 장점은 무엇입니까?
Kramii

@Kramii : 하나의 장점은 전체 rect를 움직일 때 한 지점 만 번역하면된다는 것입니다. Btw, 필요할 경우 언제든지 "누락 점"을 계산할 수 있습니다 (cpu / memory tradeoff).
Martin Wickman

이것도 실생활에 나타납니다. 사각형으로 수행하는 가장 일반적인 작업 중 하나가 점이 포함되어 있는지 테스트하는 것이 까다 롭습니다. 그림도 일반적입니다. 두 경우 모두 추가가 수행되어야하는데, 이는 나와 같은 고성능 클록 사이클 카운터를 방해합니다.
DarenW

7

실제로 rectagle은 2 점으로 정의되지 않습니다. 사각형은 축과 평행 한 경우에만 두 점으로 정의 할 수 있습니다.

축과 평행 한 사각형을 나타내는 여러 가지 방법이 있습니다.

  1. 대각선으로 반대되는 두 점
  2. 한 모퉁이 지점, 높이 및 너비
  3. 중심점, 절반 높이 및 너비 (흔하지는 않지만 때로는 유용함).
  4. 두 개의 X 좌표와 두 개의 Y 좌표

(1)의 경우, 많은 라이브러리는 규칙을 사용하여 topLeft 및 bottomRight와 같이 사용되는 두 지점을 결정합니다.

표현의 선택은 사각형 정의의 원래 목적에 의해 결정될 수 있지만 종종 임의적 이라고 생각합니다 . 그 표현은 그들이 가지고있는 정보와 동일합니다. 그러나 사각형의 속성을 쉽게 계산할 수 있고 사각형에서 작업을 수행 할 수있는 편의성이 다릅니다.

다른 것보다 정의 (1)의 이점은 다음과 같습니다.

  • 다른 다각형, 선 등과 API의 일관성
  • topLeft, bottomRight는 포인트를 허용하는 모든 메소드에 전달 될 수 있습니다
  • topLeft, bottomRight에서 Point 클래스의 메서드를 호출 할 수 있습니다.
  • 예를 들어 대부분의 속성은 쉽게 파생 될 수 있습니다. bottomLeft, topRight, 너비, 높이, 중심, 대각선 길이 등

6

p1: Pointp2: Point각각해야 할 것 int좌표를 이렇게 클래스 금액이 같은 일을하지 않습니다, 어쨌든에?

그리고이 두 점을 일류 Point객체 로 저장 하면 그로부터 더 많은 유틸리티를 얻지 못합니까? 내가 아는 대부분의 그래픽 좌표계에서 점은 이러한 방식으로 객체의 계층 구조를 만들기 위해 서브 클래스 화 point -> circle -> ellipse됩니다.

따라서 Point클래스를 사용하지 않는 객체를 만들면 해당 객체를 나머지 클래스 계층 구조와 이혼 한 것입니다.


1
OP의 표현에서 볼 수있는 장점은 사각형의 y 값을 더 알고 싶다면 "ybottom"이라는 것을 알고 있습니다. p1 / p2와 마찬가지로 어느 것이 더 낮은 지 알아 내야합니다. 어쨌든 p1이 더 낮은 값이 될 것이라고 보장하지 않는 한입니다.
Jason Viers

1
두 개의 서로 다른 구조체가 모두 네 개의 좌표로 요약되는 것이 사실이지만, 두 점 버전은 하나의 x와 하나의 y를 모으는 외부 레벨을 도입하지만 x는 어떤 y와 어떤 관련이 있는지에 대한 이론적 근거는 없습니다. 나는 수년간의 그래픽 프로그래밍 후에이 추가 레벨이 유틸리티를 제공한다고 생각하지 않습니다.
DarenW

1
@ 제이슨 : 좋은 지적입니다. 그러나 ytop/ ybottom접근 방식을 사용하면 ybottom실제로 아래에 있는 어딘가에 대한 보증이 필요 합니다 ytop.
윌리 박사의 견습생

또는 'em y1 및 y2를 호출하고 min (y1, y2) 및 max (y1, y2)를 사용하십시오. 물론 두 지점 p1, p2를 통해 액세스하는 것보다 더 어색합니다.
DarenW

top / bottom이라는 이름은 특별히 코딩하지 않는 한 bottomx <topx를 막는 것만 큼 아무것도 사지 않습니다. 나는 그것이 혼란을 더할 것이라고 생각합니다.
lkg

5

이것이 내가 Delphi를 좋아하는 이유 TRect입니다. TopLeft 및 BottomRight 포인트 또는 Top, Left, Bottom 및 Right 정수로 해석 할 수있는 변형 레코드 (C-speak의 UNION 구조체)로 정의되어 있습니다.


1
아주 유용한 기능입니다.
21:53에

4

반드시 사각형을 다음과 같이 정의하면

class Rect
{
    Point bottomLeft;
    Point topRight;
}

그러면 어느 지점이 어떤지 곧바로 알 수 있습니다.

응용 프로그램에 필요한 방식으로 사각형을 조작 할 수있는 추가 속성을 추가하는 것이 더 좋습니다. 이것들은 단순히 기본 데이터 구조를 업데이트합니다.

도형에 변형을 추가하여 원하는 방향으로 사각형의 방향을 지정할 수 있습니다. 빠른 수락 / 거부 검사를 위해 축 정렬 경계 상자가 여전히 필요합니다. :)

그러나 모델이 변환을 적용하지 않고 어떤 방향으로도 사각형을 허용하는 경우 "왼쪽 하단"과 "오른쪽 상단"은 의미가 없으므로 "p1"및 "p2"(또는 이에 상응하는 항목)로 돌아갑니다.


사각형을 90도 회전하면 어떻게됩니까? 현재 처음과 다른 두 지점을 추적하고 있습니까? 아니면 "bottomLeft"왼쪽에 "topRight"가 있습니까?
Inaimathi

@Inaimathi-변환 행렬을 추가하면 사각형이 축과 방향을 유지할 수 있습니다. 그러나 응용 프로그램에 따라 다릅니다.
ChrisF

2

사각형이 x 및 y 범위와 점으로 표현되는 것이 더 합리적이라고 생각합니다. 위치가 직사각형의 중심을 가리 키도록하여 회전과 무관하게 만들 수도 있습니다.

그러나 두 점으로 코딩하는 것이 가장 쉬웠을 것입니다!


두 점으로 코딩하는 것이 더 쉬운 방법은 무엇입니까?
DarenW

@DaremW : 일반적인 무승부 - 사각형 라이브러리 함수는 왼쪽 상단 및 낮은 오른쪽 포인트를 인수로 걸릴
스티븐 A. 로우를

그러나 왜 API가 그렇게 설계 되었습니까? 무의식적으로 이전 라이브러리를 모방하는 것입니다.
DarenW

@DarenW : 제 생각에는 라이브러리는 Bresenham 라인 드로잉 루틴을 사용하는 것입니다. Bresenham 라인 드로잉 루틴은 입력으로 두 점을 취하고 매우 효율적입니다.
Steven A. Lowe

2

나는 우리가 잠재적 인 자유도를 던져서 본질적으로 임의의 회전을 허용하기 때문에 그것을 좋아하지 않습니다. 일반적인 2D 직사각형에는 5 개의 미지수 (자유도)가 있습니다. 이를 점의 좌표,이 점으로 정점을 형성하는 두 변의 길이 및 첫 번째 선의 가로 각도 (다른 하나는 90도 더 큰 것으로 가정)로 지정할 수 있습니다. 무한한 수의 다른 가능성도 사용될 수 있지만, 지정해야하는 5 개의 독립적 인 수량이 있습니다. 어떤 선택은 그들과 함께 수행되는 것에 따라 다른 것보다 쉬운 대수로 이어질 것입니다.


5
"표준"사각형 구조는 엄격하게 정의 된 수학 사각형이 아니라 X 및 Y 축과 항상 평행 한 단순화 된 버전이라는 점을 인식하는 것이 중요합니다. 사각형 영역 정의 (거의) 항상 X 및 Y 축에 평행 한 창 관리자의 경우.
메이슨 휠러

+1, 왼쪽 / 오른쪽 / 위쪽 / 하단 구조가 미리 정렬되어 있으므로 정보가 더 적습니다
Javier

xy 정렬 사각형에 대한 좋은 지적. 나는 3D 모델링에서 사용되는 정도와 다른 것들도 있지만 모든 xy (-z)도 정렬되어 있음을 명심했다.
DarenW

1

2 포인트와 정확히 같은가요? 어색합니다 ... 대부분의 그리기 루틴에는 별도의 x / y 구성 요소가 아니라 점이 필요합니다.


1

사각형을 점 쌍으로 정의하면 점을 다른 모양의 정점으로 재사용 할 수 있습니다. 그냥 생각 ...


그러나 4 각형 모양을 정의하기 위해 2 포인트 만 유지하는 것은 반 데크를 가지고 노는 것처럼 보입니다. 왼쪽 위, 차갑게 필요하지만 오른쪽 위가 필요하면 비교적 말이 많은 멋진 데이터를 가져와야합니다.
DarenW

점 AX 점 BY 및 점 BX 점 AY로 정의 된 접근자가 있으면 메모리 / 디스크에서 더 가벼워집니다. 정점의 절반을 저장하고 그 점을 가리 키는 것으로 생각합니다 (최대 그리드 크기에 따라 다름). 나는 당신이 당신의 범위 생각으로 가고있는 곳을 얻지 만, 반 데크로 놀지 않고, 중복 데이터를 저장하지 않고 .... 다른 포인트는 메모리 제약 조건입니까? 모든 상호 연결된 코드에서 reimpleing rerecting의 의미는 무엇입니까?
RobotHumans

당신이 메모리 중 처음 두 정점을 얻을 수있는 "작업"을 할 필요가 없기 때문에, 그것은 빠르게 아마
RobotHumans

1

나는 그것이 모든 모양 프리미티브 사이의 균일 성을 주로 설정하는 것이라고 생각합니다.

물론 여러 가지 방법으로 사각형을 정의 할 수 있지만 유사한 데이터 구조를 사용할 수있는 방식으로 삼각형, 별 또는 원을 어떻게 정의합니까?

모든 폴리곤은 포인트로 수행 할 작업을 결정하기위한 짧은 논리 량으로 해당 포인트로 정의 할 수 있습니다.

그래픽 라이브러리는 주로 정점과 모서리의 관점에서 이러한 다각형에 대해 작동하므로 점과 선 사이의 모든 계산은이 두 가지 기능, 즉 패싯과 패싯에서 작동하지만 자체는 모서리의 함수일뿐입니다.


1

2 차원에서 직사각형을 두 점으로 저장하면 특정 모서리와 너비 및 높이를 정의하는 것보다 명확합니다. 음의 너비 또는 높이를 고려하거나 각 옵션을 서로 결정하는 데 필요한 계산을 고려하십시오.

포인트로 정의 된 사각형에서 회전을 수행하는 것도 포인트와 너비 및 높이로 정의 된 것보다 훨씬 간단합니다.

캡슐화가 클래스의 사용자 로서이 차별화를 중요하지 않게 할 것으로 기대합니다.

사각형은 3 차원으로 정의하기 위해 3 개의 점으로 정의해야합니다. 4 차원 이상의 사각형을 정의하기위한 요구 사항을 완전히 확신하지는 못합니다.


1

완전히 임의적입니다. 사각형을 그리려면 네 가지 정보가 필요합니다. 라이브러리 디자이너는 두 점 (각각 xy 좌표)으로 표시하기로 결정했지만 x / y / w / h 또는 top / bottom / left / right로 쉽게 수행 할 수있었습니다.

OP의 실제 질문은 다음과 같습니다. 왜이 특별한 선택이 이루어 졌습니까?


1

매개 변수의 선택은 저수준 디자이너 / 코더에게만 중요합니다.

고급 사용자는 다음에 대해서만 생각하면됩니다.

  • IsPointInRect
  • 지역
  • 교차점 (또는 클리핑)
  • HasOverlap (교차 면적> 0과 동일)
  • 유니온 (사각형 목록이 됨)
  • 빼기 (직사 A에는 있지만 rect B에는없는 것과 동일한 점 세트를 나타내는 사각형 목록)
  • 변환
    • X와 Y의 이동
    • 회전 (0, 90, 180, 270)
    • X와 Y로 스케일링 (참고 참조)
  • Xmin, Xmax, Ymin, Ymax, Width, Height 속성에 대한 간단한 구문이므로 사용자가 정확한 매개 변수 선택을 알 필요가 없습니다.

참고 : 스케일링 변환 중 정밀도 손실을 최소화하기 위해 부동 소수점 좌표를 사용하는 두 번째 Rect 클래스를 구현하는 것이 적절하므로 중간 결과는 변환 시퀀스에 정확하게 저장 될 수 있습니다. 마지막 단계.


0

@Steven이 말했듯이, 그것은 (x, y) 점과 (w, h) 크기 벡터의 관점에서 이루어져야한다고 생각합니다. 모호함에 빠지기 쉽기 때문입니다. 점 (0,0)에서 시작하는 다음과 같이 채워진 사각형이 있다고 가정하십시오.

  012
0 XXX
1 XXX
2 XXX

분명히 너비, 높이는 (3,3)이지만 두 번째 포인트는 무엇입니까? (2,2) 또는 (3,3)입니까?

이 모호성은 모든 종류의 문제를 일으킬 수 있습니다.

나는 그것이 선으로 그래픽 좌표를 생각하는 것이 좋습니다 것을 어렵게 년 전에 배운 사이의 픽셀, 라인으로 픽셀은하지 . 그렇게하면 모호함이 없습니다.


2
Mac의 원래 QuickDraw 루틴 (1980 년대의 것)은 점이 무한히 작은 수학적 모델을 사용했습니다. 화면의 포인트는 픽셀 사이에 있습니다. 따라서 (3,5)에서 (10,5)까지 그려진 선의 길이는 7이며 7 픽셀을 차지했습니다. 오늘 좌표에서이 선의 길이는 8입니다.
Barry Brown

@ Barry : XOR을 많이 사용했기 때문에 의미가 있으며, 줄을 함께 묶는 경우 누락 된 픽셀없이 만나기를 원합니다. 실제로 두 좌표계를 고려하여 다각형 채우기에 대한 siggraph 용지를 게시했습니다.
Mike Dunlavey

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

Pb와 Pc를 모두 정의 할 수 있습니다 :

Pb (Pd (x), Pa (y))

Pc (Pa (x), Pd (y))

따라서 대칭으로 인해 4 개의 점을 모두 정의 할 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.