Как найти третью точку, используя две другие точки и их угол - PullRequest
0 голосов
/ 16 октября 2011

Я нашел ответ здесь, но не могу понять, как перевести математику в цель C

Найти третью точку

У меня есть две точки, и у меня также есть угол относительно осей. Как мне найти третью точку, которая сформирует прямую линию? Расстояние должно быть переменным.

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Это код, который я использую:

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);
2 голосов
/ 16 октября 2011

Допустим, у меня есть две точки pointA и pointB. Наклон линии, образованной двумя точками m:

static CGFloat calculateSlope(CGPoint pointA, CGPoint pointB) {
  CGFloat m = (pointB.y - pointA.y) / (pointB.x - pointA.x);
  return m;
}

Третья точка точка C на расстоянии d от точки A на линии будет иметь вид:

static CGPoint calculatePointOnLine(
  CGPoint pointA, CGPoint pointB, CGFloat d, BOOL startAtB) {

  CGFloat m = calculateSlope(pointA, pointB);

  CGFloat dX = pointB.x - pointA.x;
  CGFloat dY = pointB.y - pointA.y;

  CGFloat signDX = dX / fabsf(dX);
  CGFloat signDY = dY / fabsf(dY);

  CGFloat dSquared = d * d;
  CGFloat mSquared = m * m;

  // We know pointC is distance d from pointA,
  // and that pointA and pointC are on the
  // same line
  // dXSquared + dYSquared = dSquared
  // m = dY / dX
  // dY = m * dX
  // dXSquared + mSquared * dXSquared = dSquared
  // dXSquared * ( 1 + mSquared ) = dSquared
  // dXSquared = dSquared / ( 1 + mSquared )

  // Handle a vertical line, dX == 0, and a horizontal line, dY == 0
  if (dX != 0 && dY != 0) {
    // Account for the sign of dX
    dX = signDX * sqrtf(dSquared / ( 1 + mSquared ));

    // Account for the sign of dY
    dY = signDY * m * dX;
  }

  // Handle a vertical line, dX == 0
  if (dX == 0 && dY != 0) {
    dY = signDY * d;
  }

  // Handle a horizontal line, dY == 0
  if (dY == 0 && dX != 0) {
    dX = signDX * d;
  }

  CGPoint startingPoint = pointA;
  if (startAtB) {
    startingPoint = pointB;
  }

  CGPoint pointC = CGMakePoint(startingPoint.x + dX, 
                               startingPoint.y + dY);
  return pointC;
}

pointC теперь всегда будет находиться на расстоянии d по линии от точки A, в направлении от точки А к точке Б. Передайте startAtB, чтобы получить pointC находиться на расстоянии d по линии от точки B в направлении от точка А в точку В.

Обмен порядка piintA и pointB в вызове calculatPointOnLine вычислить точку C, которая лежит на расстоянии d вдоль линии от Точка B, в направлении от точки B к точке A.

Вы можете использовать эти две функции для вычисления третьей точки на линии. Спасибо, что приняли этот ответ, если это поможет вам.

...