【发布时间】:2020-12-08 05:26:51
【问题描述】:
矩形位于双向链表中。在这种情况下,矩形是一个图形,由矩形结构的数据组成(无论如何)。
struct rect {
int l; /* left */
int t; /* top */
int r; /* right */
int b; /* bottom */
};
它的字段有严格的位置(我保证它适用于任何矩形)。
[l; t] [r; t]
+------+
| |
| |
+------+
[l; b] [r; b]
矩形存储在对象中。
struct object {
struct rect *rect;
bool selected;
};
对象存储在列表的节点中。
struct node {
struct object *obj;
struct node *next;
struct node *prev;
};
Rectangles 从列表的头部开始连续绘制——首先绘制一个矩形,靠近列表的开头。因此,每个下一个数字都与前面的数字重叠。
我选择矩形,它带有一个由鼠标光标形成的选择矩形。在从末尾迭代列表期间完成选择检查。
struct node *node = getend(list);
struct object *obj;
do {
obj = node->obj;
/* Check, if a selection rectangle somehow
* intersects with a rectangle of the current
* object. */
if (rcheck(sel_rect, obj->rect))
obj->selected = true;
}
while ((node = node->prev));
看看我的问题的演示,在下面一点。
如您所见,选择矩形选择了两个矩形:黄色和绿色。在这种情况下,只应选择黄色图形;一般来说——如果在前向矩形后面有另一个图形(后向矩形),并且选择矩形确实不覆盖了这个图形的“可见”部分(在动画上它是绿色多边形,由重叠黄色图形形成),但覆盖了其“隐藏”部分,则应选择后向矩形不。
forward 矩形意味着它位于更靠近列表末尾的位置; 向后 矩形 - 它位于更靠近其开头的位置。
此算法用于游戏的二维地图编辑器,用于矩形纹理选择。
【问题讨论】:
-
选择循环应该使用
for (struct node *node = getend(list); node; node = node->prev) { ... }。使用do/while循环编码时,您无法处理空列表。 -
根据经验,将矩形描述为
top, left, bottom, right会产生比top, left, width, height更简单的代码。
标签: c algorithm geometry selection rectangles