2

考虑从点 A (x,y) 到 B (p,q) 的线。

该方法CGContextMoveToPoint(context, x, y);移动到点 x,y 并且该方法CGContextAddLineToPoint(context, p, q);将绘制从点 A 到 B 的线。

我的问题是,我能找到这条线覆盖的所有点吗?

实际上我需要知道终点 B 之前的 x 点的确切点。

参考这张图。。 在此处输入图像描述

上面的行仅供参考。这条线可能有任何角度。我需要第 B 点之前的第 5 个点。

谢谢

4

3 回答 3

4

你不应该考虑像素。坐标是浮点值。处的几何点(x,y)根本不需要是像素。实际上,您应该将像素视为坐标系中的矩形。

这意味着“终点前的 x 个像素”实际上没有意义。如果像素是矩形,则水平移动时的“x 像素”与垂直移动时的数量不同。而且,如果您朝任何其他方向移动,则更难确定它的含义。

根据您尝试执行的操作,以像素术语翻译您的概念可能容易,也可能不容易。然而,相反的做法可能会更好,停止以像素为单位进行思考,并将您当前以像素术语表达的所有内容转换为非像素术语。

还要记住,一个像素到底是什么取决于系统,一般来说,您可能会也可能不会查询系统(特别是如果您考虑到视网膜显示器和所有与分辨率无关的功能)。

编辑:

我看到你编辑了你的问题,但“点”并不比“像素”更精确。

不过我会尽量给你一个可行的解决方案。至少,一旦您以正确的方式重新表述您的问题,它将是可行的。

你的问题,正确表述,应该是:

给定两个点AB在一个笛卡尔空间和一个距离delta上,一个点的坐标是多少,CC通过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与 a 中可表示的最小数字无关,而是与 a为您提供的坐标数量级值double的精度水平有关。double

我已经硬编码epsilon,这是定义它的值的常用方法,因为您通常事先知道数据的数量级,但也有“自适应”技术可以epsilon从参数的实际值(坐标 A和 B 和三角洲,在这种情况下)。

另请注意,我已为易读性编码(编译器无论如何都应该能够优化)。如果您愿意,请随时重新编码。

于 2012-09-27T09:22:25.763 回答
0

没那么难,把你的线段翻译成数学线表达式,x像素可以翻译成以B为中心的圆的半径,制作一个系统来找到它们的截距,你得到两个解决方案,取更接近的点一种。

于 2012-09-27T09:41:54.103 回答
0

这是您可以使用的代码

 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);

您可以点击此链接,它也会为您提供详细说明 -

如何使用其他两个点及其角度找到第三个点

你可以找出任何你想找到的点数。

于 2012-09-27T10:19:17.623 回答