Dado um ponto inicial e final, e uma distância, calcular um ponto ao longo de uma linha de

StackOverflow https://stackoverflow.com/questions/1800138

Pergunta

Olhando para a maneira mais rápida para calcular um ponto que encontra-se em uma linha uma determinada distância do ponto final da linha:

void calculate_line_point(int x1, int y1, int x2, int y2, int distance, int *px, int *py) 
{
    //calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2
    *px = ???
    *py = ???
}  

Obrigado pelas respostas, não isso não é lição de casa, apenas alguns hackers fora do minha área normal de especialização.

Esta é a função sugerida abaixo. Não é perto de trabalho. Se eu calcular os pontos a cada 5 graus na parte superior direita 90 grau de um círculo como pontos de partida e chamar a função abaixo com o centro do círculo que x2, y2 com uma distância de 4 os pontos finais são totalmente errado. Eles mentem abaixo e à direita do centro eo comprimento é tão longo como o ponto central. Alguém tem alguma sugestão?

void calculate_line_point(int x1, int y1, int x2, int y2, int distance)
{

//calculate a point on the line x1-y1 to x2-y2 that is distance from x2-y2

  double vx = x2 - x1; // x vector
  double vy = y2 - y1; // y vector

  double mag = sqrt(vx*vx + vy*vy); // length

  vx /= mag;
  vy /= mag;

// calculate the new vector, which is x2y2 + vxvy * (mag + distance).

  px = (int) ( (double) x2 + vx * (mag + (double)distance) );
  py = (int) ( (double) y2 + vy * (mag + (double)distance) );

}

Eu encontrei esta solução em stackoverflow, mas não entendo completamente, alguém pode esclarecer?

Foi útil?

Solução

Eu acho que isso pertence a MathOverflow, mas vou responder uma vez que este é o seu primeiro post. Primeiro você calcular o vetor de X1Y1 para x2y2:

float vx = x2 - x1;
float vy = y2 - y1;

Em seguida, calcule o comprimento:

float mag = sqrt(vx*vx + vy*vy);

Normalize o vetor de unidade de comprimento:

vx /= mag;
vy /= mag;

Finalmente calcular o novo vector, o qual é x2y2 + vxvy * (MAG + distância).

*px = (int)((float)x1 + vx * (mag + distance));
*py = (int)((float)y1 + vy * (mag + distance));

Você pode omitir alguns dos cálculos multiplicando com a distância / mag vez.

Outras dicas

Essas equações estão errados:

px = (int) ( (double) x2 + vx * (mag + (double)distance) );

py = (int) ( (double) y2 + vy * (mag + (double)distance) );

As equações corretas são:

px = (int) ( (double) x2 + vx * (double)distance );

py = (int) ( (double) y2 + vy * (double)distance );

Tom

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top