有没有办法在Java哈希映射中检测冲突?任何人都可以指出可能发生大量碰撞的情况.当然,如果你覆盖一个对象的哈希码并简单地返回一个常量值,肯定会发生冲突.我不是在谈论那个.我想知道前面提到的其他所有情况都会发生大量的碰撞无需修改默认的哈希码实现.
在统一中,我有一个应该击球的球拍,并且球拍由鼠标直接控制,即使用鼠标轴移动球棒并使用transform.translate()函数移动球拍.
我预计Unity3d的物理不能直接用鼠标正确地转换球拍的动作并相应地击球,我必须写一些自定义的东西,结果证明是真的.
但是当球拍移动时球的碰撞没有被正确检测到.当它静止时,一切都很好,球就像我喜欢的那样.
现在我开始编写一个自定义物理脚本(我使用C#编写脚本),其中我将4个长度为0.6F的光线投影附加到球上,并且在做了一些复杂的矢量计算后,计算球击中球后的速度,并使用rigidbody.velocity = calculateVelocity()将其直接应用于球的速度.现在,当球拍没有移动时它再次正常工作,但是当我移动球拍时却没有.确切的(症状)问题是:
使用内置物理和碰撞检测:当球拍移动时,球有时直接穿过球拍,有时,它会减速(达到令人难以置信的水平).
使用我的脚本来计算速度:问题是一样的,但是当我打印对撞机(球拍)的法线时,它可以让我识别出什么是错误的.它有时给出正常的法线,有时给出法线向量的负值,这意味着它直接穿过顶面并用对撞机底部(球拍)检测击中.
我尝试过的事情:
增加对撞机的尺寸(它适用于球拍上较宽的框架对撞机,但显然球从球拍离开相当远的距离,我自己的脚本在这里工作,默认物理在球拍移动时给出奇怪的结果)总之,我没有得到我想要的现实.
将固定时间戳减少到0.001,这显着改善了事情,但仍然离我想要的结果非常远,并且球再次经常挑选球的错误一侧.
将碰撞检测更改为连续动态.哪个也没改善.
除了在碰撞中挑错的一方之外,我观察到的另一个问题是,在球拍弹跳后,球移动但是球拍移动得更快,而不是以完整的弧线或线移动,不知何故出现在前面球,导致两次安打.这是一个基于可见内容的猜想.
同样很明显,球拍的"运动"方面并没有被Unity3d的内置物理学所读取,当球拍使用鼠标击球时会导致奇怪的行为.
我卡住了,我不知道从哪里搬到这里.请告诉我,我做错了什么.
我正在实现我的碰撞检测库的第二个版本.这个特殊的库应该处理轴对齐的框(AABB).我想在这个版本上开始跟踪快速移动的盒子.我认为计算两者之间的Minkowski差异将是一个很好的起点.
当我说Minkowsky差异时,我指的是碰撞检测傻瓜中描述的几何操作.
问题是:那里描述的过程和算法非常通用.它使用相当高级的矢量数学来计算任意两个多边形的MD.
就我而言,我有AABB.鉴于它们的数字简单性,到目前为止库还没有需要Vector概念 - 例如,我不需要计算单点产品.如果可能的话,我希望它保持这种状态.
所以我的问题是:
给出两个AABB的顶部,左侧,宽度和高度({t1,l1,w1,h1}和{t2,l2,w2,h2}),我如何计算它们的MD,(如果可能的话,没有得到矢量数学)?
只需在碰撞检测傻瓜上玩小工具,我几乎可以肯定MD宽度将是一个宽度w1+w2和高度的盒子h1+h2.但我不知道如何计算它的顶角或左角.
我正在使用自定义绘图/ 2D动画,我正在试图弄清楚如何检测移动物体何时与地图中的墙碰撞.用户在键盘上按住箭头键移动对象,地图存储为点的数组结构.地图中的墙壁可以成角度,但没有弯曲的墙壁.
FMap: TMap;在下面的代码中使用地图结构(),在DoMove属性中,如何检测对象是否与地图中的任何墙碰撞并阻止其移动?在DoMove,我需要阅读FMap(参考DrawMap看看如何FMap工作)并以某种方式确定对象是否接近任何墙并停止它.
我可以做一个双X/Y循环迭代每个映射的每个部分中每两个点之间的每个可能的像素,但我已经知道这将是很重的,考虑到只要对象移动就会快速调用此过程.
我想到了在物体移动方向上读取像素颜色,如果有任何黑色(来自地图线),请将其视为墙.但最终会有更多自定义绘制背景,因此读取像素颜色将无法正常工作.

uMain.pas
unit uMain;
interface
uses
Winapi.Windows, Winapi.Messages,
System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;
const
//Window client size
MAP_WIDTH = 500;
MAP_HEIGHT = 500;
type
TKeyStates = Array[0..255] of Bool;
TPoints = Array of TPoint;
TMap = Array of TPoints;
TForm1 = class(TForm)
Tmr: TTimer;
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure …Run Code Online (Sandbox Code Playgroud) 实际上我试图在下面的代码中检测到矩形与圆形的碰撞: -
function checkCollision() {
//checking of the Collision
if (ry + rh > cy - radius && rx + rw > cx - radius && rx + rw < cx + radius ) {
dy = -dy;
}
}
Run Code Online (Sandbox Code Playgroud)
这也是我的代码的一部分: -
var rx = 50; //distance from the x-axis of the Rect.
var ry = 50; //distance from the y-axis of the Rect.
var rw = 80; //width of the Rect
var rh = 30; //Height of the Rect. …Run Code Online (Sandbox Code Playgroud) 我已经在这里工作了2-3个星期,我仍然无法进行适当的碰撞检测.我用矩形创建了一个迷宫.我希望我的对象(在矩形中)在我的对象与任何墙碰撞并且能够移动到任何地方(或向下滑动墙)时停止.我的墙(矩形)具有负坐标,如下所示:
shapeRenderer.rect(0.9f, 12, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); //NORTH
shapeRenderer.rect(1, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // WEST
shapeRenderer.rect(2, 12, 0, -1.05f, Color.RED, Color.RED, Color.RED, Color.RED); // EAST
shapeRenderer.rect(0.9f, 11, 1.15f, 0, Color.RED, Color.RED, Color.RED, Color.RED); // SOUTH
Run Code Online (Sandbox Code Playgroud)
我目前正在使用我在SO中找到的重叠方法.这是我的CollisionManager类中的方法:
private boolean overlaps (Rectangle collision, Rectangle wall) {
return Math.min(collision.x, collision.x + collision.width)
< Math.max(wall.x, wall.x + wall.width)
&& Math.max(collision.x, collision.x + collision.width)
> Math.min(wall.x, wall.x + wall.width)
&& Math.min(collision.y, collision.y + collision.height)
< Math.max(wall.y, wall.y + wall.height)
&& …Run Code Online (Sandbox Code Playgroud) 在Scratch中,感知类别中存在称为触摸的条件,其可以具有边缘作为参数.
鉴于条件返回true,我如何判断哪个边被触摸(即场景的顶部,底部,左侧或右侧边缘)?
或者:如何分辨场景的尺寸?我已经算出位置(x = 0,y = 0)位于场景的中间.四个角点在哪里?
检测红色矩形是否与黑色多边形重叠的最佳方法是什么?请参考此图片:

我正在尝试寻找其他注册冲突的方法(除了OnCollisionEnter()和之外OnCollisionExit()).我目前正在使用Physics.OverlapBox(),但我需要有关碰撞的更多信息; 即,正常,点.
我可以使用Physics.BoxCast(),但问题是它移动一个给定距离的盒子,使用maxDistance = 0f将无法工作.
我需要一种检查碰撞类似的方法,Physics.OverlapBox()除了它还会返回有关转换中所有碰撞的信息.
任何帮助表示赞赏.谢谢.
java ×2
math ×2
algorithm ×1
animation ×1
c# ×1
canvas ×1
collections ×1
collision ×1
delphi ×1
delphi-xe2 ×1
drawing ×1
game-physics ×1
geometry ×1
hash ×1
javascript ×1
libgdx ×1
maze ×1
mit-scratch ×1