【发布时间】: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