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


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: Point과 p2: 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.