使用moveto和lineto在窗口 Canvas 上绘制各种线条...
在运行时确定对象(如位图或图片控件)是否与使用 lineto 绘制的线条“接触”(相同的 x,y 坐标)的最简单方法是什么在窗口 Canvas 上?
一个简单的例子是一个球(位图或图片)“接触”绘制的边框并反弹......了解对象、图片或位图与任何存在的线之间是否发生“接触”的最简单方法是什么在 window 上?
最佳答案
如果我做对了,您希望在移动时检测/避免圆形物体和直线之间的碰撞。我知道有更多选择可以做到这一点......
vector 方法
你还需要记住所有渲染的 vector 形式的东西,所以你需要所有渲染线、对象等的列表……然后对于特定的对象循环遍历所有其他对象,并用 vector 数学代数地检查碰撞。比如检测边界框之间的交点,然后与特定的线/折线/多边形或其他任何东西相交。
光栅方法
这更容易实现,有时甚至更快但不太准确(仅像素精度)。这个想法是用背景颜色清除对象的最后位置。然后检查将在新位置渲染的所有像素,如果不存在背景颜色,则不会发生碰撞,因此您可以渲染像素。如果存在任何非背景颜色,则在发生碰撞时再次在原始位置渲染对象。
您还可以在新旧位置之间进行检查,并将对象放在第一个非碰撞位置,这样您就更靠近边缘...
这种方法需要快速的像素访问,否则会太慢。如果不使用来自 GDI 的 BitBlt,标准 Canvas 不允许这样做。幸运的是,VCL GRaphics::TBitmap 具有
ScanLine[]
属性,如果使用得当,可以直接访问像素而不会影响性能。请参阅我回答的其他问题中的示例:访问
ScanLine[y][x]
和Pixels[x][y]
一样慢,但您可以将所有指向位图每一行的指针存储一次,然后然后只使用它,这与访问您自己的 2D 数组相同。所以你真的只需要 bitmap->ScanLine[y]
的高度调用,用于在位图的任何调整大小或分配之后渲染整个图像......如果你有基于图 block 的场景,你可以在图 block 上使用这种方法而不是像这样的像素:
实地考察
这也被认为是一种 vector 方法,但不需要碰撞检查。相反,每个物体都会产生排斥力,你离它越近,排斥力就越大,这被添加到牛顿/达朗贝尔物理驱动力中。当系数设置正确时,它将自行避免碰撞。这也用于自动放置项目等...有关更多信息,请参阅:
混合方法
您可以将上述任何方法组合在一起,以更好地满足您的需求。例如参见:
关于c++ - 在 C++ Builder 中检测绘制线的窗口坐标的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43571042/