线与屏幕边框相交

时间:2011-11-06 14:30:38

标签: c++ line sdl

我正在制作圆圈飞行和屏幕边框弹跳的程序。

我为屏幕的每个边框制作了四行

圆圈正在穿过与屏幕边界线相交的不可见线。问题是在这个例子中我将总是得到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;
}

1 个答案:

答案 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。