- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
可能有人问过关于查找一个点是否在一条线上的问题,但不是在这种情况下,他们没有回答为什么各种方法有不同的缺陷。给定点的坐标和线的坐标,准确查找点是否在线上的最佳方法是什么?我尝试过自己实现某些方法,但经过测试后它们似乎都有自己的问题。我确信还有其他方法,而且我知道 Java 有一种方法可以计算点到直线的距离,如果该点在线上,则返回 0。 Java用什么方法判断一个点是否在一条直线上?
第一种方法将 A 点到 B 点的距离与 A 点到 C 点加上 C 点到 B 点的距离进行比较。这种方法的问题是它不精确,因为它使用 Math.sqrt。
public static boolean inLine(double x1, double y1, double x2, double y2, double x3, double y3){
if((distance(x1, y1, x3, y3) + distance(x2, y2, x3, y3)) == distance(x1, y1, x2, y2)){
return true;
}
return false;
}
public static double distance(double x1, double y1, double x2, double y2){
double base = x2 - x1;
double height = y2 - y1;
double hypotenuse = Math.sqrt((base * base) + (height * height));
return hypotenuse;
}
这是我想出的第二种方法。它通过将点的 y 值与与该点的 x 值相同的线上的 y 值进行比较来检查该点是否在线上。这种方法的问题是当线是垂直或水平时它不起作用,因此我实现了一些测试来检查线是水平还是垂直时它是否在线。
public static boolean inLine(double x1, double y1, double x2, double y2, double x3, double y3){
//Check if X and Y Values of the point are within the range of the line
if(inBetween(x1, x2, x3) & inBetween(y1, y2, y3) ){
//Check if denominator is going to equal 0 when finding the slope and x of point has the same value
if(x1 == x2 && x2 == x3){
if(inBetween(y1, y2, y3)){
return true;
}else{
return false;
}
}else if(y1 == y2 && y2 == y3){
if(inBetween(x1, x2, x3)){
return true;
}else{
return false;
}
}else{
double slope = (y2-y1)/(x2-x1);
//Check if the y value of the line is equal to the y value of the point
if(findYIntercept(slope, x1, y1)+slope*x3 == y3){
return true;
}
}
}else{
return false;
}
return false;
}
public static double findYIntercept(double slope, double x, double y){
return y-(slope*x);
}
public static boolean inBetween(double a, double b, double c){
if(a <= c && c <= b){
return true;
}
else if(a >= c && c >= b){
return true;
}
return false;
}
此方法与第二种方法类似,但检查斜率是否相同。如果线是水平或垂直的,它也不起作用。我还实现了线条是水平还是垂直的情况。
public static boolean inLine(double x1, double y1, double x2, double y2, double x3, double y3){
//Check if X and Y Values of the point are within the range of the line
if(inBetween(x1, x2, x3) & inBetween(y1, y2, y3) ){
//Check if denominator is going to equal 0 when finding the slope and x of point has the same value
if(x1 == x2 && x2 == x3){
if(inBetween(y1, y2, y3)){
return true;
}else{
return false;
}
}else if(y1 == y2 && y2 == y3){
if(inBetween(x1, x2, x3)){
return true;
}else{
return false;
}
}else{
double slope1 = (y2-y1)/(x2-x1);
double slope2 = (y3-y1)/(x3-x1);
//Check if the y value of the line is equal to the y value of the point
if(slope1 == slope2){
return true;
}
}
}else{
return false;
}
return false;
}
public static double findYIntercept(double slope, double x, double y){
return y-(slope*x);
}
public static boolean inBetween(double a, double b, double c){
if(a <= c && c <= b){
return true;
}
else if(a >= c && c >= b){
return true;
}
return false;
}
最佳答案
最好的方法可能是第一种。任何使用斜率的方法都是有问题的,因为垂直线具有无限斜率。
方法一的代码问题不是 Math.sqrt
,就是浮点计算不精确。因此,比较 double
几乎总是错误的。值a
和b
使用==
。相反,您应该使用类似 Math.abs(a - b) < 0x1p-32
的内容看看它们是否足够接近。
由于浮点计算的局限性,正确地完成这种事情是极其困难的。 java.awt 做得不太好。例如,以下程序打印 0.5,这是非常不准确的。
double a = 18981256.0;
System.out.println(new Line2D.Double(1.0, 2.0, 2.0, 4.0).ptLineDist(a, 2 * a));
关于java - 用于查看一个点是否在给定三对坐标的线上的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27885252/
在下面的代码中,我得到一个 uninitialized value警告,但仅限于第二个 given/when例子。为什么是这样? #!/usr/bin/env perl use warnings; u
整个“开关”功能是否已成为实验性的?在没有 Perl 的 future 版本破坏我的代码的情况下,我可以依赖其中的某些部分吗?一般来说,将稳定功能更改为实验性的政策是什么? 背景use feature
有没有办法在一个条件语句中写出如下语句? a和b不能同时等于5。 (a可以是5,b可以是5,但是a AND b不能是5) 最佳答案 正如克里斯指出的那样,您要查找的是逻辑异或,相当于逻辑不等于 !=:
我正在寻找一种算法来找到给定 n 条线段的所有交点。以下是来自 http://jeffe.cs.illinois.edu/teaching/373/notes/x06-sweepline.pdf 的伪
数组中有 N 个元素。我可以选择第一项最多 N 次,第二项最多选择 N-1 次,依此类推。 我有 K 个 token 要使用并且需要使用它们以便我可以拥有最大数量的项目。 arr = [3, 4, 8
我正在尝试修复法语文本中的语法性别,想知道是否有办法从某个词条中获取所有单词的列表,以及是否可以在此类列表中进行查找? 最佳答案 尝试: import spacy lemma_lookup = spa
我正在为 Win32 编写一个简单的自动化测试应用程序。它作为一个单独的进程运行,并通过 Windows API 访问目标应用程序。我可以阅读窗口层次结构,查找标签和文本框,并通过发送/发布消息等来单
在 nodeJs 中使用 Sequelize 时,我从 Sequelize 收到此错误,如下所示: { [SequelizeUniqueConstraintError: Validation erro
本文https://arxiv.org/pdf/1703.10757.pdf使用回归激活映射 (RAM) - 而不是类激活映射 (CAM) 来解决问题。有几篇文章描述了如何实现 CAM。但是我找不到
我正在研究 Mach 动态链接器 dyld。这个问题适用于所有 Apple 平台,但很高兴得到特定于平台的答案;我正在使用 ObjC,但如果对你有用的话,我也很乐意翻译 Swift。 The rele
我有一个包含数千个 Instagram 用户 ID 的列表。我如何获得他们的 Instagram 用户名/句柄? 最佳答案 你必须使用这个 Instagram API: https://api.ins
我在下面的代码: def main(args: Array[String]) { val sparkConf = new SparkConf().setAppName("Spark-Hbase").s
我有一个表格,其中包含从 1 到 10 的数字。(从 D2 到 M2) 假设A1中有03/09/2019 并且在B1中有06/09/2019 并且在C1中有Hello 在A 列中,我有多个系列的单词,
我想在给定服务对应的 URI 的情况下检索服务的注释(特别是 @RolesAllowed )。这是一个例子: 服务: @GET @Path("/example") @RolesAllowed({ "B
我看到 OraclePreparedStatementexecuteQuery() 表现出序列化。也就是说,我想使用相同的连接对 Oracle 数据库同时运行两个查询。然而,OraclePrepare
import java.util.Scanner; public class GeometricSumFromK { public static int geometricSum(int k,
我创建了一个抽象基类Page,它说明了如何构建动态网页。我正在尝试想出一种基于作为 HttpServletRequest 传入的 GET 请求生成 Page 的好方法。例如... public cla
我的字符串是一条短信,采用以下两种格式之一: 潜在客户短信: 您已收到 1 条线索 标题:我的领导 潜在客户 ID:12345-2365 警报设置 ID:890 短信回复: 您已收到 1 条回复 标题
我在 python 中有以下代码: class CreateMap: def changeme(listOne, lisrTwo, listThree, listFour, listfive):
这是在 Hibernate 上运行的 JPA2。 我想检索相同实体类型的多个实例,给定它们的 ID。其中许多已经在持久性上下文和/或二级缓存中。 我尝试了几种方法,但似乎都有其缺点: 当我使用 ent
我是一名优秀的程序员,十分优秀!