- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前我拥有所有需要的工具,除了 Vectors 和检查生物是否在实际三角形内。如果您想了解更多详细信息,请查看所附图片。不用担心圆圈,我已经知道了。
目前我的代码是这样的:
public void cleaveCone(Player damager, LivingEntity victim, int level) {
for(Entity lentity : damager.getNearbyEntities(3, 2, 3)) {
if(!(lentity instanceof LivingEntity)) continue;
LivingEntity entity = (LivingEntity) lentity;
}
}
目前我需要三角形的 3 个 vector ,我需要检查它们是否在三角形内,圆圈是否已经被覆盖,在代码中,僵尸将是实体,而玩家将是破坏者。
最佳答案
要获得三角形的三个坐标或顶点,您可以使用一些三角函数和玩家的偏航
。根据您的图像,三角形的一个顶点是玩家的 Location
。三角形在该点的内角
和长度
(定义从玩家突出的三角形两侧的长度)定义了整个三角形。当这两个值都定义好后,我们就可以找到三角形剩下的两个顶点的坐标了。这是一个粗略的草图:
如何获取两个顶点的 Location
的示例:
double angle = 90; // An example angle of 90 degrees
double length = 5; // An example length of 5
Location v1 = player.getLocation(); // The first vertex of the triangle, the player's location
double yaw = v1.getYaw(); // The player's yaw (in degrees) between 0º and 360º
World world = player.getWorld(); // The player's world
Location v2 = new Location(world, (-Math.sin(Math.toRadians(yaw - (angle / 2))) * distance) + v1.getX(), 0, (Math.cos(Math.toRadians(yaw - (angle / 2))) * distance) + v1.getZ()); // The second vertex
Location v3 = new Location(world, (-Math.sin(Math.toRadians(yaw + (angle / 2))) * distance) + v1.getX(), 0, (Math.cos(Math.toRadians(yaw + (angle / 2))) * distance) + v1.getZ()); // The third vertex
以弧度为单位的角度的负正弦用于 X 坐标,而以弧度为单位的角度的余弦用于 Z 坐标。
我使用了一些粒子来可视化 Minecraft 中三角形的线条,这个三角形的长度为 5,角度为 90 度:
您可以使用一种方法来检查一个点是否在二维三角形内,作为对此 question 的答案发布。并使用重心坐标。这是适用于 Bukkit/Spigot 的示例方法。
// v1, v2 and v3 are the vertices of the triangle, in no specific order
// The Y coordinates are ignored (two dimensional)
public static boolean isLocationInTriangle(Location location, Location v1, Location v2, Location v3) {
// Bunch of math...
double a = 0.5 * (-v2.getZ() * v3.getX() + v1.getZ() * (-v2.getX() + v3.getX()) + v1.getX() * (v2.getZ() - v3.getZ()) + v2.getX() * v3.getZ());
int sign = a < 0 ? -1 : 1;
double s = (v1.getZ() * v3.getX() - v1.getX() * v3.getZ() + (v3.getZ() - v1.getZ()) * location.getX() + (v1.getX() - v3.getX()) * location.getZ()) * sign;
double t = (v1.getX() * v2.getZ() - v1.getZ() * v2.getX() + (v1.getZ() - v2.getZ()) * location.getX() + (v2.getX() - v1.getX()) * location.getZ()) * sign;
return s > 0 && t > 0 && (s + t) < 2 * a * sign;
}
我对此进行了一些测试,它似乎运行良好。
您可以像这样在您的方法中使用它:
List<Entity> nearbyEntities = player.getNearbyEntities(8, 2, 8); // Get entities within 16x4x16 box centered around player
for (Entity entity : nearbyEntities) { // For each Entity found
if (entity instanceof LivingEntity) { // If the Entity is an instance of a LivingEntity
LivingEntity living = (LivingEntity) entity; // Cast
if (isLocationInTriangle(living.getLocation(), player.getLocation(), v2, v3)) { // If the LivingEntity is inside the triangle
living.damage(6); // Damage the entity (just as an example)
}
}
}
请注意,尽管 IsLocationInTriangle
方法忽略了 Y 坐标或高度(因为它是二维检查),getNearbyEntities
方法会查找框内的实体,并且在这个例子中,盒子有 4 个方 block 的高度,中心在玩家的位置。因此,不会检查玩家上方或下方超过 2 个方 block 的实体。
或者,一旦你有了三角形的三个坐标 v1
、v2
和 v3
,你当然也可以使用它们来创建一个像 Joop 这样的 JavaFX Polygon
提到并使用其 contains
方法来检查实体是否在三角形内,而不是使用重心坐标方法。
关于java - (Java) vector 问题 - 检查 3 个 vector 中是否有怪物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36846951/
我走! 农卡! 乡非! 男痴@ 有倪 再贱 罗二。 左耳L 鱼七° 闲人 只要你! 怪物 - 久伴! 兀自
我即将编写一个将条形码转换为游戏元素(例如怪物、元素、技能等)的游戏。很像旧的“Barcode Battler”游戏。 不幸的是,我在数学方面不是很有天赋。我需要的是一些提示,我可以如何开发一种算法来
冒着听起来像新手程序员的风险,我要问一个关于“空指针”怪兽的普遍存在的问题。这是一段代码: public class pixel { private String type = "empty"
我正在接手一个庞大的现有项目。现在我正在寻找一些错误。但是当到处都是 symfony 缓存时,很难理解外国代码做了什么。 Quit the server with CONTROL-C. RUN
我们当前的自动化构建由 1 个主盒和 4 个 core-2-duo 披萨盒(大约 2.5Ghz)组成,每个盒有 3 GB 内存,全部运行 Ubuntu Linux。 (使用bamboo) 我被要求重新
我有一个它正在选择的怪物列表。 def monsters(): whatMonster = random.randint(0, 25) monster = pickMonste
我是一名优秀的程序员,十分优秀!