AffineTransform: масштабирование Формы от ее центра

См. https://stackblitz.com/edit/angular-ljqvum

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  name = 'Angular';
  items = [];
  selectedItem: any;
  ngOnInit() {
    this.items = [
      { label: '1.txt', value: 'https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg' },
      { label: '2.txt', value: 'https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg' },
      { label: '3.txt', value: 'https://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg' }
    ];
    this.selectedItem = this.items[0].value;
  }

  doDownload(value) {
    var link = document.createElement('a');
    link.href = value;
    link.download = 'Download.jpg';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  }
}
 
  • Smiley face
  • [116 ]

    6
    задан Pierre 27 March 2009 в 18:08
    поделиться

    4 ответа

    Я вижу то, что Вы имеете в виду, когда Вы имеете дело с прямоугольниками. Причина состоит в том, потому что начальное вычисление для перевода не приняло во внимание размер контейнерного объекта.

    Используйте это вместо этого:

    tr2.translate(
        (this.getWidth()/2) - (r.getWidth()*(zoom))/2,
        (this.getHeight()/2) - (r.getHeight()*(zoom))/2
    );
    tr2.scale(zoom,zoom);
    g.setTransform(tr2);
    

    То, что это делает, переводит прямоугольник в центр панели прежде, чем масштабировать его. В моих тестах это работает просто великолепно.

    5
    ответ дан 9 December 2019 в 22:39
    поделиться

    Принятие масштабирования фиксирует местоположение левого верхнего угла прямоугольника (который я думаю, является правильным, но это было долгое время, так как я сделал графику в Java), необходимо перевести прямоугольник в направлении напротив масштабирования.

    tr2.translate(
        r.getWidth()*(1-zoom)/2,
        r.getHeight()*(1-zoom)/2
    );
    tr2.scale(zoom,zoom);
    g.setTransform(tr2);
    

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

    5
    ответ дан 9 December 2019 в 22:39
    поделиться

    Это включает названное спряжение процесса преобразования.

    Если S является масштабированием, Вы хотите сделать, и T является преобразованием, которое берет точку (0,0) до такой степени, что должен быть центр Вашего масштабирования, то преобразование, которое делает задание,

    T (S (инверсия (T)))

    0
    ответ дан 9 December 2019 в 22:39
    поделиться

    (Позже) Вот работающее решение без каких-либо предварительных знаний о параметрах панели.

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Shape;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Ellipse2D;
    
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    
    public class Test extends JPanel
        {
        private static final long serialVersionUID = 1L;
        private Test()
            {
            super(null);
            setOpaque(true);
            setBackground(Color.WHITE);
            setPreferredSize(new Dimension(600,600));
            }
    
        @Override
        protected void paintComponent(Graphics g1) {
            super.paintComponent(g1);
            Shape r= new Ellipse2D.Double(5,380,400,200);
            double cx= r.getBounds2D().getCenterX();
            double cy= r.getBounds2D().getCenterY();
            Graphics2D g=(Graphics2D)g1;
            g.setColor(Color.BLACK);
            AffineTransform old= g.getTransform();
            g.drawLine((int)cx-10, (int)cy, (int)cx+10, (int)cy);
            g.drawLine((int)cx, (int)cy-10, (int)cx, (int)cy+10);
            for(double zoom=1; zoom>=0.1; zoom-=0.1)
                    {
    
    
                    AffineTransform tr2 =AffineTransform.getTranslateInstance(-cx, -cy);
                    AffineTransform  tr= AffineTransform.getScaleInstance(zoom,zoom);
                    tr.concatenate(tr2); tr2=tr;
                    tr =AffineTransform.getTranslateInstance(cx, cy);
                    tr.concatenate(tr2); tr2=tr;
    
                    tr= new AffineTransform(old);
                    tr.concatenate(tr2);  tr2=tr;
    
                    g.setTransform(tr2);
    
    
    
                    g.draw(r);
                    g.setTransform(old);
                    }
            }
    
    
        public static void main(String[] args) {
            JOptionPane.showMessageDialog(null, new Test());
            }
        }
    
    0
    ответ дан 9 December 2019 в 22:39
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: