这段代码为什么不给出想要的结果?
//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;
}
这里,蓝线是要裁剪的多边形边缘。黄色,线条是剪切多边形的边缘。这段代码为什么不给出想要的结果?
您可以使用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"...
编辑:这个答案是对最初提出的问题。
确切地说,在Mytype中使用'std :: tuple'。但是,请考虑是否应该回答这个问题。 – gsamaras
为什么不应该回答?我用C++编写了一段时间,我通常不会用[]与用户类型或stl,但可能因为我习惯用各种语言编写代码。我也没有第一手知道答案(尽管我对答案有一个好主意)另外,使用[]与使用vector :: at不同,请参阅:http://stackoverflow.com/questions/9376049/vectorat-vs-vectoroperator – ydobonebi
至少为我自己说话,不回答这些问题的观点是,这样做可以极大地简化在参考网站上可以找到的勺子喂养答案。 –
这是为什么? – doron
你能澄清你的意思吗? – juanchopanza
'std :: map'? –