Math 查找由两条线定义的区域中的所有整数点

Math 查找由两条线定义的区域中的所有整数点,math,graphics,Math,Graphics,我需要一种有效的方法来获取由两条线定义的区域中的所有整数点 我从一条由两点Pt1和Pt2定义的线开始。 然后移动这条线,得到两个新点Pt1new和Pt2new。 然后我需要找到所有的欧拉点,这些点位于直线运动产生的区域内 对于简单的情况,这是没有问题的,因为我将简单地在最小的x和y值到最大的x和y值之间生成一个矩形区域。然后检查与欧拉网格建立的交点是否在我的点生成的区域内。(按顺时针方向移动各点,并检查该点是否始终位于右侧) 但是对于第二个问题(图中较低的一个),这似乎不起作用,因为我无法轻松检

我需要一种有效的方法来获取由两条线定义的区域中的所有整数点

我从一条由两点Pt1和Pt2定义的线开始。 然后移动这条线,得到两个新点Pt1new和Pt2new。 然后我需要找到所有的欧拉点,这些点位于直线运动产生的区域内

对于简单的情况,这是没有问题的,因为我将简单地在最小的x和y值到最大的x和y值之间生成一个矩形区域。然后检查与欧拉网格建立的交点是否在我的点生成的区域内。(按顺时针方向移动各点,并检查该点是否始终位于右侧)

但是对于第二个问题(图中较低的一个),这似乎不起作用,因为我无法轻松检查该点是否确实在该区域内。我怎样才能快速简便地找到所有这些要点

在图中,我感兴趣的是找到绿点。位于欧拉网格上(例如,x和y坐标为整数值)


如果两条线Pt1-Pt2和Pt1new-Pt2new在点P0处相交,则找到三角形Pt1-Pt1new-P0和Pt2-Pt2new-P0中的所有欧拉点

最简单的方法与用于四边形的方法相同。计算边界框并测试其中的每个欧拉点。您可能需要使用来检查此项


作为进一步的推广,您可能希望始终使用三角形:Pt1-Pt2-Pt1new+Pt2-Pt2new-Pt1new在法线中,Pt1-Pt1new-P0+Pt2-Pt2new-P0在退化三角形中。

如果两条线Pt1-Pt2和Pt1new-Pt2new在点P0处相交,则找到三角形Pt1-Pt1new-P0和Pt2-Pt2new-P0中的所有点

最简单的方法与用于四边形的方法相同。计算边界框并测试其中的每个欧拉点。您可能需要使用来检查此项


作为进一步推广,您可能希望始终使用三角形:正常情况下使用Pt1-Pt2-Pt1new+Pt2-Pt2new-Pt1new,退化情况下使用Pt1-Pt1new-P0+Pt2-Pt2new-P0。

我认为您需要更改参考

想象你的原点被锚定在直线上,而实际上是网格在移动。您可以清楚地看到,在第一个网格中,高亮显示的网格点已在直线上向上移动。在第二种情况下,栅格已旋转,并且只有高亮显示的点在直线上移动

因为所有的东西都是线性的(这里没有曲线),如果一个点在变换之前在直线的“下方”,之后在它的下方,那么它从来没有穿过它

然后定义一个点是在直线下方还是上方的度量。如果最远的任一行移动的是3个单位,那么我们只需要考虑从3个单位的网格点远离线。对于这些点中的每一个点,在变换前后测试其是否在直线下方或上方。如果其状态更改,则该行将通过它。如果没有,那就没有了

那么,上面/下面的度量。该行由

y=mx+c

点p(px,py)位于线上方,如果

py>m.py+c

在矩阵中,我们可以首先将线AB(ax,ay转换为bx,by)和点(px,py)转换为原点A:

Q' = Q + | -ax |
         | -ay |
然后我们可以旋转它,使轴与直线对齐。由于直线与x轴之间的角度由sin(θ)=(dy/d)和cos(θ)=(dx/d)给出:

角的旋转矩阵如中所示,使用s和c我们得到:

R = |  c  s |
    | -s  c |
将平移和旋转应用于直线会沿x轴(从原点到x=d)生成谎言。然后该点将具有正y值或负y值。将其应用于p点:

q = R(p+T) = |  c  s | ( |px| + |-ax|  
             | -s  c |   |py|   |-ay|  )

p'x = px - ax
p'y = py - ay
qx =  c * p'x + s * p'y
qy = -s * p'x + c * p'y
假设我们在点p上对两条不同的线AB和CD执行此操作。我们将得到两个点F和G(前后的变换点)。如果出现以下情况,则该点已越过该线(原样):

但请注意,这只测试y。如果直线太短而无法到达该点,则该点可能仅通过该直线。因此,测试x值是否也发生了变化:

if( (fx < 0) && (gx < 0) ||
    (fx > d) && (gx > d) ) {
    // whooshed past
}
if((fx<0)和&(gx<0)||
(外汇>d)和&(gx>d)){
//呼啸而过
}
所以如果你同时测试这两个,你就会知道这个点是否越过了线而没有飞驰而过


希望这是清楚的…

我想你需要更改你的参考资料

想象你的原点被锚定在直线上,而实际上是网格在移动。您可以清楚地看到,在第一个网格中,高亮显示的网格点已在直线上向上移动。在第二种情况下,栅格已旋转,并且只有高亮显示的点在直线上移动

因为所有的东西都是线性的(这里没有曲线),如果一个点在变换之前在直线的“下方”,之后在它的下方,那么它从来没有穿过它

然后定义一个点是在直线下方还是上方的度量。如果最远的任一行移动的是3个单位,那么我们只需要考虑从3个单位的网格点远离线。对于这些点中的每一个点,在变换前后测试其是否在直线下方或上方。如果其状态更改,则该行将通过它。如果没有,那就没有了

那么,上面/下面的度量。该行由

y=mx+c

点p(px,py)位于线上方,如果

py>m.py+c

在矩阵中,我们可以首先将线AB(ax,ay转换为bx,by)和点(px,py)转换为原点A:

Q' = Q + | -ax |
         | -ay |
然后我们可以旋转它,使轴与直线对齐。由于直线与x轴之间的角度由sin(θ)=(dy/d)和cos(θ)=(dx/d)给出:

角的旋转矩阵如中所示,使用s和c我们得到:

R = |  c  s |
    | -s  c |
将平移和旋转应用于直线会沿x轴(从原点到x=d)生成谎言。然后该点将有一个正或负的值