MapProcessor.java
上传用户:njlgjx
上传日期:2022-08-07
资源大小:9105k
文件大小:8k
源码类别:

图形图象

开发平台:

Java

  1. /*
  2.  * To change this template, choose Tools | Templates
  3.  * and open the template in the editor.
  4.  */
  5. package com.mwq.map.tool;
  6. import java.awt.Image;
  7. import java.awt.image.BufferedImage;
  8. import java.io.IOException;
  9. import javax.imageio.ImageIO;
  10. import javax.swing.ImageIcon;
  11. /**
  12.  *
  13.  * @author Administrator
  14.  */
  15. public class MapProcessor {
  16.     private BufferedImage map;// 地图对象
  17.     private int viewportWidth;// 地图显示区的宽度
  18.     private int viewportHeight;// 地图显示区的高度
  19.     private int showCenterX;// 地图视觉中心的水平坐标
  20.     private int showCenterY;// 地图视觉中心的垂直坐标
  21.     private int cutMapWidth;// 截取地图的宽度
  22.     private int cutMapHeight;// 截取地图的高度
  23.     private float scale;// 缩放比例
  24.     public MapProcessor(String mapPath, int viewportWidth, int viewportHeight, int scale) {
  25.         this.viewportWidth = viewportWidth;
  26.         this.viewportHeight = viewportHeight;
  27.         replaceMap(mapPath);
  28.         dealWithScale(scale);
  29.         dealWithCutMapSize();
  30.     }
  31.     public void replaceMap(String mapPath) {
  32.         try {
  33.             map = ImageIO.read(MapProcessor.class.getResource(mapPath));
  34.         } catch (IOException e) {
  35.             e.printStackTrace();
  36.         }
  37.         this.showCenterX = map.getWidth() / 2;
  38.         this.showCenterY = map.getHeight() / 2;
  39.     }
  40.     public Image zoom(int width, int height) {
  41.         return map.getScaledInstance(width, height, Image.SCALE_DEFAULT);
  42.     }
  43.     private ImageIcon cut() {
  44.         BufferedImage subimage = map.getSubimage(
  45.                 showCenterX - cutMapWidth / 2, showCenterY - cutMapHeight / 2,// 开始截取点的坐标
  46.                 cutMapWidth, cutMapHeight);// 截取地图的大小
  47.         return new ImageIcon(subimage.getScaledInstance(
  48.                 viewportWidth, viewportHeight, BufferedImage.SCALE_DEFAULT));// 返回当前显示的地图
  49.     }
  50.     public ImageIcon adjustWindow(int viewportWidth, int viewportHeight) {
  51.         this.viewportWidth = viewportWidth;// 设置视口宽度
  52.         this.viewportHeight = viewportHeight;// 设置视口高度
  53.         dealWithCutMapSize();// 处理需要截取地图的大小
  54.         validateShowCenterX();// 验证地图视觉中心的水平坐标
  55.         validateShowCenterY();// 验证地图视觉中心的垂直坐标
  56.         return this.cut();// 返回当前显示的地图
  57.     }
  58.     public ImageIcon adjustScale(int scale) {
  59.         float forestallScale = this.scale;// 调整前的比例
  60.         dealWithScale(scale);// 处理比例
  61.         dealWithCutMapSize();// 处理需要截取地图的大小
  62.         if (this.scale < forestallScale) {// 比例缩小,地图的视觉中心可能变化
  63.             validateShowCenterX();// 验证地图视觉中心的水平坐标
  64.             validateShowCenterY();// 验证地图视觉中心的垂直坐标
  65.         }
  66.         return this.cut();// 返回当前显示的地图
  67.     }
  68.     public ImageIcon moveOfHorizontal(int distance) {
  69.         if (scale == 0) {// 不缩放
  70.             this.showCenterX += distance;
  71.         } else {
  72.             if (scale > 0) {// 放大
  73.                 this.showCenterX += distance / scale;
  74.             } else {// 缩小
  75.                 this.showCenterX += distance * -scale;
  76.             }
  77.         }
  78.         validateShowCenterX();// 验证地图视觉中心的水平坐标
  79.         return this.cut();// 返回当前显示的地图
  80.     }
  81.     public ImageIcon moveOfVertical(int distance) {
  82.         if (scale == 0) {// 不缩放
  83.             this.showCenterY += distance;
  84.         } else {
  85.             if (scale > 0) {// 放大
  86.                 this.showCenterY += distance / scale;
  87.             } else {// 缩小
  88.                 this.showCenterY += distance * -scale;
  89.             }
  90.         }
  91.         validateShowCenterY();// 验证地图视觉中心的垂直坐标
  92.         return this.cut();// 返回当前显示的地图
  93.     }
  94.     public void revert() {
  95.         this.showCenterX = map.getWidth() / 2;// 设置地图视觉中心的水平坐标
  96.         this.showCenterY = map.getHeight() / 2;// 设置地图视觉中心的垂直坐标
  97.     }
  98.     public void adjustShowCenter(int x, int y) {
  99.         this.showCenterX = x;
  100.         this.showCenterY = y;
  101.         validateShowCenterX();
  102.         validateShowCenterY();
  103.     }
  104.     private void dealWithScale(int scale) {
  105.         if (scale == 0) {// 不缩放
  106.             this.scale = 0;
  107.         } else {
  108.             this.scale = scale / 100f;
  109.             if (scale > 0) {// 放大
  110.                 this.scale += 1;
  111.             } else {// 缩小
  112.                 this.scale -= 1;
  113.             }
  114.         }
  115.     }
  116.     private void validateShowCenterX() {
  117.         int w = cutMapWidth / 2;
  118.         if (cutMapWidth % 2 != 0) {
  119.             w += 1;
  120.         }
  121.         if (showCenterX < w) {// 从地图左边缘开始截取
  122.             showCenterX = w;
  123.         } else {
  124.             if (showCenterX > map.getWidth() - w) {// 截取至地图右边缘
  125.                 showCenterX = map.getWidth() - w;
  126.             }
  127.         }
  128.     }
  129.     private void validateShowCenterY() {
  130.         int h = cutMapHeight / 2;
  131.         if (cutMapHeight % 2 != 0) {
  132.             h += 1;
  133.         }
  134.         if (showCenterY < h) {// 从地图上边缘开始截取
  135.             showCenterY = h;
  136.         } else {
  137.             if (showCenterY > map.getHeight() - h) {// 截取至地图下边缘
  138.                 showCenterY = map.getHeight() - h;
  139.             }
  140.         }
  141.     }
  142.     private void dealWithCutMapSize() {
  143.         if (scale == 0) {// 不缩放
  144.             cutMapWidth = viewportWidth;
  145.             cutMapHeight = viewportHeight;
  146.         } else {
  147.             if (scale > 0) {// 放大
  148.                 cutMapWidth = (int) (viewportWidth / scale);
  149.                 cutMapHeight = (int) (viewportHeight / scale);
  150.             } else {// 缩小
  151.                 cutMapWidth = (int) (viewportWidth * -scale);
  152.                 cutMapHeight = (int) (viewportHeight * -scale);
  153.             }
  154.         }
  155.     }
  156.     public BufferedImage getMap() {
  157.         return map;
  158.     }
  159.     public int getShowCenterX() {
  160.         return showCenterX;
  161.     }
  162.     public int getShowCenterY() {
  163.         return showCenterY;
  164.     }
  165.     public int getCutMapWidth() {
  166.         return cutMapWidth;
  167.     }
  168.     public int getCutMapHeight() {
  169.         return cutMapHeight;
  170.     }
  171.     public float getScale() {
  172.         return scale;
  173.     }
  174.     public int parseScale(double scale) {
  175.         if (scale == 0) {
  176.             return 0;
  177.         } else {
  178.             if (scale > 0) {
  179.                 return (int) ((scale - 1) * 100);
  180.             } else {
  181.                 return (int) ((scale + 1) * 100);
  182.             }
  183.         }
  184.     }
  185.     //
  186.     private int rightClickX;
  187.     private int rightClickY;
  188.     private int rightClickToMapX;
  189.     private int rightClickToMapY;
  190.     public void rightClick(int x, int y) {
  191.         rightClickX = rightClickToMapX = x;
  192.         rightClickY = rightClickToMapY = y;
  193.         if (scale != 0) {
  194.             if (scale > 0) {
  195.                 rightClickToMapX = (int) (rightClickToMapX / scale);
  196.                 rightClickToMapY = (int) (rightClickToMapY / scale);
  197.             } else {
  198.                 rightClickToMapX = (int) (rightClickToMapX * -scale);
  199.                 rightClickToMapY = (int) (rightClickToMapY * -scale);
  200.             }
  201.         }
  202.         rightClickToMapX += showCenterX - cutMapWidth / 2;
  203.         rightClickToMapY += showCenterY - cutMapHeight / 2;
  204.     }
  205.     public int getRightClickX() {
  206.         return rightClickX;
  207.     }
  208.     public int getRightClickY() {
  209.         return rightClickY;
  210.     }
  211.     public int getRightClickToMapX() {
  212.         return rightClickToMapX;
  213.     }
  214.     public int getRightClickToMapY() {
  215.         return rightClickToMapY;
  216.     }
  217. }