Разделите двухмерный путь, созданный из точек XY на равные куски Java - PullRequest
1 голос
/ 27 февраля 2012

У меня есть массив точек A, B, C, D, E ... N, которые при подключении составляют путь.

enter image description here

Как я могу разделить этот путь на равные чанки и получить позицию каждого чанка XY?

РЕДАКТИРОВАТЬ: Как предложил пользователь Hedja, я создал функцию для обработки этой проблемы, но я не могу обнаружить ситуацию, когда чанк разделен на два подпути

public ArrayList<PointF> getPositions(ArrayList<PointF> mInput,float mChunkSize){
    ArrayList<PointF> mResult = new ArrayList<PointF>();
    float mModulo = 0f;
    for (int i = 0;i<mInput.size()-1;i++){
        //distance to next
        float mDistanceAB = MyGameMath.distance(mInput.get(i).x, mInput.get(i).y,mInput.get(i+1).x,mInput.get(i+1).y);
        //how many parts will fit 
        float mCountParts = (float) (mDistanceAB/mChunkSize); //how much parts will fit 
        //if distance is greater than chunk size 
        if (Math.abs(mDistanceAB)>=mChunkSize) {
            Log.i("Chunk","Index "+(i)+" -> "+(i+1)+" = "+mCountParts+", rest="+mModulo);
            float dx = mInput.get(i+1).x-mInput.get(i).x;
            float dy = mInput.get(i+1).y-mInput.get(i).y;
            float ux = dx/mDistanceAB;
            float uy = dy/mDistanceAB;
            for (int y=0;y<=mCountParts;y++){
                //for every part
                float nx = mInput.get(i).x+ux*mChunkSize*y;
                float ny = mInput.get(i).y+uy*mChunkSize*y;
                                    //Log.i("Chunk","at:"+nx+","+ny);
                mResult.add(new PointF(nx, ny));
            }
        } 
        mModulo = mDistanceAB%mChunkSize; //how much left from previous subpath
    }
    return mResult;
}

1 Ответ

1 голос
/ 27 февраля 2012

Итак, я предполагаю, что у вас есть нечто похожее на это, где Point - это объект с атрибутами x и y.

Point[] points = new Points[]{ //Your Points }
List<Point> chunkedPoints = new ArrayList<Point>();

Я также предполагаю, что под "равными кусками" вы подразумеваете расстояние каждого пути.

Сначала вы выполните итерацию по массиву, поскольку вам не нужно вычислять «следующую точку» после последней точки, вы можете добавить ее в конце .:

for(int i = 0; i < points.length-1; i++) { //Skip the last element
    //chunking here
}
chunkedPoints.add(points[points.length-1]); //Add the last element

Вам нужно найти Вектор Единицы, то есть направление, в котором вы путешествуете, чтобы добраться до следующей точки. Итак, сначала вам нужно получить разницу в x и y из одной точки и следующей:

double dx = point[i].x - point[i+1].x;
double dy = point[i].y - point[i+1].y;

Тогда расстояние от этой точки до следующей (простой Пифагор): двойное расстояние = Math.sqrt (dx * dx + dy * dy);

Теперь можно вычислить единичный вектор

double ux = dx/distance;
double uy = dy/distance;

Итак, теперь вы знаете, куда путешествовать, вам нужно указать, как далеко вы хотите путешествовать по нему, я назову это CHUNK_SIZE.

double nx = point[i].x + ux*CHUNK_SIZE;
double ny = point[i].y + uy*CHUNK_SIZE;

nx и ny - это координаты вашей новой точки. Однако вам нужно проверить, прошли ли вы следующую точку, чтобы вы могли остановиться. Ваша проблема не определяет, что вы делаете, когда достигаете конца подпути, не изменяя размер чанка, поэтому я предполагаю, что вы просто остановитесь на этом, и код будет выглядеть так:

double nx = point[i].x;
double ny = point[i].y;
for(
    //This part can be tidier
    int count = 0;
    count < CHUNK_SIZE && nx+ux != points[i+1].x && ny+uy != points[i+1].y;
    count++
) {
    nx += ux;
    ny += uy;
}
Point newPoint = new Point(nx, ny);

Теперь у вас есть новая точка, вы можете начинать с нее, стремиться к той же точке, что и раньше, или, если она совпадает со следующей точкой, начинать с точки после нее. Так что ваш цикл теперь что-то вроде

chunkedPoints.add(points[0]);
for(int i = 0; i < points.length-1; i++) { //Skip the last element
    Point newPoint;
    do {
        //chunking
        newPoint = new Point(nx, ny);
        chunkedPoints.add(newPoint);
    } while(!newPoint.equals(points[i+1]));
}
chunkedPoints.add(points[points.length-1]); //Add the last element

Надеюсь, это помогло.

Я не проверял это, но я делал что-то очень похожее в прошлом, поэтому оно должно работать.

РЕДАКТИРОВАТЬ: Хорошо, я видел ваше редактирование и, честно говоря, понятия не имею, что задает ваш вопрос. К сожалению.

...