Преобразование координат Дилемма, координата пользователя в координату устройства?

Я работаю над задачей, которая включает такие данные, как «длина» дороги в «миллиметрах». И согласно спецификации мой JFrame должен быть 4 метра * 3 метра (как преобразовать это в координату устройства...?).

Теперь я знаю, по крайней мере, что эти данные являются данными реального мира, а не данными пикселей устройства. Однако, найдя несколько источников, вы можете преобразовать эти данные в пиксели с помощью класса Graphics2D.

Ресурс, в котором я нашел эту информацию,

Core Java 2, том II — расширенная функция, автор — Кей С. Хорстманн и Гэри Корнелл

Тем не менее, я безуспешно искал реальные примеры.

Кто-нибудь знает какой-либо источник, где я могу прочитать больше об этом. И если у вас есть примеры, когда кто-то действительно делал что-то подобное, это было бы более информативно.

Исследование до сих пор: пока я знаю, что нам нужно дать предположения о количестве пикселей в метрах для класса Graphics2D. В Graphics2D есть метод, который поможет вам установить это предположение. Метод ,

g2D.scale(pixelsPerMeter, pixelsPerMeter);
//And than I can draw a line with meter or millimetre coordinates
g2D.draw(new Line2D.Double(coordinates in meter));

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

Любая помощь в понимании будет очень полезна.

Спасибо


person TeaCupApp    schedule 02.09.2011    source источник


Ответы (4)


Мне проще создать объект java.awt.geom.AffineTransform и самому преобразовать координаты из метров в пиксели. В вашем случае используйте AffineTransform.getScaleInstance(sx, sy).

Затем я вызываю функции Graphics2D для рисования линий и многоугольников с использованием пиксельных координат.

Это упрощает отладку: вы можете видеть значения координат до и после преобразования.

Раздел Дополнительные темы в руководстве по Java описывает, как выполнять преобразования с помощью Graphics2D, с примерами: http://download.oracle.com/javase/tutorial/2d/index.html.

person Simon C    schedule 02.09.2011
comment
Мне нравится этот подход, но обратное преобразование будет вероятно потребуется. - person trashgod; 02.09.2011
comment
это была хорошая история принятия вашего ответа, TrashGod, но на этот раз мне понравился подход Саймона. Спасибо за помощь, однако я буду больше изучать getNormalizingTransform(), выглядит интересно. - person TeaCupApp; 03.09.2011

Вы можете получить неявную геометрию любого конкретного GraphicsDevice через getNormalizingTransform() метод.

Вы также должны абстрагироваться от необходимых преобразований модели ‹-> представления. В этом примере это делается явным образом с использованием четырех *scale* методов.

person trashgod    schedule 02.09.2011
comment
Этот редактор карт Java, возможно, заслуживает вашего внимания. Я не пробовал, но мне нравится его библиотека картографических проекций. - person trashgod; 02.09.2011
comment
Для справки: этот пример демонстрирует простую одностороннюю функцию линейного масштабирования. - person trashgod; 02.09.2011

Я не думаю, что это хорошая идея, чтобы инструментарий пользовательского интерфейса делал все масштабирование за вас. Вы, вероятно, не найдете оборудование, которое действительно может отображать окно размером 4 × 3 метра, поэтому решение о том, как масштабировать или обрезать реальные координаты до того, что вы на самом деле показываете своим пользователям, логически принадлежит вашему коду, а не общему пользовательскому интерфейсу. слой. Например, если позже в проекте вы захотите повторно использовать некоторые общие элементы пользовательского интерфейса, может быть трудно убедить их, что они должны попытаться нарисовать кнопку высотой в метр с 40-сантиметровыми буквами на ней.

person hmakholm left over Monica    schedule 02.09.2011
comment
Аааа... На самом деле мне нужно провести эти линии и составить из них дорожную карту. Поэтому я думаю, что буду использовать обычные значения в пикселях для высоты кнопки. Но чтобы нарисовать карту, я должен использовать заданные данные, чтобы отобразить именно то, где они должны быть. Надеюсь, я ясно выразился, извините. - person TeaCupApp; 02.09.2011

попробуй это

Dimension d = getSize();
   int maxX = d.width - 1, maxY = d.height - 1;
   pixelSize = Math.max(rWidth/maxX, rHeight/maxY);
   centerX = maxX/2; centerY = maxY/2;


   int iX(float x){return Math.round(centerX + x/pixelSize);}//convert to device coordinate
   int iY(float y){return Math.round(centerY - y/pixelSize);}
   float fx(int x){return (x - centerX) * pixelSize;}//convert to logical coordinate
   float fy(int y){return (centerY - y) * pixelSize;}

  where rWidth and rHeight are real numbers
person mf_275    schedule 03.09.2012