gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:10:40 28 4
gpt4 key购买 nike

使用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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com