2015-01-08 6 views
5

질문
이 지금 얼마 동안 나를 귀찮게 뭔가입니다,하지만 난 그것에 대한 확실한 답변을 찾을 수 없습니다 :표준화 2D/3D 벡터/좌표 클래스

  • 는 알고 누구인가 표준 2D 및/또는 3D 벡터 (x, y 및 z 멤버가있는 구조체)를 STL에 소개하겠습니까?
  • 그렇지 않은 경우 표준의 다음 버전에 이러한 클래스를 추가하는 현실적인 방법이 있습니까? 완전하고 완벽하게 작성된 제안서를 직접 작성하는 것이 아닌가요?
  • 그리고 아직 완료되지 않은 이유는 무엇입니까?

나는 기꺼이 기여할 의향이 있지만 나는 받아 들일 수있을만큼 충분히 높은 품질의 것을 만드는 경험이 없다고 생각한다 (나는 전문 프로그래머가 아니다). 기본적으로 모든

의 자신의 버전을 구현하는 라이브러리와 프레임 워크 (그래픽, 물리학, 수학, 네비게이션, 센서 융합 ... 그것을 수) 지금 내가 본 수십

추론/배경

struct Vector2d { 
    double x,y; 
    //... 
}; 
/* ... 
* operator overloads 
*/ 

및/또는 3D 등가물 - 모든 경우는 물론, 적절한 시간에 재사용 가능한 버전을 만들기 전에 직접 구현 한 경우도 마찬가지입니다.
분명히 이것은 어려운 일이 아니며 차선책의 구현에 대해 걱정할 필요가 없지만 때마다 두 라이브러리를 결합하거나 다른 프로젝트의 코드를 재사용하고 싶습니다. 한 버전을 다른 버전으로 변환해야합니다. 전송 또는 가능한 경우 텍스트 교체).

위원회는 C++ 17 (특히 2D 그래픽 프레임 워크)의 표준 라이브러리를 크게 확장하려고 노력 했으므로 처음부터 모든 인터페이스에 공통 2D 벡터를 구워 넣고 싶습니다. 조금 과장 될 수

drawLine(transformCoordinates(trackedObject1.estimatePos(),params), 
     transformCoordinates(trackedObject2.estimatePos(),params)); 

오히려

MyOwnVec2D t1{trackedObject1.estimatePosX(), trackedObject1.estPosY()}; 
MyOwnVec2D t2{trackedObject2.estimatePosX(), trackedObject2.estPosY()}; 

t1 = transformCoordinates(t1,params); 
t2 = transformCoordinates(t2,params); 

drawLine(t1.x,t1.y,t2.x,t2.y); 

보다,하지만 난 내 지점을 보여줍니다 생각 : 그냥 예를 들어 물품.

나는 더하기와 곱하기와 같은 표준 연산을 허용하므로 이미 올바른 방향으로 가고 있습니다. 그러나 필요한 것은 모두 2 개 또는 3 개의 좌표가 있으면 너무 많은 가중치가 적용됩니다. 나는 고정 크기 및 동적 메모리 할당 (예 : std::array 기반)을 가진 valarray가 허용 가능한 솔루션이 될 것이라고 생각합니다. 특히 사소한 반복자 구현이 포함되어 있기 때문에 그렇다고 생각합니다. 그러나 개인적으로 x, y (및 z) 회원.

비고 :이 주제는 이미 논의되고있다 (그렇지 않은 경우 내가 놀랄 것)하면 미안하지만 때마다 나는 결과를 std::vector<std::vector<T>> 같은 얘기를 얻을 2D 벡터를 찾고 있어요 또는 특정 변환을 구현하는 방법은 있지만 표준화 주제는 없습니다.

+0

* 표준의 다음 버전에 이러한 클래스를 추가하는 현실적인 방법이 있습니다. 완전하고 완벽하게 작성된 제안서를 작성하는 것이 부족합니다. * - 다른 사람에게 그렇게하도록 설득하는 것. 그것이 C++이 진화하는 방식입니다. –

+0

@BartekBanachewicz :이 작업을 수행하는 방법에 대한 힌트 또는 제안서 작성에 대한 도움을 요청할 방법에 대한 힌트 (SW 회사에서 근무하지 않는 경우)? – MikeMB

+1

기존 제안을 읽는 것으로 시작하겠습니다. –

답변

4

아직 완료되지 않은 이유는 무엇입니까?

본질적으로 이유가 없습니다.

두 개 또는 세 개의 요소가 포함 된 형식을 만드는 것은 매우 간단하며 모든 작업을 쉽게 정의 할 수도 있습니다. 또한 C++ 표준 라이브러리는 범용 수학 도구로 사용하기위한 것이 아닙니다. 특수한 타사 라이브러리를 사용하는 것이 합리적입니다. 수학 유형에 대해 진지하게 생각하고 함께 던져 넣을 수있는 함수와 연산자를 넘어서는 구조라면 반시.

그리고 우리는 표준화 할 필요가없는 것들을 표준화하지 않습니다.

C++이 일종의 표준화 된 3D 그래픽 API를 얻는다면 나는 변하지 만 그때까지는 변하지 않는 것을 볼 수 있습니다. 그리고 그것이 C++이 표준화 된 3D 그래픽 API를 결코 얻지 못할 것입니다.

그러나 강하게 생각하면 모든 전문가 (일부 전문가는 물론 전문가가 아닌)가 살고있는 std-discussion에서 대화를 시작할 수 있습니다. 때로는 그러한 대화가 제안서를 형성하게되며, 반드시 작성해야하는 사람 일 필요는 없습니다.

+0

C++이 일종의 표준화 된 3D 그래픽 API를 얻는다면 반드시 선택한 좌표 유형으로 작동하도록 일반화 될 것입니다. C++은 모든 API 경계 요금 부스에서 "세금"이 아닌 필요한 것만 지불하는 것을 좋아합니다. – sehe

+0

@sehe : 어쩌면 나는 완전히 당신의 요점을 놓치고 있지만, 어쩌면? 한 구현체는 일반 데이터 멤버, 또 다른 세터 및 getter 메소드를 사용합니다. 좌표 x, y, z의 이름을 지정할 수 있으며, 다른 x1, x2, x3 및 세 번째는 배열 스타일 액세스가 필요할 수 있습니다. – MikeMB

+0

@MikeMB [** Boost Geometry ** 설계 이론적 근거] (http://www.boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/design.html)를 참조하십시오. 전체 ** [Boost Propertiesymap] (http://www.boost.org/doc/libs/1_57_0/libs/property_map/doc/property_map.html) ** 라이브러리 .. 일반화 된 액세스는 다양한 C++ API의 핵심 도구입니다 디자인 – sehe

1

누군가가 관심이있는 경우 2014 년 7 월 버전 "A Proposal to Add 2D Graphics Rendering and Display to C++"에는 2D 포인트 클래스/구조체가 포함되어 있습니다. (제 질문은 2014 년 1 월 초안을 기준으로 작성되었습니다). 아마도 C++ 1z에는 간단한 표준 2D-Vector가있을 것입니다.