2011-11-06 92 views
0

我正在制作圈子正在飞行和屏幕边框弹跳的程序。与屏幕边界相交的线条

我制成四行屏幕

圈通过与屏幕边界线相交无形的线移动的每个边界。问题在于,在这个例子中,我将总是得到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

我想你应该找到所有符合像边界相交的次数:

tk1 = intersect(l2,n1); 
tk2 = intersect(l2,n2); 
tk3 = intersect(l2,n3); 
tk4 = intersect(l2,n4); 

然后找到最低TK的的是大于T:

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数组。

相关问题