Дилемма преобразования координат, Пользовательская координата в координату устройства? - PullRequest
1 голос
/ 02 сентября 2011

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

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

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

Core Java 2, Volume II - Advanced Feature, Автор - Cay S. Horstmann & Gary Cornell

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

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

Исследования до сих пор: пока я знаю, что нам нужно дать предположения для класса чисел 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));

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

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

Спасибо

Ответы [ 4 ]

2 голосов
/ 02 сентября 2011

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

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

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

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

2 голосов
/ 02 сентября 2011

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

Вы также должны абстрагировать требуемую модель <->просмотреть трансформации.Этот пример делает это явно, используя четыре *scale* метода.

1 голос
/ 04 сентября 2012

попробуйте

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
1 голос
/ 02 сентября 2011

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

...