R-真/假调用函数与逐步求值不同

R-真/假调用函数与逐步求值不同,r,if-statement,boolean,R,If Statement,Boolean,在R工作 目标是,通过给R一组8个数值,根据前四个值定义的线段是否与最后四个值定义的线段相交,我得到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)的线段相交 和 应返回FALSE,因为从(-1,0)到(0,-1)的

在R工作

目标是,通过给R一组8个数值,根据前四个值定义的线段是否与最后四个值定义的线段相交,我得到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)的线段相交

和 应返回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")
    }
}
然后R返回“true”

为什么要这样做?
而且,更重要的是,我该如何修复它呢?结果表明我没有与正确的值进行比较,这就是为什么我的代码表现得很奇怪。
谢谢你,菲尔,当你创建
max\ux
min\ux
max\uy
min\uy
,你不应该调用
bx1
bx2
by1
by2
中的任何东西吗?这是计划中的实现。我对代码做了一些简化。一旦我解决了手头的问题,我计划稍后添加对bx1、bx2、by1和by2的引用。在您给出的示例中,
find_the_intersection_point()
返回一个-0.5和-0.5的矩阵。因此,您的
if()
条件正确返回TRUE。你提到你应该返回FALSE,但我不明白为什么。这就是问题所在。我只比较了一条线段,但它是错误的。我需要和你指出的所有线段进行比较。谢谢你帮我看这个。
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")
    }
}
do_line_segments_intersect(-1,0,0,-1,0,1,0,1)