LINUX.ORG.RU

Изменение размера пера после применения аффинного преобразования координат


0

0

Добрый день. Может кто-нибудь встречался с такой проблемой. После применения аффинного преобразования AffineTransform изменяется размер пера BasicStroke. Я хочу построить график функции, посчитал параметры этого преобразования, а, как оказалось, размер пера тоже меняется, я, наверно, что-то делаю не так.

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.print.*;

public class MyFrame extends JFrame {
public static final double MM_TO_PAPER_UNITS = 1 / 25.4 * 72;

public static double widthA4 = 210 * MM_TO_PAPER_UNITS;

public static double heightA4 = 297 * MM_TO_PAPER_UNITS;

public static double leftMargin = 4.0 * MM_TO_PAPER_UNITS;

public static double topMargin = 4.0 * MM_TO_PAPER_UNITS;

JButton button;

MyPanel panel;

GridBagConstraints gridBagConstraints;

public void init() {
panel = new MyPanel();
button = new JButton("Print");
getContentPane().setLayout(new GridBagLayout());
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.fill = GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;

add(panel, gridBagConstraints);
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
add(button, gridBagConstraints);
setSize(500, 500);
button.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
PrinterJob printJob = PrinterJob.getPrinterJob();
PageFormat pf = printJob.defaultPage();
pf.setOrientation(PageFormat.LANDSCAPE);
Paper paper = pf.getPaper();
paper.setSize(widthA4, heightA4);
paper.setImageableArea(leftMargin, topMargin, widthA4 - 2
* leftMargin, heightA4 - 2 * topMargin);
pf.setPaper(paper);
printJob.setCopies(1);
Book book = new Book();
book.append(panel, pf, 1);
printJob.setPageable(book);
if (printJob.printDialog()) {
try {

printJob.print();
} catch (Exception PrinterExeption) {
PrinterExeption.printStackTrace();
}
}
}
});
setVisible(true);
}

public static void main(String[] args) {
MyFrame myFrame = new MyFrame();
myFrame.init();
}

class MyPanel extends JPanel implements Printable {
final int leftPadding = 20;
final int rightPadding = 10;
final int topPadding = 10;
final int bottomPadding = 20;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
paingMyGrafik(g2);
}

public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {
Graphics2D g2 = (Graphics2D) graphics;
// affine transformation for grip of the panel`s content to the size
// A4
double W = pageFormat.getImageableWidth();
double H = pageFormat.getImageableHeight();
double minX = pageFormat.getImageableX();
double minY = pageFormat.getImageableY();
g2.transform(new AffineTransform((W) / this.getWidth(), 0, 0, (H)
/ this.getHeight(), minX, minY));
paingMyGrafik(g2);
return 0;
}


private void paingMyGrafik(Graphics2D g2) {
// here paint i my grafik
AffineTransform old = g2.getTransform();
g2.transform(toEndCoordinate());
BasicStroke stroke = new BasicStroke(0.2f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER);
g2.setStroke(stroke);
g2.drawLine(1899, 20, 1901, 20);
g2.drawLine(1901, 20, 1901, 25);
g2.drawLine(1901, 25, 1905, 26);

g2.setTransform(old);

}

private AffineTransform toUsualyCoordinate(){
AffineTransform at = new AffineTransform();
//mirror reflection relative to ox
at.concatenate(new AffineTransform(1,0,0,-1,0,0));
//parallel shift (x,y) -> (x, y-h)
at.concatenate(AffineTransform.getTranslateInstance(0,-this.getHeight()));
return at;
}
private AffineTransform toEndCoordinate(){
AffineTransform at = new AffineTransform();
at.concatenate(toUsualyCoordinate());
at.concatenate((new AffineTransform((double)(this.getWidth()-leftPadding-rightPadding)/this.getWidt h(),0,0,(double)(this.getHeight()-topPadding-bottomPadding )/this.getHeight(),leftPadding,bottomPadding)));
at.concatenate(new AffineTransform(-this.getWidth()/(getMinX()-getMaxX()-2),0,0,this.getHeight()/( getMaxY()-getMinY()+10),this.getWidth()*(getMinX()-1)/(getMinX()-getMaxX()-2),- t his.getHeight()*(getMinY()-5)/(getMaxY()-getMinY()+10)));
return at;
}
private int min(int a, int b) {
return (a < b) ? a : b;
}
private double getMinX(){
return 1900;
}
private double getMaxX(){
return 2000;
}
private double getMinY(){

return 20;
}
private double getMaxY(){
return 30;
}
}
}


буэээ без подстветки и форматирования просто противное говнище ваша ява

anonymous
()
Ответ на: комментарий от anonymous

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

sint
() автор топика
Ответ на: комментарий от sint

>а постить всякую чушь, я думаю, это довольно мерзко.

Welcome to LOR :) По теме ничего сказать не могу - многабукаф

anonymous
()
Ответ на: комментарий от sint

думаешь кому-то интересно сидеть и переформатировать эту портянку? no offense.

cobold ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.