2012-02-26 3 views
1

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

enter image description here

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

EDIT: Как пользователь 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; 
} 
+0

равноценные куски, содержащие x количество элементов, и x указан вами? Что делать, если у вас 12 очков, а x равно 5? Более конкретно. – goat

+0

сейчас должно быть точнее –

ответ

1

Так я предполагаю, что у вас есть что-то похожее на это, где 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 

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

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

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

орт можно рассчитать

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 

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

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

EDIT: Хорошо, я видел ваши изменения и честно понятия не имею, о чем спрашивает ваш вопрос. Сожалею.

+0

Большое спасибо за ваше время, я загрузил диаграмму, чтобы лучше понять, о чем я говорю :) –

+0

А я вижу, метод, который я опубликовал, должен решить, где chunkedPoints содержит все точки XY (в качестве объектов [Point] (http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Point.html)). Может, я где-то ошибся? – Hedja

+0

Да, ваше решение работает очень хорошо, после небольшого изменения я не могу обнаружить ситуацию, когда переключение с одного пути на другой, пожалуйста, взгляните на функцию, которую я вставил –

Смежные вопросы