我正在制作一个mfc应用程序来实现某种程度上的绘图机制。使用折线,用户可以绘制图形,按enter键后,该线的当前点将连接到起始点以形成闭合多边形。我想你明白我的意思了。现在,我使用STL数组来存储多边形的每个顶点-简单地说,在绘制图形时单击鼠标左键的每个点都存储在该数组中。
std::array<CPoint,11> v; //vertices我使用以下机制来输出这个数组的元素,即points:
for(int j=0 ; j<v.size() ; j++ )
{
s.Format(L"%d %d\n",v[j].x, v[j].y);
aDC.TextOutW(x+=20,y+=20,s ); //each time print the coordinates
s=" "; //at a different location
}在执行过程中,当用户通过单击屏幕周围的点来绘制图形时,这些点将存储在数组中。该数组声明了12个元素,但一个形状很少有12个顶点。元素的其余部分(空元素)仍然是(0,0)-但它们在循环中输出。所以我打印的是3-4个坐标和大量的(0,0)。有没有办法只打印那些存储顶点的元素(我希望你明白我的意思)。就像vertices[n]=/*some character that signifies the last element*/一样。我的问题是,这个角色会是什么?例如字符串中的'\0‘。
发布于 2012-12-20 02:11:22
看起来在CPoint结构中并没有一个很好的“结束标记”候选者:至少在理论上,每一对{x,y}代表一个合法的点。
如果坚持使用固定数组(可能是出于性能原因),还可以将多边形顶点的数量存储在单独的变量中(继续字符串类比,这将是点的"Pascal字符串“,而不是点的"C字符串”)。
如果使用数组不是必需的,那么您可能希望切换到std::vector<CPoint>,这是一种更适合表示可变大小的结构的容器,例如多边形。
最后,您可以将一个点指定为非法的(例如,在{std::numeric_limits<long>::max(), std::numeric_limits<long>::max()}),静态地创建该点的一个实例,并将其用作序列结束标记。在这种情况下,请考虑将数组扩展一,并使用结束标记作为标记。
发布于 2012-12-20 02:19:26
好吧,如果您打算将(0; 0)点作为无效使用,那么您可以只检查一个点是否在(0; 0)
if (vertices[i].x != 0 && vertices[i].y != 0) {
// valid
}https://stackoverflow.com/questions/13958380
复制相似问题