【问题标题】:R - TRUE/FALSE calling function not the same as step-by-step evaluationR - TRUE/FALSE 调用函数与逐步评估不同
【发布时间】:2018-02-16 02:16:10
【问题描述】:

在 R 中工作。

目标是通过向 R 传递一组 8 个数值,根据前 4 个值定义的线段是否与最后 4 个值定义的线段相交,我得到 TRUE 或 FALSE。

第一条线段的输入格式为 (x1,x2,y1,y2) 第二条线段也是如此。这是存储系统的一个特点。线段的实际点是(x1,y1)和(x2,y2)

因此,例如:
do_line_segments_intersect(0,2,0,2,0,2,2,0)

应该返回 TRUE,因为从 (0,0) 到 (2,2) 的线段与从 (0,2) 到 (2,0) 的线段相交

和
do_line_segments_intersect(-1,0,0,-1,0,1,0,1)

应该返回 FALSE,因为从 (-1,0) 到 (0,-1) 的线段不与从 (0,0) 到 (1,1) 的线段相交

这是我正在使用的代码。
find_line_equation <- function(x1,x2,y1,y2)
  {
    A <- y1 - y2
    B <- x2 - x1
    C = A*x1 + B*y1
    return_list = list(A,B,C)
    return(return_list)
}
find_the_intersection_point <- function(list_1, list_2)
{
  coefficient_matrix = matrix(c(list_1[1], list_1[2], list_2[1],list_2[2]), nrow = 2, ncol = 2, byrow = TRUE)
  coefficient_matrix <- as.numeric(coefficient_matrix)
  coefficient_matrix = matrix(coefficient_matrix, nrow =2, ncol = 2, byrow = FALSE)
  RHS_matrix = matrix(c(list_1[3], list_2[3]), nrow = 2, ncol = 1, byrow = FALSE)
  RHS_matrix <- as.numeric(RHS_matrix)
  RHS_matrix = matrix(RHS_matrix, nrow =2, ncol = 1, byrow = FALSE)
  inverse_coefficient_matrix = solve(coefficient_matrix) 
    solution = inverse_coefficient_matrix %*% RHS_matrix
  return(solution)
}
do_line_segments_intersect <- function(ax1,ax2,ay1,ay2,bx1,bx2,by1,by2)
{
  a_coefficients <- find_line_equation(ax1,ax2,ay1,ay2)
  b_coefficients <- find_line_equation(bx1,bx2,by1,by2)
  intersection_point <- find_the_intersection_point(a_coefficients, b_coefficients)
  #find the boundaries of the line segments. This will let us check that our intersection is within the boundaries.
  max_x <- max(ax1,ax2)
  min_x <- min(ax1,ax2)
  max_y <- max(ay1,ay2)
  min_y <- min(ay1,ay2)
  #Is the intersection within the boundaries?
  if(findInterval(intersection_point[1],c(min_x,max_x)) && findInterval(intersection_point[2],c(min_y,max_y)))
    {
      print("true1")
    } else {
      print("false1")
    }
}

我知道代码不完整。我与最大值和最小值的比较应该包括所有点(因此是坐标值),而不是其中的一半。最终我想返回实际的布尔值,而不仅仅是一个指示值是什么的文本字符串。

我遇到的问题如下:

如果我在 a_coefficients 的输入坐标 (-1,0,0,-1) 和 b_coefficients 的 (0,1,0,1) 上逐步运行代码,然后逐行运行每一行那么最终的结果就是我所期待的“假”。

但是,如果我用这样的输入调用函数
do_line_segments_intersect(-1,0,0,-1,0,1,0,1)

然后 R 返回“真”。

为什么要这样做?

而且,更重要的是,我该如何解决?

【问题讨论】:

  • 当你创建max_x、min_x、max_y、min_y时,你不应该从bx1、bx2、by1、by2调用任何东西吗? ?
  • 计划实施。我已经稍微简化了代码。一旦我解决了手头的问题,我计划稍后添加对 bx1、bx2、by1 和 by2 的引用。
  • 在您给出的示例中,find_the_intersection_point() 返回 -0.5 和 -0.5 的矩阵。因此,您拥有的 if() 条件正确返回 TRUE。你提到你应该返回 FALSE,但我不明白为什么。
  • 出了什么问题。我只比较了一个线段,这是错误的。正如您所指出的,我需要与所有线段进行比较。感谢您帮助我看到这一点。

标签: r if-statement boolean


【解决方案1】:

事实证明我没有与正确的值进行比较,这就是我的代码行为异常的原因。 谢谢你,菲尔,你的帮助

【讨论】:

    猜你喜欢
    • 2015-03-15
    • 2021-11-06
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多