代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Kern

确定一个点是否在直角三角形内

  •  4
  • Jeffrey Kern  · 技术社区  · 16 年前

    我一直想知道最简单的方法来判断一个点是否在一个三角形内,或者在这个例子中,一个被对角切成两半的矩形。

    假设我有一个64x64像素的矩形。对于这个矩形,如果传递点在矩形的左上角,我希望返回一个真值,如果不是,则返回FALSE。

    -----
    |  /|
    | / |
    |<__|
    

    坏ASCII艺术的霍雷。

    假设0,0在左上角,向下增加。。。

    我已经有了一个可能的解决方案,但它似乎比它应该更复杂-获取传递的Y值,确定它将在矩形中的位置,并手动计算出该Y值处的直线将在何处剪切。E、 g,传递的Y值为16将是矩形的四分之一高度。因此,根据你检查的是哪边(左边还是右边),线要么是16px,要么是48px,这取决于线的方向。 在上面的例子中,由于我们测试的是左上角,高度为16px,所以该行的宽度为48px

    一定有更好的办法。

    矩形也可以是这样的

    -----
    |\  |
    | \ |
    |__>|
    

    但我在想,在大多数情况下,目前已经提供的答案应该仍然成立。。。

    5 回复  |  直到 11 年前
        1
  •  11
  •   Oren Trutner    16 年前

    左上/右下三角形: x+y<=64 . 右下三角形中的点有 x+y>64 .

    (对于大小(w,h)的矩形,使用w*y+h*x-w*h<0)

    对于左下角三角形中的所有点, x<=y . 右上角三角形中的点有 x>y .


    我们怎么到那里的?

    对于由尺寸(w,h)和TL/BR三角形组成的矩形,

    h*x + w*y - w*h = 0
    

    在那条线的一边的点

    h*x + w*y - w*h > 0
    

    h*x + w*y - w*h < 0
    

    将w和h都插入64,我们得到:

    64x + 64y - 64*64 < 0
    

    除以64得到:

    x+y < 64
    

    对于TR/BL三角形,

    h*x - w*y = 0
    h*x - w*y < 0
    h*x - w*y > 0
    

    在w和h中插入64,我们得到

    64x-64y < 0
    => x<y
    
        2
  •  3
  •   aaronasterling    16 年前

    你可以用三个仿射函数来表示三角形

    1. y=0
    2. x=1
    3. y=x

    1. x>=1
    2. y>=0
    3. y<=x

    所以给定一个点(x,y),你只需要验证它满足这三个不等式。

    当然,你可以用任何仿射函数(代表一条线)的形式y=mx+b来将它推广到任何三角形。

        3
  •  0
  •   msteiger    16 年前

    直线方程如下:

    y = mx + b
    

    所以,如果你把x和y的值插入方程中,它可能就不成立了。让我们重新制定:

    mx + b - y = 0
    

    现在你只需要找出这个点是否在矩形内。

        4
  •  0
  •   Jaydee    16 年前

    假设你的直角三角形有一个角在0,0,对角在a,b。

    所以y=mx+c c=0,从原点开始。

    m=b/a公司

    所以y=bx/a

    知道你的点(c,d)在三角形的哪一半

    如果(d<=(bc/a)){/点在下半部分}

    我想。。。

        5
  •  0
  •   Community Mohan Dere    6 年前

    一个简单的选择是使用光线投射算法。虽然可能有点过分满足您的需要,但它的优势是它可以处理更复杂的三角形和多边形。