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

问题描述 投票:0回答:1

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

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

一个简单的例子是一个球(位图或图片)“联系”绘制的边框和反弹...什么是最简单的方法来了解对象,图片或位图与窗口上存在的任何行之间是否发生“接触” ?

c++ bitmap c++builder
1个回答
1
投票

如果我做对了,你想要在移动时在圆形物体和线之间进行碰撞检测/避免。有更多的选择,我知道...

  1. 矢量方法 你需要记住矢量形式的所有渲染的东西,所以你需要所有渲染的线条,对象等的列表...然后对于特定的对象循环通过所有其他的,并用矢量数学代数检查碰撞。就像检测边界框之间的交叉,然后检测特定的线/折线/多边形或者什么。
  2. 光栅方法 这更容易实现,有时甚至更快但更少精确(仅像素精度)。这个想法是用背景颜色清除对象的最后位置。然后检查将在新位置渲染的所有像素,如果不存在背景颜色,则不会发生折射,因此您可以渲染像素。如果存在任何非背景颜色,则在发生碰撞时再次将对象渲染到原始位置。 您还可以检查旧位置和新位置,并将对象放在第一个非碰撞位置,这样您就可以更接近边缘了... 这种方法需要快速像素访问,否则它会变得太慢。如果不使用GDI中的BitBlt,标准画布不允许这样做。幸运的是VCL GRaphics :: TBitmap具有ScanLine[]属性,允许直接像素访问,如果正确使用,不会有任何性能损失。在我回答的其他问题中查看它的示例: bitmap rotate using direct pixel access 访问ScanLine[y][x]Pixels[x][y]一样慢,但是你可以将所有指针存储到位图的每一行,然后只使用它而不是访问你自己的2D数组。所以你真的只需要位图 - >在任何调整大小或位图分配后,ScanLine[y]的高度调用用于整个图像渲染...... 如果您有基于图块的场景,您可以在图块上使用此方法而不是像这样的像素: What is the best way to move an object on the screen?,但它在asm ...
  3. 现场方法 这个也被认为是矢量方法,但不需要碰撞检查。相反,每个物体产生的排斥力越大,越接近牛顿/ D'Alembert物理驱动力。当系数设置得当时,它将避免自身的碰撞。这也用于自动放置物品等...有关详细信息,请参阅: How to implement a constraint solver for 2-D geometry?
  4. 混合方法 您可以将上述任何方法结合在一起,以更好地满足您的需求。例如见: Path generation for non-intersecting disc movement on a plane
© www.soinside.com 2019 - 2024. All rights reserved.