2016-08-31 1 views
2

모두 다각형의 모든면의 크기를 두 배의 벡터로 저장하는 다각형 클래스의 함수를 수행하고 싶습니다. 내 Polygon은 Point 클래스 덕분에 빌드됩니다. 그래서 나는 나의 다각형 안에 얼마나 많은 점이 있는지를 알고, 다각형의 그림을 화면에 인쇄하는 것이 성공이다.다각형의 모든면의 거리를 두 배로 두는 벡터

:이 클래스 다각형의 내 헤더

Point::Point(double x, double y) 
{ 
    _x = x; 
    _y = y; 
} 
Point::Point(const Point& other) 
{ 
    _x = other._x; 
    _y = other._y; 
} 
double Point::getX() const 
{ 
    return _x; 
} 
double Point::getY() const 
{ 
    return _y; 
} 
double Point::distance(const Point& other) 
{ 
return sqrt((getX() - other._x) * (getX() - other._x) + (getY() - other._y) *(getY() - other._y)); 
} 

이다 : 그러나 지점 다각형 감사의 모든 측면의 측면을 얻을 수있는 기능은 여전히 ​​

를이 내 수준의 포인트입니다 성공하지 않은

class Polygon 
{ 
    public: 
    Polygon(); 
    ~Polygon(); 
    int numOfPoints() const; 
    vector<Point> getPoints() const; 
    vector<double> getSides() const; 
    protected: 
    std::vector<Point> _points; 
    }; 

및 다각형의 CPP :

Polygon::Polygon(){} 
Polygon::~Polygon(){} 
int Polygon::numOfPoints() const 
{ 
    return _points.size(); 
} 
vector<Point> Polygon::getPoints() const 
{ 
    return _points; 
} 
vector<double> Polygon::getSides() const 
{ 
    vector<double> sides; 
} 

그래서 나는 내가 얻을 수있는 방법을 잘 모릅니다 포인트 클래스 덕분에 모든면의 크기. 나는 그것이 포인트의 함수 거리 덕분에 할 수 있다고 생각하지만, 어떻게 해야할지 모르겠다. 네가 나를 도울 수 있다면. 감사합니다!

+0

이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –

+0

글쎄, 어떤 점이 당신의 std :: vector _points에 있는지 확인해야합니다. 왜 모든 점에 자신의 변수를 주려고합니까? 아니면 점의 위치를 ​​정의하는 열거 형을 사용하여지도를 사용하려고합니까? 이것이 없으면 완전히 가능하지만 벡터에서 4 점을 식별 할 수는 없습니다. 어떤 점을 알고있을 때 어느 쪽을 계산할 필요가 있는지 알고있을 때 실제로 거리 함수를 사용하십시오. – Sossenbinder

+0

Sossenbinder, 머리말의 edti가 내 운동에서 금지되어 있기 때문에 문제가 생기고이 작업을 수행하는 방법을 이해할 수 없기 때문에 –

답변

0

다각형의 점을 반복하면서 이전 점까지의 거리를 계산해야합니다. 다음과 같은

뭔가 (테스트되지 않은) 작동합니다 : 이것은 첫 번째 점에서 시작하여 마지막 지점까지의 거리를 계산

vector<double> Polygon::getSides() const { 
    vector<double> sides; 
    for(auto it = this->_points.begin(); it != this->_points.end(); it++) { 
     if(it == this->_points.begin()) 
      sides.push_back(it->distance(*(this->_points.end() - 1))); 
     else 
      sides.push_back(it->distance(*(it - 1))); 
    } 
    return sides; 
} 

. 그 후에 각 포인트에 대해 이전 포인트까지의 거리를 계산합니다. 출력 벡터에 거리를 더할 때마다.

다각형이 닫혀 있다고 가정 했으므로 첫 번째 점은 마지막 점에 연결됩니다. 다각형에 점이 없으면 반환 벡터는 비어 있습니다. 하나의 점만 포함하면 단일 요소 [0]가 포함됩니다. 이것은 한 지점에서 같은 지점까지의 거리를 계산 한 결과입니다.

는 벡터 반복에 대한 추가 정보를 원하시면이 자습서를 참조하십시오 : http://www.cprogramming.com/tutorial/stl/iterators.html

1

먼저 작은 점 : 다음은 차이의 이중 계산 (컴파일러가 최적화 할 수 있지만, 그것은 그렇게하는에 의존하지 않는 더 나은를 피할 수 있습니다. ..).

double Point::distance(const Point& other) 
{ 
    double dx = _x - other._x; 
    double dy = _y - other._y; 
    return sqrt(dx * dx + dy * dy); 
} 

그러면 모든 포인트를 반복해야합니다. (한 거리 만, 다른 모든 숫자를 n ... n 개의 거리 결과) 적어도 두 개의 전혀 거리가 필요하지만, 두 사람은 타락한 경우입니다 :

vector<double> Polygon::getSides() const 
{ 
    vector<double> sides; 
    if(points.size() > 2) 
    { 
     sides.reserve(points.size()); 
     std::vector<Point>::iterator end = points.end() - 1; 
     for(std::vector<Point>::iterator i = points.begin(); i != end; ++i) 
      sides.push_back(i->distance(*(i + 1))); 
    } 
    if(points.size() >= 2) 
     sides.push_back(points.front().distance(points.back())); 
    return sides; 
} 

설명 :

if(points.size() > 2) 

우리는 두 개 이상의 점이있는 경우에만, 삼각형 이상이므로, 우리는 진정한 polyone을가집니다. 우리는이 거리의 거리, 즉 거리를 계산합니다. 지. 사각형 ABCD의 경우 거리 AB, BC, CD. 거리 DA가 아직 누락되어 있습니다.

sides.reserve(points.size()); 

n 포인트가있는 다각형에는 n면이 있습니다. 이것은 재 할당을 방지합니다.

std::vector<Point>::iterator end = points.end() - 1; 

end() 끝에서 1 포인트.거리 i, i + 1을 계산하고 싶으므로 마지막 요소는 건너 뜁니다.

for(std::vector<Point>::iterator i = points.begin(); i != end; ++i) 
     sides.push_back(i->distance(*(i + 1))); 

이제 거리를 산출 ...

if(points.size() >= 2) 
    sides.push_back(points.front().distance(points.back())); 

이 두 가지 경우 잡는다 : 이것은 폐쇄 마지막 측 추가 사실 polygones 들어 (위의 예 : DA)를. 또한, 한 줄의 퇴화 된 경우를 처리합니다 (i = 2).

실제로 이것은 for 루프 앞에 배치되었을 수도 있습니다. 내 변형은 포인트 ABCD AB BC CD DA, 대체 DA, AB, BC, CD를 계산합니다.

우리는 진정한 다각형의 경우에만 우리가 예약했음을 눈치 챘을 것입니다. degenerate 경우에는 하나의 요소 만 삽입하므로 예비를 통해 또는 요소를 삽입하기 전에 내부 배열을 할당하는 것이 중요하지 않습니다 ...

아, 그리고 코드 :

for(std::vector<Point>::iterator i = points.begin() + 1; i != points.end(); ++i) 
    sides.push_back(i->distance(*(i - 1))); 

효과적으로 동일한 점을 되돌려줍니다 (AB 대신 BA 계산).

+0

내 함수 getSides(), 코드의 두 번째 부분을 삽입하고 코드를 좀 더 설명 할 수 있습니까? –

+0

@ rony.stackoverflow 자세한 설명을 추가했습니다 ... 오타 (typo)로 인해 버그가 있음을 유의하십시오. 끝 (2) 대신 1 (1)이어야합니다. – Aconcagua