Рассчитать заполнение для выравнивания по центру прямоугольника (с изменением размера в процентах) - PullRequest
0 голосов
/ 12 сентября 2018

enter image description here

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

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class IconSymbol extends JFrame {

    public IconSymbol(double iWH, double s, double w, double h) {

        getContentPane().add(new Canvas((int)iWH, s, w, h));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize((int)iWH, (int)iWH);
        setVisible(true);        
    }

    public static void main(String arg[]) {
        IconSymbol is = new IconSymbol(100, 0.9, 50, 50);
    }

    class Canvas extends JPanel {

        // STIPULATED
        double iconWH = 0;
        double sScale = 0;
        double sWidth = 0;
        double sHeight = 0;

        // CALCULATED
        double padX = 0;
        double padY = 0;
        double xOffSet = 0;
        double yOffSet = 0;

        public Canvas(double iWH,double sS,double sW,double sH) {
            this.iconWH = iWH;
            this.sScale = sS;
            this.sWidth = sW;
            this.sHeight = sH;
        }

    public void paint(Graphics g) {
        Graphics2D g2D = (Graphics2D) g;

        g2D.setBackground(Color.WHITE);             

        g2D.setPaint(Color.BLUE);

        Shape icon = new Rectangle.Double(0,0,(int)iconWH,(int)iconWH);
        g2D.fill(icon);

        g2D.setPaint(Color.BLACK);

        int width = (int)iconWH / 10;
        int height= (int)iconWH / 10;
        for(int row=0;row<10;row++){
            for(int col=0;col<10;col++){
                g.drawRect(row*width,col*height,width,height);
            }
        }            

        Point off = algorithm(); 

        g2D.setPaint(Color.RED);            

        Shape s = new Rectangle.Double(off.x,off.y,(int)sWidth,(int)sHeight);

        AffineTransform tran = AffineTransform.getScaleInstance(sScale, sScale);

        g2D.fill(tran.createTransformedShape(s));

    }

    public Point algorithm(){
        // ALGORITHM WITH EXACT NEEDED PARAMETERS
        padX = (sWidth - ((sWidth * sScale))) / 2;
        padY = (sHeight - ((sHeight * sScale))) / 2;
        xOffSet = padX + ((iconWH - (sWidth * sScale)) / 2);
        yOffSet = padX + ((iconWH - (sHeight * sScale)) / 2);            
        Point point = new Point((int)xOffSet, (int)yOffSet);
        return point;
    }
    }
}

1 Ответ

0 голосов
/ 12 сентября 2018

Проблема с вашим кодом в том, что преобразование масштаба tran масштабирует вычисленное начало прямоугольника, off, а также sWidth и sHeight. Если вы хотите сохранить свою текущую схему, вам нужно применить обратное преобразование масштаба к вычисленному смещению в вашем методе algorithm:

public Point algorithm(){
    // ALGORITHM WITH EXACT NEEDED PARAMETERS
    xOffSet = ((iconWH - (sWidth * sScale)) / 2) / sScale;
    yOffSet = ((iconWH - (sHeight * sScale)) / 2) / sScale; 
    Point point = new Point((int)xOffSet, (int)yOffSet);
    return point;
}

Обратите внимание, что я удалил padX и padY, так как они не требовались для расчета смещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...