与屏幕边界相交的线

Line intersecting with screen borders

本文关键字:屏幕 边界      更新时间:2023-10-16

我正在制作一个程序,其中圆圈在屏幕边界飞行和弹跳。

我为屏幕的每个边框设置了四行

圆圈正在穿过与屏幕边框线相交的不可见线。问题是,在这个例子中,i总是得到t=1,因为它与上一条直线相交。问题是,如何让"if"只与一条边线相交,而不是两条。

这是我写的if,但它们并没有像预期的那样工作。

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;
}

我想你应该找到所有你的线与边框相交的时间:

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使用数组