Найти точку на линии, определенное расстояние от определенной точки на этой линии в программе c - PullRequest
1 голос
/ 12 апреля 2020

Я дал две точки (a [], b []) длиной d (mod). Я хочу создать функцию, способную выводить точку на расстоянии n , где n - число с плавающей точкой (1.5d, 0.5d, 2d). Я могу рассчитать градиент и расстояние между линией, но я не знаю, как найти точку вдоль линии на расстоянии n d от начальной координаты.

> #include <stdio.h>
#include <math.h>

float modulus(float vec[])
{
  float mod,int i,int n; 
  n = 2; mod = 0.0; 
  for (i = 0; i < n; i++)
  {
    mod = mod + (vec[i] * vec[i]);
  }
  mod = sqrt(mod);
  return mod;
}

void diff(float a[], float b[], float c[])
{
  int i; 
  for (i = 0; i < 2; i++)
    c[i] = a[i] - b[i];

}


float gradient(float a[], float b[])
{
    int i;
    float dx = a[0]-b[0];
    float dy = a[1]-b[1];
    return (dy/dx);
}


int main()
{
  float a[] = {1., 1.};
  float b[] = {5., 3.}; 
  float c[2]; 
  float len; 
  diff(a, b, c);

  len = modulus(c);
  printf("length = %.2f\n", len); 
  printf("\n gradient of a line : %.2f\n",gradient(a,b));
  return 0;

> `Blockquote`

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Существует пара формул, которые можно использовать для линейного интерполяции этого типа (или экстраполяции, когда d> 1 или d <0): </p>

void lerp_2(float a[], float b[],
            float d,
            float c[])
{
    c[0] = a[0] + (b[0] - a[0]) * d;
    c[1] = a[1] + (b[1] - a[1]) * d;
}

или

void lerp_2(float a[], float b[],
            float d,
            float c[])
{
    c[0] = a[0] * (1.0f - d) + b[0] * d;
    c[1] = a[1] * (1.0f - d) + b[1] * d;
}

Здесь , тестируемая реализация.

0 голосов
/ 12 апреля 2020

Вам не нужен градиент (наклон).

В вашем случае вам дается n - соотношение между новым вектором и вектором разности, поэтому вычисления просты:

for (i = 0; i < 2; i++)
    result[i] = a[i] + n * c[i];

для Новая точка n = 0,5 будет l ie в середине между a и b

В общем случае произвольного расстояния вам необходимо вычислить нормализованный (единичная длина) вектор направления

for (i = 0; i < 2; i++)
    u[i] = c[i] / len;

и умножьте его составляющие на необходимое расстояние

for (i = 0; i < 2; i++)
    result[i] = a[i] + u[i] * needed_distance;
...