`
shicheng
  • 浏览: 162185 次
  • 性别: Icon_minigender_1
  • 来自: 泉州
社区版块
存档分类
最新评论

直线上求点

 
阅读更多

直线求点

问题描述:

以起点(x1,y1)和已知点(x2,y2)的直线上,求从起点开始,长度为r的点(所要求的点)的坐标

解决方案:

1.根据直线方程y=kx+b,可以求出k、b的值

2.根据圆的一般方程(x-a)^2+(y-b)^2=r^2,加上上面的公式,就可以计算出来了

实现代码:

public static short[] getStraightLinePoint(int x1, int y1, int x2, int y2,
			int radius) {
		short x3 = 0;
		short y3 = 0;
		float k = 0;
		float b = 0;

		if ((x2 - x1) == 0 && (y2 - y1 == 0)) {
			return null;
		}

		if ((x2 - x1) == 0) {
			if (y2 > y1) {
				x3 = (short) x1;
				y3 = (short) (y1 + radius);
				return new short[] { x3, y3 };
			} else {
				x3 = (short) x1;
				y3 = (short) (y1 - radius);
				return new short[] { x3, y3 };
			}
		}

		if ((y2 - y1 == 0)) {
			if (x2 > x1) {
				y3 = (short) y1;
				x3 = (short) (x1 + radius);
				return new short[] { x3, y3 };
			} else {
				y3 = (short) y1;
				x3 = (short) (x1 - radius);
				return new short[] { x3, y3 };
			}
		}

		k = (float) (y2 - y1) / (float) (x2 - x1);
		if (k == 0 || k * k + 1 == 0)
			return null;
		b = y1 - k * x1;
		double tmpV = Math.sqrt(Math.abs(((radius * radius - (y1 * y1 + b * b
				+ x1 * x1 - 2 * y1 * b)) + (k * b - x1 - k * y1)
				* (k * b - x1 - k * y1) / (k * k + 1))
				/ (k * k + 1)));
		double tmpV2 = (k * b - x1 - k * y1) / (k * k + 1);
		x3 = (short) (tmpV - tmpV2);
		if ((x2 < x1 && x3 > x1) || (x2 > x1 && x3 < x1)) {
			x3 = (short) (-tmpV - tmpV2);
		}
		y3 = (short) (x3 * k + b);
		return new short[] { x3, y3 };
	}
 

仅供参考!

 

  • 大小: 9.6 KB
0
0
分享到:
评论
2 楼 shicheng 2011-12-26  
是的,一个格子是25个像素大小
1 楼 legend9999 2011-12-26  
每一个方格是一个坐标吗?

相关推荐

Global site tag (gtag.js) - Google Analytics