这段代码为什么不给出想要的结果?

问题描述:

//Sutherland-Holdgman Line Clipping 
#include "Line2d.h" 
#include "Rectangle2d.h" 
#include "Coordinates2d.h" 
#include "Bits.h" 
#include "Polygon2d.h" 
#include <list> 

typedef enum PointPosition 
{ 
    Left, Right 
} PointPosition; 

typedef enum LinePosition 
{ 
    CompletelyOut, CompletelyIn, ClippingCandidate, ClippingCandidateExtended 
} LinePosition; 

void EnumToString(LinePosition lnPos) 
{ 
    switch(lnPos) 
    { 
    case CompletelyOut: 
     std::cout<<lnPos<<". CompletelyOut"; 
     break; 
    case CompletelyIn: 
     std::cout<<lnPos<<". CompletelyIn"; 
     break; 
    case ClippingCandidate: 
     std::cout<<lnPos<<". ClippingCandidate"; 
     break; 
    case ClippingCandidateExtended: 
     std::cout<<lnPos<<". ClippingCandidateExtended"; 
     break; 
    } 
} 

class ClippingPolygon2d 
{ 
private: 
    Rectangle2d rectangle; 
    Polygon2d polygon; 
    PointPosition CheckPointAgainstALine(Line2d line, Point2d pt) 
    { 
     double c = (((line.GetEnd().x - line.GetStart().x) 
        *(pt.y - line.GetStart().y)) 
        -((line.GetEnd().y - line.GetStart().y) 
        *(pt.x - line.GetStart().x))); 

     if(c>=0) return Left; 
     else return Right; 
    } 
public: 
    LinePosition CheckLineAgainstEdge(Line2d polygonEdge, Line2d line) 
    { 
     LinePosition linePosition; 
     PointPosition startPoint = CheckPointAgainstALine(polygonEdge, line.GetStart()); 
     PointPosition endPoint = CheckPointAgainstALine(polygonEdge, line.GetEnd()); 

     if(startPoint==Left && endPoint==Left) 
     { 
      linePosition = CompletelyOut; 
     } 
     else if(startPoint==Right && endPoint==Right) 
     { 
      linePosition = CompletelyIn; 
     }  
     else if(startPoint==Left && endPoint==Right) 
     { 
      linePosition = ClippingCandidateExtended; 
     } 
     else if(startPoint==Right && endPoint==Left) 
     { 
      linePosition = ClippingCandidate; 
     } 
     return linePosition; 
    } 
}; 



int main() 
{ 
    Coordinates2d::ShowWindow("Sutherland-Hodgeman Line Clipping"); 

    ClippingPolygon2d clip; 

    Line2d edge(Point2d(20,20), Point2d(160,140)); 
    Line2d ln(Point2d(100,120), Point2d(100,140)); 

    LinePosition lnPos = clip.CheckLineAgainstEdge(edge, ln); 

    EnumToString(lnPos); 

    Coordinates2d::Draw(edge, Blue); 
    Coordinates2d::Draw(ln, Yellow); 

    Coordinates2d::Wait(); 

    return 0; 
} 

这里,蓝线是要裁剪的多边形边缘。黄色,线条是剪切多边形的边缘。这段代码为什么不给出想要的结果?

enter image description here

+0

这是为什么? – doron

+0

你能澄清你的意思吗? – juanchopanza

+0

'std :: map '? –

您可以使用std::vector没有初始化它的大小和它支持随机访问。要添加到空std::vector使用push_back

std::vector<MyType> vec; 
vec.push_back(MyType(10, 'a', "Hi")); 
vec.push_back(MyType(20, 'b', "Hello")); 
vec.push_back(MyType(30, 'c', "Bye")); 

MyType t = vec[1];//20,'b', "Hello"... 

编辑:这个答案是对最初提出的问题。

+0

确切地说,在Mytype中使用'std :: tuple'。但是,请考虑是否应该回答这个问题。 – gsamaras

+0

为什么不应该回答?我用C++编写了一段时间,我通常不会用[]与用户类型或stl,但可能因为我习惯用各种语言编写代码。我也没有第一手知道答案(尽管我对答案有一个好主意)另外,使用[]与使用vector :: at不同,请参阅:http://*.com/questions/9376049/vectorat-vs-vectoroperator – ydobonebi

+0

至少为我自己说话,不回答这些问题的观点是,这样做可以极大地简化在参考网站上可以找到的勺子喂养答案。 –