سؤال

واسمحوا افترض أن لديك نقطتين (أ، ب) في طائرة ثنائية الأبعاد. بالنظر إلى النقطتين، ما هي أفضل طريقة للعثور على أقصى النقاط على شريحة الخط المتساوية من كل نقطة الأقرب إليها مع الحد الأدنى بعيدا.

يمكنني استخدام C #، ولكن أمثلة في أي لغة ستكون مفيدة.

List<'points> FindAllPointsInLine(Point start, Point end, int minDistantApart)  
{  
//    find all points  
}
هل كانت مفيدة؟

المحلول

تفسير السؤال على النحو التالي:

  • بين النقطة start
  • و نقطة end
  • ما هو الحد الأقصى لعدد النقاط بين متباعدة بالتساوي minDistanceApart

بعد ذلك، هذا ببساطة: طول start و end مقسوما على minDistanceApart, ، تقريب ناقص 1. (بدون ناقص 1 ينتهي بك الأمر مع عدد المسافات بين النقاط النهائية بدلا من عدد النقاط الإضافية بين النقاط)

تطبيق:

List<Point> FindAllPoints(Point start, Point end, int minDistance)
{
    double dx = end.x - start.x;
    double dy = end.y - start.y;

    int numPoints =
        Math.Floor(Math.Sqrt(dx * dx + dy * dy) / (double) minDistance) - 1;

    List<Point> result = new List<Point>;

    double stepx = dx / numPoints;
    double stepy = dy / numPoints;
    double px = start.x + stepx;
    double py = start.y + stepy;
    for (int ix = 0; ix < numPoints; ix++)
    {
        result.Add(new Point(px, py));
        px += stepx;
        py += stepy;
    }

    return result;
}

إذا كنت ترغب في كل النقاط، بما في ذلك نقطة البداية والنهاية، فسيتعين عليك ضبط حلقة حلقة، وتبدأ "PX" و "Py" في "start.x" و "start.y" بدلا من ذلك. لاحظ أنه إذا كان دقة النقاط النهائية أمر حيوي قد ترغب في إجراء حساب "PX" و "Py" بناء على نسبة "التاسعة / Numboints" النسبة بدلا من ذلك.

نصائح أخرى

لست متأكدا مما إذا كنت أفهم سؤالك، لكن هل تحاول تقسيم شريحة خط مثل هذا؟

قبل:

A + -------------------- + ب

بعد:

a + - | - | - | - | - | - | - + ب

حيث "الشرطين" هو الحد الأدنى للمسافة الخاصة بك؟ إذا كان الأمر كذلك، فسيكون هناك العديد من النقاط التي ترضي ذلك، ما لم يكن بإمكان مسافة الحد الأدنى من تقسيم طول القطاع. ومع ذلك، يمكن الحصول على واحدة من هذه المجموعة على النحو التالي:

  1. العثور على معادلة حديثة منتجات الخط
  2. العثور على إجمالي عدد النقاط (الكلمة (الطول / الذهن) + 1)
  3. حلقة أنا من 0 إلى ن، والعثور على كل نقطة على طول الخط (إذا استغرقت معادلةك المعلمة من 0 إلى 1، T = (((تعويم) I) / n)

عدل] بعد رؤية رد Jerryjvl، أعتقد أن الكود الذي تريده هو شيء مثل هذا: (القيام بذلك في Java-Ish)

List<Point> FindAllPointsInLine(Point start, Point end, float distance)
{
    float length = Math.hypot(start.x - end.x, start.y - end.y);
    int n = (int)Math.floor(length / distance);
    List<Point> result = new ArrayList<Point>(n);

    for (int i=0; i<=n; i++) {  // Note that I use <=, not <
        float t = ((float)i)/n;
        result.add(interpolate(start, end, t));
    }

    return result;
}

Point interpolate(Point a, Point b, float t)
{
    float u = 1-t;
    float x = a.x*u + b.x*t;
    float y = a.y*u + b.y*t;
    return new Point(x,y);
}

تحذير: لم يتم اختبار الرمز

العثور على عدد النقاط التي سوف تناسب الخط. احسب خطوات إحداثيات X و Y وتوليد النقاط. مثل ذلك:

lineLength = sqrt(pow(end.X - start.X,2) + pow(end.Y - start.Y, 2))
numberOfPoints = floor(lineLength/minDistantApart)
stepX = (end.X - start.X)/numberOfPoints
stepY = (end.Y - start.Y)/numberOfPoints
for (i = 1; i < numberOfPoints; i++) {
    yield Point(start.X + stepX*i, start.Y + stepY*i)
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top