气泡---提高效率

Bubbles --- making more efficient

本文关键字:提高效率 气泡      更新时间:2023-10-16

我做了一个类似于气泡屏保的程序它工作正常,但有点慢并且是增加气泡的数量,看起来好像它卡住了

建议我应该怎么做,以增加速度,我制作的代码:

#include<dos.h>
#include<math.h>
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<stdlib.h>
#include<process.h>
#include<graphics.h>
void movement(int&,int&,int);
void bubbles(int,int,int,int);
void clearbubbles(int,int,int);

void main()
{
    int gdriver = DETECT,gmode;
    initgraph(&gdriver,&gmode,"C:\Turboc3\BGI");
    int x[10],y[10],r=40,d[10],i,j,k,l,c[10],n=10,t=100;
    randomize();
    // Initial Position, Direction & Color of Bubbles
    for(i=0;i<n;i++)
    {
        x[i]=random(getmaxx()-80)+41;
        y[i]=random(getmaxy()-80)+41;
        d[i] = random(8);
        c[i] = random(15)+1;
    }
    // Everything else
    for(i=0;i<=t;i++)   // Motiton of Bubbles
    {
        for(j=0;j<n;j++)        // Number of Bubbles
        {
            clearbubbles(x[j],y[j],r);
            // Checking Bubble Boundary Limits
            while(x[j] <= 1 || y[j] <= 1 || x[j] >= getmaxx()-1 || y[j] >= getmaxy()-1)
            {
                d[j] = random(8);
                movement(x[j],y[j],d[j]);
            }

            // Checking Collasion of Bubbles
            for(k=0;k<=n;k++)
            {
                clearbubbles(x[j],y[j],r);
                l = sqrt(pow(x[j]-x[k],2)+pow(y[j]-y[k],2));
                if(j != k)
                {
                    while(l <= 2*r)
                    {
                        d[j] = random(8);
                        movement(x[j],y[j],d[j]);
                        l = sqrt(pow(x[j]-x[k],2)+pow(y[j]-y[k],2));
                    }
                }
                movement(x[j],y[j],d[j]);
                bubbles(x[j],y[j],r,c[j]);
            }
        }
    }
    getch();
    closegraph();

}

void movement(int &x,int &y,int d)
{
    switch(d)
    {
        case 0: // Top Direction
            y = y - 1;
            break;
        case 1: // Top Right Direction
            x = x + 1;
            y = y - 1;
            break;
        case 2: // Right Direction
            x =x +1;
            break;
        case 3: // Bottom Right Direction
            x=x+1;
            y=y+1;
            break;
        case 4: // Bottom Direction
            y = y + 1;
            break;
        case 5: // Bottom Left Direction
            x = x-1;
            y=y+1;
            break;
        case 6: // Left Direction
            x=x-1;
            break;
        case 7: // Top Left Direction
            x=x-1;
            y=y-1;
            break;
    }
}
void bubbles(int x,int y,int r,int c)
{
    setcolor(c);
    circle(x,y,r);
}
void clearbubbles(int x,int y,int r)
{
    setcolor(BLACK);
    circle(x,y,r);
}

在所有建议之后,我对代码进行了一些更改但是,现在程序在一段时间后挂起,控件不会返回

我更改的部分:

// Checking Collasion of Bubbles
     for(k=j+1;k<n;k++)
     {
      clearbubbles(x[j],y[j],r);
      l = ((x[j]-x[k])*(x[j]-x[k]))+((y[j]-y[k])*(y[j]-y[k]));
       while(l <= 4*r*r)
       {
        d[j] = random(8);
        movement(x[j],y[j],d[j]);
        l = ((x[j]-x[k])*(x[j]-x[k]))+((y[j]-y[k])*(y[j]-y[k]));
       }
      movement(x[j],y[j],d[j]);
      bubbles(x[j],y[j],r,c[j]);
     }

你的 N^2 算法效率极低。它需要至少与气泡数量的平方成正比的时间,以检查碰撞。

"

边界检查"和"碰撞解决"算法也可能进入非生产性循环,因为它们依赖于随机运动来解决问题 - 而不是采取直接行动。

您还应该使用乘法而不是pow()来计算幂 2。效率存在巨大差异。

您可以

尝试使用函数来计算距离,并且/或者您可以认识到除了将其与 2 * r 进行比较之外,您不使用距离。这可以减少浮点sqrt和需求。

例如,在伪代码中:

const int TWO_R_SQUARED = r * r * 4;
int distanceSq (int dx, int dy) {
    return (dx * dx) + (dy * dy);
}

要修复它..边界/碰撞分辨率:

  1. 更改"边界分辨率"算法,仅将气泡夹在有效坐标内。单一动作,没有循环,不可能卡住。

  2. 以类似的方式更改"冲突解决"算法。在两个气泡之间选择一个距离矢量,将其扩展到长度 2*r,然后将气泡扩展到该点。(忽略二次冲突,它们将在下一次迭代中处理。再次,单一动作和不可能卡住。

但是,最重要的是,碰撞检测是最重要的。

  1. 更快的碰撞检测需要一种有效的方法来查找附近的气泡。理想情况下,这将是一个四叉树。https://en.wikipedia.org/wiki/Quadtree

  2. 如果你想快速伪造一些东西,你可以在大小2*r瓷砖上使用HashMap,并搜索给定气泡的9个周围瓷砖。2*r 距离内的任何气泡都必须在这些图块内,因此这至少可以让您快速减少子集。9 次哈希查找和 5-10 个气泡的成本,与 100 或数千个气泡比较的成本。

看:

  • https://en.wikipedia.org/wiki/Quadtree
  • http://conkerjo.wordpress.com/2009/06/13/spatial-hashing-implementation-for-fast-2d-collisions/
  • Java:存储无限游戏世界的坐标图的良好数据结构是什么?