我正在制作圆圈飞行和屏幕边框弹跳的程序。
我为屏幕的每个边框制作了四行
圆圈正在穿过与屏幕边界线相交的不可见线。问题是在这个例子中我将总是得到t = 1,因为它将与它相交的最后一行相交。所以问题是,我如何制作“if”以便它只与一个边界线相交,而不是与其中两个相交。
以下是我写的ifs,但它们没有按预期工作。
if (intersect(l2,n1)!=0){
tk=intersect(l2,n1);
}
else if (intersect(l2,n2)!=0){
tk=intersect(l2,n2);
}
else if (intersect(l2,n3)!=0){
tk=intersect(l2,n3);
}
else if (intersect(l2,n4)!=0){
tk=intersect(l2,n4);
}
这是交叉函数:
double intersect(Line l, Line n){
double r1x=l.a.x, v1x=l.b.x-l.a.x;
double r1y=l.a.y, v1y=l.b.y-l.a.y;
double r2x=n.a.x, v2x=n.b.x-n.a.x;
double r2y=n.a.y, v2y=n.b.y-n.a.y;
double a1=v1x, a2=v1y, b1=-v2x, b2=-v2y;
double c1=r2x-r1x, c2=r2y-r1y;
double tl=(c1*b2-b1*c2)/(a1*b2-b1*a2);
return tl;
}
以下是它发生的功能:
void draw_picture(Canvas & canvas) {
SDL_Surface* screen = SDL_SetVideoMode( WINDOW_WIDTH, WINDOW_HEIGHT, 0,
SDL_HWSURFACE | SDL_DOUBLEBUF );
PairXY a(200,400);
PairXY b(400, 0);
int o=20;
Line l(a,b);
PairXY c(0,0);
PairXY d(640, 0);
Line n1 (c,d);
draw_line(n1, canvas);
PairXY e(640, 0);
PairXY f(640 , 480);
Line n2 (e,f);
draw_line(n2, canvas);
PairXY g(0,0);
PairXY h(0, 480);
Line n3 (g,h);
draw_line(n3, canvas);
PairXY j(0,480);
PairXY k(640, 480);
Line n4 (j,k);
draw_line(n4, canvas);
Circle cir(a,o);
draw_circle(cir, canvas);
double tk;
for (int i=3;i--;i>0){
Line l2=l;
double t=0;
if (intersect(l2,n1)!=0){
tk=intersect(l2,n1);
}
else if (intersect(l2,n2)!=0){
tk=intersect(l2,n2);
}
else if (intersect(l2,n3)!=0){
tk=intersect(l2,n3);
}
else if (intersect(l2,n4)!=0){
tk=intersect(l2,n4);
}
while (t<tk){
l.a = l.a + (l.b - l.a) * t;
Circle cir1(l.a,o);
draw_circle(cir1, canvas);
SDL_Flip(screen);
SDL_Delay(2);
draw_bcircle(cir1, canvas);
t=t+0.0001;
}
l2=orto_line(l2,l.a);
l=l2;
}
答案 0 :(得分:0)
我猜你应该找到你的线与边界相交的所有时间,如:
tk1 = intersect(l2,n1);
tk2 = intersect(l2,n2);
tk3 = intersect(l2,n3);
tk4 = intersect(l2,n4);
然后找到大于t的最小tk:
double min = (very big number);
if (tk1 >= t && tk1 < min)
min = tk1;
if (tk2 >= t && tk2 < min)
min = tk2;
if (tk3 >= t && tk3 < min)
min = tk3;
if (tk4 >= t && tk4 < min)
min = tk4;
while (t < min)
{
...
}
因此,您可以找到下一个圆圈到达边界的时间。
我强烈建议将数组用于n和tk。