与屏幕边界相交的线
Line intersecting with screen borders
我正在制作一个程序,其中圆圈在屏幕边界飞行和弹跳。
我为屏幕的每个边框设置了四行
圆圈正在穿过与屏幕边框线相交的不可见线。问题是,在这个例子中,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使用数组
相关文章:
- std::当在256字节边界上写入整数时,流的奇怪行为
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- 使用不变量来确定二分搜索中的边界条件
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- Winapi:屏幕截图未显示在窗口中
- 如何在快板的屏幕中显示子位图的绘制?
- 在 64 位边界上对齐C++结构数组?
- std::数组边界检查如何工作?
- CGAL:如何创建填充边界曲线的曲面网格?
- 按回车键后输出屏幕关闭
- 要在屏幕上绘制一些小瓷砖,我应该使用 QQuickItem 还是 QQuickPaintedItem?
- SFML 向下移动时如何围绕屏幕中心旋转?
- 在 c++ 中是否允许创建具有运行时边界的数组?
- 截取屏幕截图后程序卡住
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- OpenGL 检查屏幕边界
- 与屏幕边界相交的线