Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检查点是否位于线段上_C_Geometry_Computational Geometry_Postgis - Fatal编程技术网

C 检查点是否位于线段上

C 检查点是否位于线段上,c,geometry,computational-geometry,postgis,C,Geometry,Computational Geometry,Postgis,我很困惑,我想检查一个点是否位于a线段上。 我用谷歌搜索了一下,但基本上我得到了两个不同的答案 及 正确答案是什么?我希望这种算法(C语言更好)适用于几何应用程序,如postgis。浮点算法无法存储您想要的每个数字。在某一点上,它必须是近似的。现在,我猜,你从维基百科得到的算法告诉你: y=mx+b 你知道m,你知道b,现在插入并确保等式成立。对数学很有用。(2的平方根)平方等于4的平方根 但现在想象一下,你在电脑上做这件事。4的平方根正好等于2,因为计算机很擅长保存小整数。然而,你的右手

我很困惑,我想检查一个点是否位于a线段上。 我用谷歌搜索了一下,但基本上我得到了两个不同的答案


正确答案是什么?我希望这种算法(C语言更好)适用于几何应用程序,如postgis。

浮点算法无法存储您想要的每个数字。在某一点上,它必须是近似的。现在,我猜,你从维基百科得到的算法告诉你:

y=mx+b
你知道
m
,你知道
b
,现在插入并确保等式成立。对数学很有用。(2的平方根)平方等于4的平方根

但现在想象一下,你在电脑上做这件事。4的平方根正好等于2,因为计算机很擅长保存小整数。然而,你的右手边,2的平方根,将会有点偏离。你必须剪掉它的一些数字,所以当你平方它时,它可能是1.999998或类似的东西。为此,您需要检查
y约为mx+b
,因此:

tolerance = .01
x,y
rhs = m*x + b //right hand side
dif = abs(rhs - y)
if dif < tolerance //the point is approximately on the segment
公差=.01
x、 y
rhs=m*x+b//右侧
dif=abs(rhs-y)
如果dif<公差//则该点大致位于线段上
然后您必须检查它的边界框(查找最大x,y,最小x,y)


当然,这些方法并不是完美的(),但对于大多数实际应用程序来说,它们都是正确的。如果你真的需要精确的数字,我建议你使用Wolfram Alpha(我听说有一些API或其他东西),或者只编写你自己的精确数字库。

浮点运算不能存储你想要的每个数字。在某一点上,它必须是近似的。现在,我猜,你从维基百科得到的算法告诉你:

y=mx+b
你知道
m
,你知道
b
,现在插入并确保等式成立。对数学很有用。(2的平方根)平方等于4的平方根

但现在想象一下,你在电脑上做这件事。4的平方根正好等于2,因为计算机很擅长保存小整数。然而,你的右手边,2的平方根,将会有点偏离。你必须剪掉它的一些数字,所以当你平方它时,它可能是1.999998或类似的东西。为此,您需要检查
y约为mx+b
,因此:

tolerance = .01
x,y
rhs = m*x + b //right hand side
dif = abs(rhs - y)
if dif < tolerance //the point is approximately on the segment
公差=.01
x、 y
rhs=m*x+b//右侧
dif=abs(rhs-y)
如果dif<公差//则该点大致位于线段上
然后您必须检查它的边界框(查找最大x,y,最小x,y)

当然,这些方法并不是完美的(),但对于大多数实际应用程序来说,它们都是正确的。如果您真的需要精确的数字,我建议您使用Wolfram Alpha(我听说有一些API或其他东西),或者只编写您自己的精确数字库。

两者都是正确的

请记住,Turbo C非常陈旧,现在已超出标准。例如,不应使用void main()(而是int main())

也不要在C中的浮点中使用比较(=),因为浮点是不精确的,这就是为什么Turbo C代码具有<0.001%%>0.001样式的原因。

两者都是正确的

请记住,Turbo C非常陈旧,现在已超出标准。例如,不应使用void main()(而是int main())


也不要在C中的浮点中使用比较(=),因为浮点是不精确的,这就是为什么Turbo C代码具有<0.001%%>0.001样式的原因。

在继续之前,最好知道您是否只是以某种方式获得了该行的图形表示,或者您是否实际拥有创建该行的公式。既然你说的是“直线”而不是“平面”,我想我们说的是二维直线

如果有直线的公式,则答案很简单,将点x、y值替换为公式,如果公式有效,则点位于直线上

例如,如果直线为y=2x+1.5,而点为(1,1)

1=1(1)+1.5 1=3.5为假,因此点不在直线上

无论变量的数量或线条的形式如何,2D或3D中的任何线条公式都适用于此

x+2y=0 1.5x+12y-4z=84

只要弹出你正在处理的点,如果方程的两边相等,那么该点就在直线(或平面)上


如果您正在寻找图形解决方案,例如具有路线图位图或类似的内容,并且希望知道某人单击的位置是否“在道路上”那么,这是一个完全不同的问题。

在继续之前,最好知道你是否只是以某种方式用图形表示这条线,或者你是否真的有创建这条线的公式。既然你说的是“直线”而不是“平面”,我想我们说的是二维直线

如果有直线的公式,则答案很简单,将点x、y值替换为公式,如果公式有效,则点位于直线上

例如,如果直线为y=2x+1.5,而点为(1,1)

1=1(1)+1.5 1=3.5为假,因此点不在直线上

无论变量的数量或线条的形式如何,2D或3D中的任何线条公式都适用于此

x+2y=0 1.5x+12y-4z=84

只要弹出你正在处理的点,如果方程的两边相等,那么该点就在直线(或平面)上


如果你正在寻找一个图形化的解决方案,比如有一张路线图的位图或类似的东西,并且想知道某人点击的地方是否“在道路上”,那么这是一个完全不同的问题。

对同一个问题有两个不同的答案并不意味着一个是错的。据我所知,他们没有使用