بمعرفة نقطة البداية والنهاية والمسافة، احسب نقطة على طول الخط

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

سؤال

تبحث عن أسرع طريقة لحساب نقطة تقع على خط مسافة معينة بعيدًا عن نقطة نهاية الخط:

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 = ???
}  

شكرًا على الردود ، لا هذا ليس واجبًا ، فقط بعض القرصنة من مجال خبرتي العادي.

هذه هي الوظيفة المقترحة أدناه.انها ليست قريبة من العمل.إذا قمت بحساب النقاط كل 5 درجات في الجزء العلوي من 90 درجة من الدائرة كنقاط انطلاق واتصل بالوظيفة أدناه مع مركز الدائرة كـ X2 ، Y2 مع مسافة 4 نقاط النهاية تكون خاطئة تمامًا.تقع أسفل المركز وعلى يمينه ويبلغ طولها نفس نقطة المركز.هل لديكم أي اقتراحات؟

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

}

لقد وجدت هذا الحل على stackoverflow ولكن لا أفهمه تمامًا، هل يمكن لأي شخص التوضيح؟

هل كانت مفيدة؟

المحلول

وأعتقد أن هذا ينتمي في MathOverflow، ولكن أنا سأجيب بما أن هذه هي أول وظيفة. لأول مرة على حساب متجه من x1y1 إلى x2y2:

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

وثم حساب طول:

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

وتطبيع متجه إلى وحدة طول:

vx /= mag;
vy /= mag;

وأخيرا حساب ناقلات الجديد، الذي هو x2y2 + vxvy * (ماج + مسافة).

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

ويمكنك حذف بعض الحسابات بضرب مع المسافة / ماج بدلا من ذلك.

نصائح أخرى

هذه المعادلات خاطئة:

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

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

المعادلات الصحيحة هي:

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

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

توم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top