考虑从A点的直线(X,Y)到B(P,Q)。
该方法CGContextMoveToPoint(context, x, y);
移动到点x,y和方法CGContextAddLineToPoint(context, p, q);
将利用从A点到B的线
我的问题是,我能找到的所有的点,该线覆盖?
其实我需要知道确切的点,这是X点的终点之前B.
请参阅此影像..
上面的线是仅作参考。 这条线可以具有任何角度。 我需要5点,这是该行中的B点之前
谢谢
考虑从A点的直线(X,Y)到B(P,Q)。
该方法CGContextMoveToPoint(context, x, y);
移动到点x,y和方法CGContextAddLineToPoint(context, p, q);
将利用从A点到B的线
我的问题是,我能找到的所有的点,该线覆盖?
其实我需要知道确切的点,这是X点的终点之前B.
请参阅此影像..
上面的线是仅作参考。 这条线可以具有任何角度。 我需要5点,这是该行中的B点之前
谢谢
你不要以为在像素方面。 坐标浮点值。 在几何点(x,y)
不需要为像素的。 事实上,你应该想到的像素为你的坐标系中的矩形。
这意味着,“终点前x像素”并没有真正有意义。 如果像素是长方形的,“x像素”是一个不同的数量,如果你水平移动比它如果垂直移动。 如果你在其他任何方向移动,以决定这意味着什么更难。
根据你正在试图做到这一点可能会或可能不容易在像素方面翻译你的概念。 它可能会更好,然而,却反其道而行之,并停止在像素方面思考,把所有目前你表达在像素方面向非像素方面。
还记得那正是一个像素是依赖于系统,你可能会或可能不会在一般情况下,可以在系统中查询它(尤其是当你考虑到的事情像Retina显示屏和所有分辨率无关的功能)。
编辑:
我看你编辑你的问题,而是“分”不超过“像素”更准确。
不过,我会尽量给你一个可行的解决方案。 至少有一次你在正确的条款重新制定您的问题将是可行的。
你的问题,制定正确的,应该是:
给定两个点A
和B
在笛卡尔空间和距离delta
,什么是一个点的坐标C
使得C
是在穿过线A
和B
与段BC是的长度delta
?
下面是这个问题的解决方案:
// Assuming point A has coordinates (x,y) and point B has coordinates (p,q).
// Also assuming the distance from B to C is delta. We want to find the
// coordinates of C.
// I'll rename the coordinates for legibility.
double ax = x;
double ay = y;
double bx = p;
double by = q;
// this is what we want to find
double cx, cy;
// we need to establish a limit to acceptable computational precision
double epsilon = 0.000001;
if ( bx - ax < epsilon && by - ay < epsilon ) {
// the two points are too close to compute a reliable result
// this is an error condition. handle the error here (throw
// an exception or whatever).
} else {
// compute the vector from B to A and its length
double bax = bx - ax;
double bay = by - ay;
double balen = sqrt( pow(bax, 2) + pow(bay, 2) );
// compute the vector from B to C (same direction of the vector from
// B to A but with lenght delta)
double bcx = bax * delta / balen;
double bcy = bay * delta / balen;
// and now add that vector to the vector OB (with O being the origin)
// to find the solution
cx = bx + bcx;
cy = by + bcy;
}
你需要确保点A和B都不能太近或计算不精确且其结果将是不同的比你预期。 这就是epsilon
是应该做的(你可能会或可能不会想要改变的值epsilon
)。
理想的情况是一个合适的值epsilon
未在涉及到最小的数字表示的double
,但到精确度水平,一个double
为您提供的坐标的量级值。
我已经硬编码了epsilon
,这是确定它的价值,你通常事先知道你的数据的数量级的常用方法,但也有“自适应”技术来计算一个epsilon
从参数的实际值(坐标的A和B以及增量,在这种情况下)。
另外请注意,我有编码的可读性(编译器应该能够反正优化)。 随意如果你想重新编码。
这不是那么难,你的部分转化为数学系中表达,x像素可以被转换成与-B中心一瑟茜的半径,使系统来找出它们拦截,你会得到两种解决方案,采取的是更接近点一种。
这是你可以使用代码
float distanceFromPx2toP3 = 1300.0;
float mag = sqrt(pow((px2.x - px1.x),2) + pow((px2.y - px1.y),2));
float P3x = px2.x + distanceFromPx2toP3 * (px2.x - px1.x) / mag;
float P3y = px2.y + distanceFromPx2toP3 * (px2.y - px1.y) / mag;
CGPoint P3 = CGPointMake(P3x, P3y);
要么你可以按照这个链接也它会给你详细的说明 -
如何找到使用其他两个点和他们的角的第三点 。
你可以找到任何一个你想找到的点数。