Как мне перевернуть полигон, перевернув массив? - PullRequest
1 голос
/ 04 октября 2009

У меня есть 2 массива целых, которые я использую для создания многоугольника (который выглядит как рыба). Что мне нужно сделать с массивами, чтобы перевернуть многоугольник по горизонтали?

x = new int[]
   { 0, 18, 24, 30, 48, 60, 60, 54, 60, 48, 30, 24, 0 };
y = new int[]
   { 0, 18, 6, 0, 0, 12, 18, 24, 24, 36, 36, 30, 36 };

Ответы [ 6 ]

10 голосов
/ 04 октября 2009

Вам нужно найти максимальное значение массива x. В этом случае это 60. Затем установите для каждой координаты x значение 60 - x, используя цикл, например:

for (i = 0; i < NUMBER_OF_POINTS; i++) {
    x[i] = MAX_X - x[i];
}
4 голосов
/ 04 октября 2009

Изменить координату х, используя эту формулу х = 60 - х

1 голос
/ 04 октября 2009
0 голосов
/ 04 октября 2009

Возможно, вам будет намного проще, если вы используете абстракцию Point2D вместо двух массивов целых. Это не отдельные объекты, они связаны между собой. Так почему ты пишешь код, как будто они вообще не имеют отношения? Где ваши классы Point и Polygon? Где абстракция?

Если я понимаю, что вы подразумеваете под "переворачиванием" по горизонтали, я думаю, что вам нужно отражение относительно оси y. Если это правда, все, что вам нужно сделать, это изменить знаки всех x-координат, и все готово.

Итак, вектор с конечными точками A (xa, ya) и B (xb, yb) становится (-xa, ya) и (-xb, yb).

0 голосов
/ 04 октября 2009

Возможно, вам будет проще использовать методы перевода и масштабирования графического класса, чем манипулировать содержимым массива.

0 голосов
/ 04 октября 2009

Я думаю, что вы подразумеваете под «переворотом», чтобы сделать рыбу, которая движется слева направо, в другую, которая направлена ​​справа налево. Это означает, что вы эффективно отражаете рыбу вокруг линии x = a, где a - горизонтальная координата средней точки рыбы. В этом случае a = (max (x []) - min (x [])) / 2.

Для каждой точки мы проверяем, находится ли она слева или справа от x = a. Если он слева, мы просто изменим его так, чтобы он теперь находился на том же расстоянии вправо, в противном случае мы изменим его так, чтобы он был на том же расстоянии слева.

Я думаю, что следующий (непроверенный) код будет работать. Я сохраняю все значения в виде целых, поэтому может произойти небольшое искажение. Но должно быть легко настроить код, пока искажение не исчезнет.

int max_x=-1;
int min_x=Integer.MAX_VALUE;
for (int v:x){
   max_x=Math.max(max_x,v);
   min_x=Math.miN(min_x,v);
}

int mid=(max_x-min_x)/2;
int[] reflected_x=new int[x.length];

for(int i=0;i<x.length;i++){
   int diff=Math.abs(x[i]-mid);
   if (x[i]<mid) reflected_x[i]=mid+diff;
   else reflected_x[i]=mid-diff;
}
...