使用moveto和lineto在窗口画布上绘制各种线条......
在运行时确定对象(如位图或图片控件)是否在"联系"中的最简单方法是什么? (相同的x,y坐标)与在窗帘画布上用lineto绘制的线条?
一个简单的例子就是一个球(位图或图片)"联系"一个绘制的边界和篮板...什么是最简单的方式来了解是否"联系"在对象,图片或位图与窗口上存在的任何行之间发生?
答案 0 :(得分:1)
如果我做对了,你想在移动时想要在圆形物体和线之间进行碰撞检测/避免。我知道有更多的选择...
矢量方法
你需要记住矢量形式中所有渲染的东西,所以你需要所有渲染的线条,对象等的列表......然后对于特定的对象循环通过所有其他的,并用矢量数学代数检查碰撞。就像检测边界框之间的交叉,然后检测特定的线/折线/多边形或者什么。
光栅方法
这更容易实现,有时甚至更快但更少精确(仅像素精度)。这个想法是用背景颜色清除对象的最后位置。然后检查将在新位置渲染的所有像素,如果不存在背景颜色,则不会发生折射,因此您可以渲染像素。如果存在任何非背景颜色,则在发生碰撞时再次将对象渲染到原始位置。
您还可以检查旧位置和新位置,并将物体放置在第一个非碰撞位置,这样您就可以靠近边缘......
这种方法需要快速像素访问,否则它会变得太慢。如果不使用GDI中的BitBlt,标准画布不允许这样做。幸运的是VCL GRaphics :: TBitmap具有ScanLine[]
属性,允许直接像素访问,如果正确使用则不会有任何性能损失。在我回答的其他问题中查看它的示例:
访问ScanLine[y][x]
与Pixels[x][y]
一样慢,但您可以将所有指针存储到位图的每一行,然后只使用它而不是访问您自己的2D数组。所以你真的只需要bitmap-> ScanLine[y]
的高度调用,用于在调整位图大小或分配后的整个图像渲染...
如果你有基于图块的场景,你可以在图块上使用这种方法而不是像这样的像素:
现场方法
这个也被认为是矢量方法,但不需要碰撞检查。相反,每个物体产生的排斥力越大,越接近牛顿/ D'Alembert物理驱动力。当系数设置得当时,它将避免自身的碰撞。这也用于自动放置物品等......有关详细信息,请参阅:
混合方法
您可以将上述任何方法结合在一起,以更好地满足您的需求。例如,见: