2013-01-06 2 views
2

교차 I가 다음 구조체 정의 :데이터 구조

struct vec { // 2-dim vector 
    long d[2]; 
}; 
struct lineSegment { // a 2D-LineSegment with start/end points A, B 
    vec A, B; 
}; 
struct polygon { // a 2D-Polygon 
    vec *points; 
    polygon(unsigned int points) { 
     vec = new vec[points]; 
    } 
    polygon() {} 
    ~polygon() { delete[] vec; } 
}; 
내 작업은 특정 시점 A가 내부에 있는지를 결정한다 (& A, CONST 다각형 & P VEC CONST) 방법 isPointInside 물품이다

주어진 다각형 P 또는 아닙니다.

내 구현
먼저 내 방법은 선분의 L (A)에서 시작하여 점 B에서 종료를 생성, 즉 다각형의 외부 확실히이다. 둘째, 선분 L과 교차하는 모든 다각형의 경계를 계산합니다. 주어진 점 A는 폴리곤 P의 계수 된 경계가 홀수 인 경우 지정된 폴리곤 P의 내부에 있습니다.

나는 두 선분이 교차은 다음 함수 선언을가한다면, 찾아 사용하는 방법은 :

bool intersect(const line&, const line&); 

다각형은 다각형을 정의하는 모든 코너 포인트의 배열입니다.

(P1, P2), (P2, P3), ..., (P(N-1), PN), (PN, P1) 

는 그 내부 가리키는하는 'const를 lineSegment' 포인터 polyBorder을 사용하고자하는 모든 국경을 반복하려면 : n 개의 모서리 점

P = (P1, P2, ..., PN) 

을 가진 다각형 P는 다음과 국경을 가지고 polygon.points 배열 (vec 유형)이며 모든 반복 후에 sizeof (vec)만큼 증가합니다. (n 번째 반복 제외) 각각의 반복에서

나는

intersect(L, *polyBorder); 



어떤 C/C++ 컴파일러이 반복 작업을 수행하는 질문, 전화 또는 일부 컴파일러 저장소 추가 데이터를하고 싶지 vec 및 lineSegment의 경우 이러한 접근 방식이 작동하지 않습니다.

의미는 c/C++ 표준에서 잘 정의 된이 포인터의 용도입니까, 아니면이 구현과 관련이 있습니까?

// 편집
일부 exemple 코드 (안 테스트 아마 작동하지 않습니다!) :

polygon test(4); 
// initialise the points in test.points 

const lineSegment *polyBorder = reinterpret_cast<lineSegment*>((const void*)test.points); // first line 
// do something 

polyBorder = reinterpret_cast<const lineSegment*>(((const void*)polyBorder)+sizeof(vec)); // second line 
// do something 

polyBorder = reinterpret_cast<const lineSegment*>(((const void*)polyBorder)+sizeof(vec)); // third line 
// do something 
+2

원시 포인터와 수동 할당/할당 해제 대신 표준 STL 컨테이너 (예 :'std :: vector')와 컨테이너를 반복하는 알고리즘을 사용하는 것이 좋습니다 –

+1

이 메서드는 줄이 하나 이상의 꼭지점을 통과하면 분해됩니다 다각형의 그냥 선생님. –

+0

코드를 설명하지 말고 보여주십시오. –

답변

0

내가 질문을 이해하지 있는지 확인하십시오. sizeof(vec)에 컴파일러에 포함 된 추가 데이터가 포함되어 있는지 묻고 있습니까? 네, 그렇습니다. 그러나 포인터가 char* 인 경우에만 sizeof(vec)만큼 증가합니다. 포인터의 유형이 type* 인 경우 포인터에 대한 산술 연산은 요소를 type 요소의 배열을 가리키는 것으로 간주하고 전체 요소에 대해 연산합니다. 따라서 sizeof을 사용할 필요가 없습니다.

업데이트 : 귀하의 질문에 편집을 본 적이 이제

, 내가 더 잘 이해하고 생각합니다.기본적인 질문은 :

T* array[N] 

및 구조 유형 :

struct S { 
    T A, B; 
}; 

당신이 배열에 순차적 요소의 쌍에 액세스 할 S* 포인터를 사용할 수 있습니다

배열을 감안할 때?

나는 이것이 작동해야한다고 생각합니다. 그러나 포인터를 생성하는 sizeof 기술을 사용하지 말아야 직접 유형 사이의 캐스트와 일반 포인터 연산을 사용한다 :

const lineSegment *polyBorder = (lineSegment*)test.points; // first line 
polyBorder = (lineSegment*)(((vec*)polyBorder))+1); // second line 
polyBorder = (lineSegment*)(((vec*)polyBorder))+1); // third line 

이것은 만드는 유형 말장난 명확하고 방법 C를 활용/C++는 포인터 연산을 수행하여 자동으로 장면 뒤의 요소 크기를 곱합니다.

+0

포인터 유형을 자세히 살펴보십시오. polyBorder는 const lineSegment 타입입니다. * (sizeof (lineSegment) min 2 * sizeof (vec)) polygon.points는 vec * 타입입니다. polyBorder는 vec-Array에 액세스하는 데 사용되지 않으므로 두 개의 인접 점을 세그먼트 선으로 처리 할 수 ​​있습니다. (이렇게하면 교차 (...)와 함께 사용할 폴리곤 테두리에 n 개의 세그먼트 선을 만들 필요가 없습니다.) – user1861174

+0

질문에 실제 선언을 추가하고 요청한 코드를 표시하십시오. 실제 코드가 아닌 설명으로 이해하는 데 어려움을 겪고 있습니다. – Barmar

+0

중요하지 않습니다. 어쨌든'sizeof (vec)'를'vec *'에 추가하면 안됩니다. 정의에 따르면'a [i] == * (a + i)'를 기억하십시오. –