根据matovitch最新的代码草案(我只浏览了一眼),我可能会想得太多了,但无论如何。。。在
设A=(A.x,A.y),B=(B.x,B.y),其中(A.x,A.y,B.x,B.y)是整数。
然后直线p,AB的垂直平分线穿过
M=(M.x,M.y)=((A.x+B.x)/2,(A.y+B.y)/2)
AB和p的斜率乘积为-1,因此p的斜率为
-(B.x-A.x)/(B.y-A.y)
因此,在点斜率形式下,p的方程是
(y-M.y)/(x-M.x)=(A.x-B.x)/(B.y-A.y)
重新排列,
y*(B.y-A.y)+x*(B.x-A.x)=M.y*(B.y-A.y)+M.x*(B.x-A.x)
=((B.y+A.y)*(B.y-A.y)+(B.x+A.x)*(B.x-A.x))/2
=(B.y^2-A.y^2+B.x ^2-A.x^2)/2
显然,对于任何晶格点(x,y),y*(B.y-A.y)+x*(B.x-A.x)必须是整数。所以只有当(B.y^2-A.y^2+B.x^2-A.x^2)是偶数时,直线p才会通过晶格点。在
现在(B.y^2-A.y^2+B.x^2-A.x^2)是偶数的&仅当(A.x+B.x+A.y+B.y)是偶数,如果偶数(A.x,A.y,B.x,B.y)是奇数。在下面,我假设(A.x+B.x+A.y+B.y)是偶数。在
让
dx=(B.x-A.x)
dy=(B.y-A.y)
s=(B.y^2-A.y^2+B.x^2-A.x^2)/2
所以p的方程是
y*dy+x*dx=s
因为y,dy,x,dx&s都是整数,所以这个方程是一个线性丢番图方程,而求这类方程解的标准方法是使用extended Euclidean algorithm。我们的方程只有在dx&dy的最大公约数除以s时才有解。幸运的是,在这种情况下是正确的,但我不在这里给出证明。在
设Y,X是Y*dy+X*dx=g的解,其中g是gcd(dx,dy),即
Y*dy+X*dx=g
Y*dy/g+X*dx/g=1
设dy'=dy/g,dx'=dx/g,s'=s/g,所以
Y*dy'+X*dx