c++ - 在 C++ Builder 中检测绘制线的窗口坐标的最佳方法

标签 c++ bitmap c++builder

使用moveto和lineto在窗口 Canvas 上绘制各种线条...

在运行时确定对象(如位图或图片控件)是否与使用 lineto 绘制的线条“接触”(相同的 x,y 坐标)的最简单方法是什么在窗口 Canvas 上?

一个简单的例子是一个球(位图或图片)“接触”绘制的边框并反弹......了解对象、图片或位图与任何存在的线之间是否发生“接触”的最简单方法是什么在 window 上?

最佳答案

如果我做对了,您希望在移动时检测/避免圆形物体和直线之间的碰撞。我知道有更多选择可以做到这一点......

  1. vector 方法

    你还需要记住所有渲染的 vector 形式的东西,所以你需要所有渲染线、对象等的列表……然后对于特定的对象循环遍历所有其他对象,并用 vector 数学代数地检查碰撞。比如检测边界框之间的交点,然后与特定的线/折线/多边形或其他任何东西相交。

  2. 光栅方法

    这更容易实现,有时甚至更快但不太准确(仅像素精度)。这个想法是用背景颜色清除对象的最后位置。然后检查将在新位置渲染的所有像素,如果不存在背景颜色,则不会发生碰撞,因此您可以渲染像素。如果存在任何非背景颜色,则在发生碰撞时再次在原始位置渲染对象。

    您还可以在新旧位置之间进行检查,并将对象放在第一个非碰撞位置,这样您就更靠近边缘...

    这种方法需要快速的像素访问,否则会太慢。如果不使用来自 GDI 的 BitBlt,标准 Canvas 不允许这样做。幸运的是,VCL GRaphics::TBitmap 具有 ScanLine[] 属性,如果使用得当,可以直接访问像素而不会影响性能。请参阅我回答的其他问题中的示例:

    访问 ScanLine[y][x]Pixels[x][y] 一样慢,但您可以将所有指向位图每一行的指针存储一次,然后然后只使用它,这与访问您自己的 2D 数组相同。所以你真的只需要 bitmap->ScanLine[y] 的高度调用,用于在位图的任何调整大小或分配之后渲染整个图像......

    如果你有基于图 block 的场景,你可以在图 block 上使用这种方法而不是像这样的像素:

  3. 实地考察

    这也被认为是一种 vector 方法,但不需要碰撞检查。相反,每个物体都会产生排斥力,你离它越近,排斥力就越大,这被添加到牛顿/达朗贝尔物理驱动力中。当系数设置正确时,它将自行避免碰撞。这也用于自动放置项目等...有关更多信息,请参阅:

  4. 混合方法

    您可以将上述任何方法组合在一起,以更好地满足您的需求。例如参见:

关于c++ - 在 C++ Builder 中检测绘制线的窗口坐标的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43571042/

相关文章:

c++ - 另一个 'member declaration not found'

c++ - DirectShow - 获取视频帧

bitmap - Redis SETBIT、GETBIT、BITCOUNT 的用例?

delphi - TVirtualStringTree - 重置非可视节点和内存消耗

c++ - 从 GUI 在 Excel 中打开指定文件 - Borland C++

c++ - 声明变量时发生访问冲突

c++ - 如何将 Mercurial 标签嵌入到我的 C/C++ 代码中?

c++ - 在 C++ 中处理字符(没有 std::string)

c++ - 字符串- bool 比较 - 为什么?

java - 如何快速地将位图从一个 Activity 传递到另一个 Activity ?