Итак, я предполагаю, что у вас есть нечто похожее на это, где 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
Надеюсь, это помогло.
Я не проверял это, но я делал что-то очень похожее в прошлом, поэтому оно должно работать.
РЕДАКТИРОВАТЬ: Хорошо, я видел ваше редактирование и, честно говоря, понятия не имею, что задает ваш вопрос. К сожалению.