【问题标题】:Finding two points that intersect a rectangle on a line that is perpendicular to a line segment在垂直于线段的线上查找与矩形相交的两个点
【发布时间】:2020-12-17 07:06:36
【问题描述】:

我遇到以下问题:

给定:

  • 具有定义的高度 (Y) 和宽度 (X) 的矩形
  • 由点 A 和 B 给出的线段
  • C 段内的一个点

找到点 D 和 E:

  • 与矩形相交
  • 形成一条穿过 C 的线段
  • 形成一条垂直于线段 AB 的线段

为了解决这个问题,我首先尝试计算斜率并创建一个线函数,但我看到的所有获得线和多边形交点的答案都使用线段而不是线函数。我该如何解决这个问题?我是否错过了一种更好的方法来找到不需要函数的垂直线?

function getPerpendicular(ax,ay,bx,by,cx,cy,x,y){
    let a=bx-ax;
    let b=by-ay;
    let slope;
    let line;
    // Because if a==0 the slope is infinite
    if(a===0){
        line=function(y){
            return cx;
        }
    }else{
        slope= (b)/(-a);
        line=function(x){
            return slope*x+cy-cx;
        }
    }
    // Intersection with the line function?
}

【问题讨论】:

    标签: javascript math geometry 2d


    【解决方案1】:

    获取AB线的方向向量(你的a,b)

    xx=bx-ax;
    yy=by-ay;
    

    获取垂直向量

    dx = - yy
    dy = xx
    

    现在垂线有参数方程(仅供参考,无需实现)

    x = cx + dx * t
    y = cy + dy * t
    

    首先检查水平/垂直线

    if dx = 0 then
        return cx, 0, cx, Y
    
    if dy = 0 then
        return 0, cy, X, cy
    

    先决条件:潜在的边界位置

    if dx > 0 then
       bx1 = X
       bx2 = 0
    else
       bx1 = 0
       bx2 = X
    
    if dy > 0 then
       by1 = Y
       by2 = 0 
    else
       by1 = 0
       by2 = Y
    

    一般情况下求与水平和垂直边缘相交的参数

    tx1 = (bx1 - cx) / dx
    ty1 = (by1 - cy) / dy
    tx2 = (bx2 - cx) / dx //should be negative
    ty2 = (by2 - cy) / dy //should be negative
    

    并为一端获取较小参数值的交集:

    if tx1 <= ty1 then
       ix1 = bx1
       iy1 = cy + tx1 * dy
    else
      iy1 = by1
      ix1 = cx + ty1 * dx
    

    对于另一端更大的参数值:

    if tx2 >= ty2 then
       ix2 = bx2
       iy2 = cy + tx2 * dy
    else
      iy2 = by2
      ix2 = cx + ty2 * dx
    

    现在返回两个交点

    return ix1, iy1, ix2, iy2
    

    【讨论】:

    • 我有一些关于将其翻译成 javascript 代码的问题。首先,当你制作参数方程时,你会引入一个变量“t”,这是从哪里来的?
    • 线上的每个点都对应于某个 t 值。对于由两点定义为 AB 的线,t=0 对应于点 A,t=1 对应于点 B,t=0.5 - 到中点,t>1 对应于 B 以外的点,依此类推。我写了参数方程供参考,没有必要实施它。但是tx1等的计算都是基于这个原理
    猜你喜欢
    • 2012-07-23
    • 2014-06-09
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多