gpt4 book ai didi

java - (Java) vector 问题 - 检查 3 个 vector 中是否有怪物

转载 作者:行者123 更新时间:2023-11-30 08:37:57 27 4
gpt4 key购买 nike

目前我拥有所有需要的工具,除了 Vectors 和检查生物是否在实际三角形内。如果您想了解更多详细信息,请查看所附图片。不用担心圆圈,我已经知道了。 A picture briefly explaining what I want the code to do and how I want it to work

目前我的代码是这样的:

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。三角形在该点的内长度(定义从玩家突出的三角形两侧的长度)定义了整个三角形。当这两个值都定义好后,我们就可以找到三角形剩下的两个顶点的坐标了。这是一个粗略的草图:

enter image description here

如何获取两个顶点的 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 度:

enter image description here

您可以使用一种方法来检查一个点是否在二维三角形内,作为对此 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 的实体。

或者,一旦你有了三角形的三个坐标 v1v2v3,你当然也可以使用它们来创建一个像 Joop 这样的 JavaFX Polygon提到并使用其 contains 方法来检查实体是否在三角形内,而不是使用重心坐标方法。

关于java - (Java) vector 问题 - 检查 3 个 vector 中是否有怪物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36846951/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com