Линия, пересекающаяся с границами экрана - PullRequest
0 голосов
/ 06 ноября 2011

Я делаю программу, где кружит круг и отскакивает границы экрана.

Я сделал четыре строки для каждой границы экрана

Круг движется по невидимой линии, которая пересекается с границей экрана. Проблема в том, что в этом примере я всегда получу t = 1, потому что он будет пересекаться с последней пересеченной линией. Итак, вопрос в том, как сделать «если», чтобы оно пересекалось только с одной границей, а не с двумя из них.

Вот если я написал, но они не работают как задумано.

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 голосов
/ 06 ноября 2011

Полагаю, вы должны найти все моменты, когда ваша линия пересекается с границами, например:

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.

...