我已经创建了一个程序,绘制一个挥舞的旗帜,我想添加一个功能,将创建新的波选定的像素,但我不能让它开始在我想让它开始,甚至使旗帜停止挥舞(可能是因为同步的罪恶)。
这是我的显示函数。
const int W = 800;
const int H = 600;
// simulates Frame Buffer
unsigned char pixels[H][W][3] = { 0 }; // 3 is for RGB
void display()
{
glClear(GL_COLOR_BUFFER_BIT); // clean frame buffer
createFlag();
int i, j;
double dist;
offset += 0.25;
for (i = 0; i < H; i++)
for (j = 0; j < W; j++)
{
dist = sqrt(pow(i + H / 2.0, 2) + pow(j + W / 2.0, 2));
pixels[i][j][0] += 135 + 55 * (1 + 1 * sin(dist / 25 - offset)) / 2; // red
pixels[i][j][1] += 135 + 85 * (1 + 1 * sin(dist / 25 - offset)) / 2; // green
pixels[i][j][2] += 135 + 105 * (1 + 1 * sin(dist / 25 - offset)) / 2; // blue
}
// draws the matrix pixels
glDrawPixels(W, H, GL_RGB, GL_UNSIGNED_BYTE, pixels);
glutSwapBuffers(); // show all
}
这是我的鼠标功能。
void mouse(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
{
double dist;
offset += 0.1;
for (y = 0; y < H; y++)
for (x = 0; x < W; x++)
{
dist = sqrt(pow(H/2.0 -(H - y), 2) + pow(W/2.0 -x, 2)); //problem is prob. here
pixels[y][x][0] += 135+ 55 * (1 + 1 * sin(dist / 50.0 - offset)) / 2; // red
pixels[y][x][1] += 135+ 85 * (1 + 1 * sin(dist / 50.0 - offset)) / 2; // green
pixels[y][x][2] += 135+105 * (1 + 1 * sin(dist / 50.0 - offset)) / 2; // blue
if (offset < 0.3)
offset += 0.05;
}
}
}
1条答案
按热度按时间px9o7tmv1#
以下是我看到的几点:
x
和y
,它们是你点击鼠标的位置,而是创建了局部变量x
和y
。如果你想从你点击的像素开始一个波,你必须把你的dist
居中到这个点,所以代码的想法可以是(受GLUT mouse button down的启发):dist = sqrt(pow(i + H / 2.0, 2) + pow(j + W / 2.0, 2));
这是在(-W/2.0, -H/2.0)
的中心,这是你想要的吗?(也许是的,只是想确保,如果你想模拟一些风,你可以设置风的原点在你想要的地方,这是你在这里做的)int i, j;
没有用(只是为了清除一些代码)这是我自己的一些评论,这段代码可能不会是你的最后一段。如果我误解了你的目标,或者我写的东西不清楚,请告诉我。