自己写个类去处理就是:设 两个点为 (x1,y1),(x2,y2)y=ax+b ==>a=(y1-y2)/(x1-x2) b = (x1*y2-y1*x2)/(x1-x2)=========================>代入到 y=ax+b 中就可以求出 当 x 为确定值时 y 的值public class LineFunction { private int a =0; private int b =0; public LineFunction(Point pBegion ,Point pEnd) { a = ( pBegion.Y-pEnd.Y)/(pBegion.X-pEnd.X); b=(pBegion.X *pEnd.Y-pBegion.Y*pEnd.X)/(pBegion.X-pEnd.X); } public int GetYByX(int x) { return a* x +b; } public int GetXByY(int Y) { return (Y-b)/a; } public int A { get{return a;} } public int B { get{return b;} } }
syfsz(黄金分割点) 的方案已经基本完美了,不过要注意特殊情况: 比如 x1 = x2 或者 y1 = y2 时,直线的方程会很特殊,所以使用两点式求算 a, b 可能导致数学错误(x1=x2时直线垂直 x 轴)建议用 float 类型类存储 系数 a,b,因为它支持除以零,判断点时,对于垂直于 x 轴的直线,可以只判断 x 坐标。或者使用一般式:Ax + By + C = 0 (A、B不同时为零)。 x1!=x2,y1!=y2 时 A = (y1 - y2) / (x1 - x2) B = -1 C = (x1*y2-y1*x2)/(x1-x2) x1=x2, y1!=y2 时 A = 1 B = 0 C = -x1 x1!=x2, y1=y2 时 A = 0 B = 1 C = -y1
y=y+10;
x=x+10*z
反过来换算也可以。
b = (x1*y2-y1*x2)/(x1-x2)=========================>代入到 y=ax+b 中就可以求出 当 x 为确定值时 y 的值public class LineFunction
{
private int a =0;
private int b =0;
public LineFunction(Point pBegion ,Point pEnd)
{
a = ( pBegion.Y-pEnd.Y)/(pBegion.X-pEnd.X);
b=(pBegion.X *pEnd.Y-pBegion.Y*pEnd.X)/(pBegion.X-pEnd.X);
}
public int GetYByX(int x)
{
return a* x +b;
}
public int GetXByY(int Y)
{
return (Y-b)/a;
}
public int A
{
get{return a;}
}
public int B
{
get{return b;}
}
}
比如 x1 = x2 或者 y1 = y2 时,直线的方程会很特殊,所以使用两点式求算 a, b 可能导致数学错误(x1=x2时直线垂直 x 轴)建议用 float 类型类存储 系数 a,b,因为它支持除以零,判断点时,对于垂直于 x 轴的直线,可以只判断 x 坐标。或者使用一般式:Ax + By + C = 0 (A、B不同时为零)。
x1!=x2,y1!=y2 时
A = (y1 - y2) / (x1 - x2)
B = -1
C = (x1*y2-y1*x2)/(x1-x2)
x1=x2, y1!=y2 时
A = 1
B = 0
C = -x1
x1!=x2, y1=y2 时
A = 0
B = 1
C = -y1