我想编写一个程序,用于在2D平面上模拟高数(N = 1000 - 10 ^ 5和更多)物体(圆)的运动.所有的身体都有相同的尺寸,它们之间唯一的相互作用是弹性碰撞.
我想得到类似的东西
但是规模越大,飞机的球越多,填充越密集(这里不是气体模型,而是沸水模型).
所以我想要一种快速的检测方法,球号i在2*半径+ V*delta_t距离内的路径上确实有任何其他球.我不想为每个i球完全搜索与N球的碰撞.(此搜索将是N ^ 2.)
PS对不起循环动画GIF.只需按Esc即可停止它.(不适用于Chrome).
在游戏程序的上下文中,我有一个移动的圆圈和一个固定的线段.该段可以具有任意大小和方向.

我在尝试计算时遇到困难:
我的碰撞检测遇到了一个奇怪的问题.我正在使用Update方法移动播放器(我不想使用FixedUpdate,因为这会产生不希望的怪异动作).固定的时间步长设置为默认值0.02(我尝试使用时间设置播放,但这也不起作用).我将两个物体的刚体的碰撞检测设置为"连续动态".此外,我将目标帧速率设置为300,并且没有改变任何内容......
当帧速率较低或设备本身较慢时,碰撞检测并不总是有效.玩家可以很容易地穿过它应该碰撞的物体,尽管有时它不会碰撞.
请告诉我我可以做些什么来解决这个问题,因为我发布了一个游戏,许多用户正在报告这个(严重的)错误.感谢您的支持.
这是应该发生的事情:
这是实际发生的事情:
(正如你所看到的,立方体从墙上走到另一边)
当用户释放鼠标按钮时我移动播放器:
脚本1:
public Script2 Jumper;
public float TimeToJump;
public void Update()
{
if (Input.GetMouseButtonUp(0))
{
StartCoroutine (Delay (1f/50f)); //Don't mind the time.
}
}
IEnumerator Delay(float waitTime)
{
yield return new WaitForSeconds (waitTime);
if (Jumper != null)
{
Jumper.SetVelocityToJump (gameObject, TimeToJump);
}
}
Run Code Online (Sandbox Code Playgroud)
脚本2附加到播放器(立方体):
public class Script2 : MonoBehaviour {
GameObject target;
private float timeToJump;
public bool isJumping = false;
public void SetVelocityToJump(GameObject goToJumpTo, float timeToJump)
{
StartCoroutine(jumpAndFollow(goToJumpTo, timeToJump));
this.timeToJump = timeToJump;
this.target = …Run Code Online (Sandbox Code Playgroud) 我编写了一个动画(在python中),用于三个沙滩球在屏幕上反弹.我现在希望让它们全部碰撞,并能够互相反弹.我真的很感激可以提供任何帮助.
import pygame
import random
import sys
class Ball:
def __init__(self,X,Y):
self.velocity = [1,1]
self.ball_image = pygame.image.load ('Beachball.jpg'). convert()
self.ball_boundary = self.ball_image.get_rect (center=(X,Y))
self.sound = pygame.mixer.Sound ('Thump.wav')
self.rect = self.ball_image.get_rect (center=(X,Y))
if __name__ =='__main__':
width = 800
height = 600
background_colour = 0,0,0
pygame.init()
window = pygame.display.set_mode((width, height))
pygame.display.set_caption("Bouncing Ball animation")
num_balls = 3
ball_list = []
for number in range(num_balls):
ball_list.append( Ball(random.randint(10, (width - 10)),random.randint(10, (height - 10))) )
while True:
for event in pygame.event.get():
print event
if event.type …Run Code Online (Sandbox Code Playgroud) 这是半编程,半数学问题.
我有一些盒子,代表四个角点.它们是真正的矩形,是两组平行线的交点,每组中的每一行都与另一组中的两条直线成直角(我们很清楚.)
对于任何一组n个框,我怎样才能有效地计算移动它们的位置(最小距离),以便它们不会相互重叠?
我在这里用javascript工作.这是数据:
//an array of indefinite length of boxes
//boxes represented as arrays of four points
//points represented as arrays of two things, an x and a y, measured in
//pixels from the upper left corner
var boxes = [[[504.36100124308336,110.58685958804978],[916.3610012430834,110.58685958804978],[916.3610012430834,149.58685958804978],[504.36100124308336,149.58685958804978]],[[504.4114378910622,312.3334473005064],[554.4114378910622,312.3334473005064],[554.4114378910622,396.3334473005064],[504.4114378910622,396.3334473005064]],[[479.4272869132357,343.82042608058134],[516.4272869132358,343.82042608058134],[516.4272869132358,427.82042608058134],[479.4272869132357,427.82042608058134]],[[345.0558946408693,400.12499171846],[632.0558946408694,400.12499171846],[632.0558946408694,439.12499171846],[345.0558946408693,439.12499171846]],[[164.54073131913765,374.02074227992966],[264.54073131913765,374.02074227992966],[264.54073131913765,428.02074227992966],[164.54073131913765,428.02074227992966]],[[89.76601656567325,257.7956256799442],[176.76601656567325,257.7956256799442],[176.76601656567325,311.7956256799442],[89.76601656567325,311.7956256799442]],[[60.711850703535845,103.10558195262593],[185.71185070353584,103.10558195262593],[185.71185070353584,157.10558195262593],[60.711850703535845,157.10558195262593]],[[169.5240557746245,23.743626531766495],[231.5240557746245,23.743626531766495],[231.5240557746245,92.7436265317665],[169.5240557746245,92.7436265317665]],[[241.6776988694169,24.30106373152889],[278.6776988694169,24.30106373152889],[278.6776988694169,63.30106373152889],[241.6776988694169,63.30106373152889]],[[272.7734457459479,15.53275710947554],[305.7734457459479,15.53275710947554],[305.7734457459479,54.53275710947554],[272.7734457459479,54.53275710947554]],[[304.2905062327675,-3.9599943474960035],[341.2905062327675,-3.9599943474960035],[341.2905062327675,50.04000565250399],[304.2905062327675,50.04000565250399]],[[334.86335590542114,12.526345270766143],[367.86335590542114,12.526345270766143],[367.86335590542114,51.52634527076614],[334.86335590542114,51.52634527076614]],[[504.36100124308336,110.58685958804978],[916.3610012430834,110.58685958804978],[916.3610012430834,149.58685958804978],[504.36100124308336,149.58685958804978]],[[504.4114378910622,312.3334473005064],[554.4114378910622,312.3334473005064],[554.4114378910622,396.3334473005064],[504.4114378910622,396.3334473005064]],[[479.4272869132357,343.82042608058134],[516.4272869132358,343.82042608058134],[516.4272869132358,427.82042608058134],[479.4272869132357,427.82042608058134]],[[345.0558946408693,400.12499171846],[632.0558946408694,400.12499171846],[632.0558946408694,439.12499171846],[345.0558946408693,439.12499171846]],[[164.54073131913765,374.02074227992966],[264.54073131913765,374.02074227992966],[264.54073131913765,428.02074227992966],[164.54073131913765,428.02074227992966]],[[89.76601656567325,257.7956256799442],[176.76601656567325,257.7956256799442],[176.76601656567325,311.7956256799442],[89.76601656567325,311.7956256799442]],[[60.711850703535845,103.10558195262593],[185.71185070353584,103.10558195262593],[185.71185070353584,157.10558195262593],[60.711850703535845,157.10558195262593]],[[169.5240557746245,23.743626531766495],[231.5240557746245,23.743626531766495],[231.5240557746245,92.7436265317665],[169.5240557746245,92.7436265317665]],[[241.6776988694169,24.30106373152889],[278.6776988694169,24.30106373152889],[278.6776988694169,63.30106373152889],[241.6776988694169,63.30106373152889]],[[272.7734457459479,15.53275710947554],[305.7734457459479,15.53275710947554],[305.7734457459479,54.53275710947554],[272.7734457459479,54.53275710947554]],[[304.2905062327675,-3.9599943474960035],[341.2905062327675,-3.9599943474960035],[341.2905062327675,50.04000565250399],[304.2905062327675,50.04000565250399]],[[334.86335590542114,12.526345270766143],[367.86335590542114,12.526345270766143],[367.86335590542114,51.52634527076614],[334.86335590542114,51.52634527076614]]]
Run Code Online (Sandbox Code Playgroud)
我正在使用需要碰撞检测的画布在Javascript中构建游戏,在这种情况下,如果玩家精灵击中一个盒子,则不允许玩家通过该框.
我有一个名为的全局数组blockList,它包含绘制到画布的所有框.它看起来像这样:
var blockList = [[50, 400, 100, 100]];
Run Code Online (Sandbox Code Playgroud)
他们被这样的画布所吸引:
c.fillRect(blockList[0][0], blockList[0][1], blockList[0][2], blockList[0][3]);
Run Code Online (Sandbox Code Playgroud)
我还有一个玩家对象,它有一个更新方法和一个绘制方法.更新根据键盘输入等设置播放器的位置,主游戏循环使用绘制将玩家绘制到画布.玩家被画成这样:
this.draw = function(timestamp) {
if(this.state == "idle") {
c.drawImage(this.idleSprite, this.idleSprite.frameWidth * this.idleSprite.frameCount, 0, this.idleSprite.frameWidth, this.idleSprite.frameHeight, this.xpos, this.ypos, this.idleSprite.frameWidth, this.idleSprite.frameHeight);
if(timestamp - this.lastDraw > this.idleSprite.updateInterval) {
this.lastDraw = timestamp;
if(this.idleSprite.frameCount < this.idleSprite.frames - 1) { this.idleSprite.frameCount++; } else { this.idleSprite.frameCount = 0; }
}
} else if(this.state == "running") {
var height = 0;
if(this.facing == "left") { height = 37; }
c.drawImage(this.runningSprite, this.runningSprite.frameWidth …Run Code Online (Sandbox Code Playgroud) 如何测试三角形和正方形是否相互交叉?
当我们知道它是方形而不是矩形时,有没有什么方法可以优化它?此外,方形是轴对齐的,这样可以提高性能吗?
或者我应该将正方形分成三角形,并进行两次三角形 - 三角形相交检查?
编辑:澄清:我正试图检查这两个形状是否以任何方式相互重叠.所以三角形可以在正方形内,正方形可以在三角形内部,并且它也应该返回true.
我正在开发一款游戏,让我们说玩家在位置x = 100,y = 100并且爆炸半径为100个单位时放置炸弹......我很容易在游戏中找到所有"项目"被爆炸的炸弹击中(只需要检查他们与炸弹的距离是否低于100).
但现在我想考虑到我在游戏中遇到的障碍,障碍物是正方形,总是64*64像素,总是与轴对齐(不旋转)..我想知道一个项目是否"隐藏"背后知道他没被击中的障碍......
这样的事情:
右边的家伙没有被击中,但是底部的家伙被打了,我把灰色打到了打击区域,绿色的区域被隐藏了......
我的想法是:1.找到的所有项目在现场看到,从炸弹的距离越低则100 2.找到场景中的所有障碍,从炸弹的距离越低则100.3.计算从线炸弹中心的物品..然后检查线是否与任何障碍物相交,如果没有......你被击中了.
最后,问题1.有没有人有更好的主意?2.有免费的开源c#兼容引擎可以帮助我吗?Box2d可以帮到我吗?
谢谢
math collision-detection game-physics computational-geometry
我实现了一个检测两个形状之间碰撞的函数,以及另一个在检测到碰撞时将dragBound限制为边框的函数,以实现捕捉功能,然后添加到Kinetic.Group.所以实际上我将放置目标限制为现有矩形的边界.
这是一个明确查看我的问题的方法:http://jsfiddle.net/4Y87X/6/
当width = height时,这个逻辑适用于大矩形.但是,当我拖动小灰色矩形(代表我项目中的一个窗口)时,仅在大矩形的右侧和顶部检测到碰撞,未检测到左侧和底部!这是由于DragBoundWindow方法中的一些数学方程吗?
如果有人能找到错误,请?
代码:
var stage = new Kinetic.Stage({
container: "container",
width: 900,
height: 600
});
var leftLayer = new Kinetic.Layer({
x:0,
y:0,
id: 'leftLayer',
width:250,
height:600
});
var leftBackground = new Kinetic.Rect({
width: 250,
height: 600,
stroke: "red"
});
leftLayer.add(leftBackground);
stage.add(leftLayer);
var rightLayer = new Kinetic.Layer({
x: 280,
y:0,
id: 'rightLayer',
width:600,
height:600
});
var rightBackground = new Kinetic.Rect({
x: 0,
y: 0,
width: 600,
height: 600, …Run Code Online (Sandbox Code Playgroud) 我正在制作一个游戏,玩家必须使用碗来接住掉落的物品。我有一些列表中物品的图像和一个用于捕捉物品的碗的图像。如果项目到达边界(底部边缘),它们会继续下降并重置到屏幕顶部。我完成了这个允许物品掉落的逻辑,但我不知道如何检测碗和物品之间何时发生碰撞。
我的代码:
import math
import pygame
import random
pygame.init()
display_width = 800
display_height = 600
game_display = pygame.display.set_mode((display_width, display_height))
clock = pygame.time.Clock()
pygame.display.set_caption("Catch the Ball")
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 255, 0)
player_img = pygame.image.load("Images/soup.png")
thing_imgs = [pygame.image.load('Images/muffin.png'), pygame.image.load('Images/dessert.png'),
pygame.image.load('Images/cheese.png'), pygame.image.load('Images/fruit.png')]
def player(x, y):
game_display.blit(player_img, (x, y))
def things(x, y, img):
game_display.blit(img, (x, y))
def game_loop():
running = True
x = display_width * 0.45
y = display_height …Run Code Online (Sandbox Code Playgroud) geometry ×2
javascript ×2
math ×2
python ×2
2d ×1
algorithm ×1
c# ×1
c++ ×1
canvas ×1
game-physics ×1
intersection ×1
kineticjs ×1
modeling ×1
performance ×1
pygame ×1