Я делаю программу, где кружит круг и отскакивает границы экрана.
Я сделал четыре строки для каждой границы экрана
Круг движется по невидимой линии, которая пересекается с границей экрана. Проблема в том, что в этом примере я всегда получу 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;
}