我需要:
1.)移动原点并旋转坐标平面,使x值向右前进,y值从新原点向上进行(需要在下面的代码中为内部蓝色矩形的左下角).这将使我能够在下面的代码中绘制x,y坐标对的点.
2.)绘制数据图的y轴上的抽动标记的旋转标签.
1.)移动原点并旋转坐标平面,使x值向右前进,y值从新原点向上进行(需要在下面的代码中为内部蓝色矩形的左下角).这将使我能够在下面的代码中绘制x,y坐标对的点.
2.)绘制数据图的y轴上的抽动标记的旋转标签.
下面的代码设置了这个问题.它有效,除了两个问题:
1.)绘制数据点,左上角为原点,y值向下下降
2.)屏幕上没有绘制y轴上的标记标记
任何人都可以告诉我如何修复下面的代码,以便它修复这两个问题,并做上面第一段描述的内容?
代码在以下两个java文件中:
DataGUI.java
import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;
class DataGUI extends JFrame{
DataGUI() {
super("X,Y Plot");
this.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
this.setPreferredSize(new Dimension(800,400));
this.pack();
this.setSize(new Dimension(800,600));
this.setLocationRelativeto(null);
setLayout(new GridLayout());
ArrayList<Double> myDiffs = new ArrayList<Double>();
myDiffs.add(25.0);
myDiffs.add(9.0);
myDiffs.add(7.0);
myDiffs.add(16.0);
myDiffs.add(15.0);
myDiffs.add(6.0);
myDiffs.add(2.0);
myDiffs.add(8.0);
myDiffs.add(2.0);
myDiffs.add(27.0);
myDiffs.add(14.0);
myDiffs.add(12.0);
myDiffs.add(19.0);
myDiffs.add(10.0);
myDiffs.add(11.0);
myDiffs.add(8.0);
myDiffs.add(19.0);
myDiffs.add(2.0);
myDiffs.add(16.0);
myDiffs.add(5.0);
myDiffs.add(18.0);
myDiffs.add(23.0);
myDiffs.add(9.0);
myDiffs.add(4.0);
myDiffs.add(8.0);
myDiffs.add(9.0);
myDiffs.add(3.0);
myDiffs.add(3.0);
myDiffs.add(9.0);
myDiffs.add(13.0);
myDiffs.add(17.0);
myDiffs.add(7.0);
myDiffs.add(0.0);
myDiffs.add(2.0);
myDiffs.add(3.0);
myDiffs.add(33.0);
myDiffs.add(23.0);
myDiffs.add(26.0);
myDiffs.add(12.0);
myDiffs.add(12.0);
myDiffs.add(19.0);
myDiffs.add(14.0);
myDiffs.add(9.0);
myDiffs.add(26.0);
myDiffs.add(24.0);
myDiffs.add(13.0);
myDiffs.add(19.0);
myDiffs.add(2.0);
myDiffs.add(7.0);
myDiffs.add(28.0);
myDiffs.add(15.0);
myDiffs.add(2.0);
myDiffs.add(5.0);
myDiffs.add(17.0);
myDiffs.add(2.0);
myDiffs.add(16.0);
myDiffs.add(19.0);
myDiffs.add(2.0);
myDiffs.add(31.0);
DataPanel myPP = new DataPanel(myDiffs,this.getHeight(),this.getWidth());
this.add(myPP);
this.setVisible(true);// display the panel.
}
public static void main(String[] args){
DataGUI myDataGUI = new DataGUI();
myDataGUI.setVisible(true);
}
}
DataPanel.java(注意:我编辑了下面的代码以包含trashgod的建议,但它仍然不起作用.)
import java.awt.*;
import java.awt.geom.AffineTransform;
import javax.swing.*;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.*;
class DataPanel extends JPanel {
Insets ins; // holds the panel's insets
ArrayList<Double> myDiffs;
double maxDiff = Double.NEGATIVE_INFINITY;
double minDiff = Double.POSITIVE_INFINITY;
double maxPlot;
DataPanel(ArrayList<Double> Diffs,int h,int w){
setopaque(true);// Ensure that panel is opaque.
setPreferredSize(new Dimension(w,h));
setMinimumSize(new Dimension(w,h));
setMaximumSize(new Dimension(w,h));
myDiffs = Diffs;
repaint();
this.setVisible(true);
}
protected void paintComponent(Graphics g){// Override paintComponent() method.
super.paintComponent(g);
//get data about plotting environment and about text
int height = getHeight();
int width = getWidth();
ins = getInsets();
Graphics2D g2d = (Graphics2D)g;
FontMetrics fontMetrics = g2d.getFontMetrics();
String xString = ("x-axis label");
int xStrWidth = fontMetrics.stringWidth(xString);
int xStrHeight = fontMetrics.getHeight();
String yString = "y-axis label";
int yStrWidth = fontMetrics.stringWidth(yString);
int yStrHeight = fontMetrics.getHeight();
String titleString ="Title of Graphic";
int titleStrWidth = fontMetrics.stringWidth(titleString);
int titleStrHeight = fontMetrics.getHeight();
int leftMargin = ins.left;
//set parameters for inner rectangle
int hPad=10;
int vPad = 6;
int testLeftStartPlotwindow = ins.left+5+(3*yStrHeight);
int testInnerWidth = width-testLeftStartPlotwindow-ins.right-hPad;
getmaxmindiffs();
getMaxPlotVal();
double increment = 5.0;
int numTicks = (int)(maxPlot/increment);//will use numTicks for: remainder,leftStartPlotwindow,innerRectangle+labels+tickmarks
int remainder = testInnerWidth%numTicks;
int leftStartPlotwindow = testLeftStartPlotwindow-remainder;
System.out.println("remainder is: "+remainder);
int bottomPad = (3*xStrHeight)-vPad;
int bluetop = ins.bottom+(vPad/2)+titleStrHeight;
int blueHeight = height-bottomPad-bluetop;
int blueWidth = blueHeight;
int blueBottom = blueHeight+bluetop;
//plot outer rectangle
g.setColor(Color.red);
int redWidth = width-leftMargin-1;
g.drawRect(leftMargin,ins.bottom,redWidth,height-ins.bottom-1);
//write top label
g.setColor(Color.black);
g.drawString(titleString,leftStartPlotwindow+((blueWidth/2)-(titleStrWidth/2)),titleStrHeight);
// fill,then plot,inner rectangle
g.setColor(Color.white);
g.fillRect(leftStartPlotwindow,bluetop,blueWidth,blueHeight);
g.setColor(Color.blue);
g.drawRect(leftStartPlotwindow,blueHeight);
//scale the diffs to fit window
double Scalar = blueWidth/maxPlot;
ArrayList<Double> scaledDiffs = new ArrayList<Double>();
for(int e = 0;e<myDiffs.size();e++){scaledDiffs.add(myDiffs.get(e)*Scalar);}
//plot the scaled Diffs
AffineTransform at = g2d.getTransform();//save the graphics context's transform
g2d.translate(leftStartPlotwindow,bluetop);//translate origin to bottom-left corner of blue rectangle
g2d.scale(1,-1);//invert the y-axis
for(int w = 0;w<scaledDiffs.size();w++){
if(w>0){
double prior = scaledDiffs.get(w-1);
int priorInt = (int)prior;
double current = scaledDiffs.get(w);
int currentInt = (int)current;
g2d.drawoval(priorInt,currentInt,4,4);
}
}
g2d.setTransform(at);//restore the transform for conventional rendering
//write x-axis label
g.setColor(Color.red);
g.drawString(xString,leftStartPlotwindow+((blueWidth/2)-(xStrWidth/2)),height-ins.bottom-vPad);
//write y-axis label
g2d.rotate(Math.toradians(-90),0);//rotate text 90 degrees counter-clockwise
g.drawString(yString,-(height/2)-(yStrWidth/2),yStrHeight);
g2d.rotate(Math.toradians(+90),0);//rotate text 90 degrees clockwise
// draw tick marks on x-axis
NumberFormat formatter = new DecimalFormat("#0.0");
double k = (double)blueWidth/(double)numTicks;
double iteration = 0;
for(int h=0;h<=numTicks;h++){
int xval = (int)(h*k);
g.setColor(Color.red);
g.drawLine(leftStartPlotwindow+xval,blueBottom+2,leftStartPlotwindow+xval,blueBottom+(xStrHeight/2));//draw tick marks
g.drawString(formatter.format(iteration),leftStartPlotwindow+xval-(fontMetrics.stringWidth(Double.toString(iteration))/2),blueBottom+(xStrHeight/2)+13);
iteration+=increment;
}
// draw tick marks on y-axis
iteration = 0;
for(int h=0;h<=numTicks;h++){
int yval = (int)(h*k);
g.setColor(Color.red);
g.drawLine(leftStartPlotwindow-2,blueBottom-yval,leftStartPlotwindow-(yStrHeight/2),blueBottom-yval);//draw tick marks
g2d.rotate(Math.toradians(-90),0);//rotate text 90 degrees counter-clockwise
g.drawString(formatter.format(iteration),leftStartPlotwindow-2,blueBottom-(fontMetrics.stringWidth(Double.toString(iteration))/2));
g2d.rotate(Math.toradians(+90),0);//rotate text 90 degrees clockwise
iteration+=increment;
}
}
void getmaxmindiffs(){// get max and min of Diffs
for(int u = 0;u<myDiffs.size();u++){
if(myDiffs.get(u)>maxDiff){maxDiff = myDiffs.get(u);}
if(myDiffs.get(u)<minDiff){minDiff = myDiffs.get(u);}
}
}
void getMaxPlotVal(){
maxPlot = maxDiff;
maxPlot += 1;//make sure maxPlot is bigger than the max data value
while(maxPlot%5!=0){maxPlot+=1;}//make sure maxPlot is a multiple of 5
}
}
此外,与往常一样,非常感谢关于该主题的文章或教程的链接.
解决方法
一种方法在
SineTest中显示.概括地说,>保存图形上下文的变换.
Graphics2D g2d = (Graphics2D) g; AffineTransform at = g2d.getTransform();
>将原点转换为中心.
g2d.translate(w / 2,h / 2);
>反转y轴.
g2d.scale(1,-1);
>使用笛卡尔坐标渲染.
>恢复常规渲染的变换.
g2d.setTransform(at);