我正在制作一个mfc应用程序来制作一个有点绘图机制。使用折线,用户可以绘制图形,并且在按下回车键时,线的当前点将连接到起点[以形成闭合多边形]。我想你应该已经明白了。现在,我使用STL数组来存储多边形的每个顶点 - 用简单的单词,点击鼠标左键的每个点,同时绘制图形存储在数组中。
std::array<CPoint,11> v; //vertices
我正在使用以下机制输出此数组的元素,即点:
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)s。有没有办法只打印存储顶点的元素(我希望你明白我的意思)。像vertices[n]=/*some character that signifies the last element*/
这样的东西。我的问题是,这个角色会是什么?比如字符串中的'\ 0'。
答案 0 :(得分:2)
CPoint
结构中的“结束标记”看起来不太合适:每对{x,y}
代表一个法律点,至少在理论上是这样。
如果你坚持使用固定数组(大概是出于性能原因),你也可以将多边形顶点的数量存储在一个单独的变量中(继续你的字符串类比,那将是点的“Pascal字符串”,而不是而不是“C字符串”的点数。)
如果使用数组不是必需的,您可能需要切换到std::vector<CPoint>
,这是一个更适合表示可变大小结构的容器,例如多边形。
最后,您可以将一个点指定为非法(例如,在{std::numeric_limits<long>::max(), std::numeric_limits<long>::max()}
),静态创建该点的实例,并将其用作序列结束标记。在这种情况下,请考虑将数组扩展一个,并将结束标记用作标记。
答案 1 :(得分:0)
好吧,如果您打算将(0; 0)
点视为无效,则只需检查点{0}}:
(0; 0)