1

我正在制作一个 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'。

4

2 回答 2

2

看起来结构中没有一个很好的“结束标记”候选者CPoint:每一对都{x,y}代表一个合法点,至少在理论上是这样。

如果您坚持使用固定数组(可能是出于性能原因),您还可以将多边形顶点的数量存储在一个单独的变量中(继续您的字符串类比,这将是点的“帕斯卡字符串”,而不是“ C 字符串”的点)。

如果使用数组不是必需的,您可能需要切换到 a std::vector<CPoint>,这是一个更适合表示可变大小结构(例如多边形)的容器。

最后,您可以将一个点指定为非法点(例如 at {std::numeric_limits<long>::max(), std::numeric_limits<long>::max()}),静态创建该点的实例,并将其用作序列结束标记。在这种情况下,请考虑将数组扩展一,并将结束标记用作哨兵。

于 2012-12-19T18:11:22.397 回答
0

好吧,如果您打算将该(0; 0)点用作无效点,则只需检查一个点是否位于(0; 0)

if (vertices[i].x != 0 && vertices[i].y != 0) {
    // valid
}
于 2012-12-19T18:19:26.310 回答