首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查给定单元格是否阻塞了二维数组中两个单元格之间的直接路径?

如何检查给定单元格是否阻塞了二维数组中两个单元格之间的直接路径?
EN

Stack Overflow用户
提问于 2020-09-13 19:42:12
回答 1查看 94关注 0票数 1

细胞A和细胞B之间的直线是否被细胞C阻塞,最简单的方法是什么?即

如果单元A为0,0,B为2,2,细胞C为1,1,则C单元阻塞单元A和B之间的路径。如果单元B是对角线上的任何其他单元(3、3、4、4等),则C仍会阻塞单元A与B之间的路径,但如果单元C是任何其他单元,则不会阻塞该路径。

比如,使用A,B和C单元的位置,我需要检查哪些条件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-13 20:15:26

一些简单的线性代数。考虑两个向量,AB和AC,如果行列式为零,它们是平行的。如果点乘积是正的,它们指向相同的方向。C是沿着AB路径的,如果前面是真的,AC比AB短。为了看AC是否比AB短,我们可以比较它们长度的平方,避免平方根。

因此,我们可以在恒定的时间内用加法、减法和乘法来计算这一点。它甚至适用于所有的精确整数坐标;这些线不需要是水平的、垂直的或对角的。

代码语言:javascript
复制
#include <stdio.h>

struct vec { int x; int y; };

int determinant(struct vec a, struct vec b) {
    return a.x * b.y - b.x * a.y;
}

int dot_product(struct vec a, struct vec b) {
    return a.x * b.x + a.y * b.y;
}

int len_squared(struct vec v) {
    return dot_product(v, v);
}

int blocks(struct vec a, struct vec b, struct vec c) {
    struct vec ab = {b.x - a.x, b.y - a.y};
    struct vec ac = {c.x - a.x, c.y - a.y};

    return determinant(ab, ac) == 0 &&
           dot_product(ab, ac) > 0 &&
           len_squared(ac) < len_squared(ab);
}

int main(void) {
    struct vec a = {0, 0}, b = {2, 2}, c = {1, 1};
       
    if (blocks(a, b, c)) {
        puts("Blocks");
    }
    else {
        puts("Does not block");
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63874882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档