这个问题与my older question有关。
我想做的是将同一条蝶形曲线绘制多达30次。每次使用随机的比例/翻译/颜色。
我尝试了以下代码:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for (int j=0;j<30;j++) {
double tr = Math.random() * 300;
g2.translate(tr,tr);
double sc = Math.random() * 50 + 10;
g2.scale(sc,sc);
g2.setStroke(new BasicStroke(0.01f ));
g2.setColor(new Color((int)(Math.random()*255), (int)(Math.random()*255),(int) (Math.random()*255)));
double x1,y1;
double x0 = 0;
int nPoints = 1500;
double y0 = Math.E-2;
for(int i=0;i<nPoints;i++) {
double t= 12*i*Math.PI/nPoints;
x1=(Math.sin(t)*(Math.pow(Math.E,Math.cos(t))-2*Math.cos(4*t)-Math.pow(Math.sin(t/12),5)));
y1 = (Math.cos(t)*(Math.pow(Math.E,Math.cos(t))-2*Math.cos(4*t)-Math.pow(Math.sin(t/12),5)));
g2.draw(new Line2D.Double(x0,y0,x1,y1));
x0=x1;
y0=y1;
}
}
}
此代码的问题是,最后,它将仅显示/绘制一条曲线。它不会显示多个。由于在Swing中绘画是破坏性的,因此我怀疑我面临的问题与这些行位于for循环内有关:
double tr = Math.random() * 300;
g2.translate(tr,tr);
double sc = Math.random() * 50 + 10;
g2.scale(sc,sc);
为了进行快速测试,我尝试了以下代码:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
double tr = Math.random() * 300;
g2.translate(tr,tr);
double sc = Math.random() * 50 + 10;
g2.scale(sc,sc);
for (int j=0;j<30;j++) {
g2.setStroke(new BasicStroke(0.01f ));
g2.setColor(new Color((int)(Math.random()*255), (int)(Math.random()*255),(int) (Math.random()*255)));
double x1,y1;
double x0 = 0;
int nPoints = 1500;
double y0 = Math.E-2;
g2.drawLine(5,j,100,j);
}
}
这画了30行,当我在循环中添加scale
和translate
方法时,它只画了1行。 所以我想我是对的。
一个简单的for循环可以完成这项工作吗?还是我应该使用一种更复杂的算法来在更改比例和平移时多次绘制该蝶形曲线?
答案 0 :(得分:0)
我找到了使用AffineTransform进行缩放和翻译的解决方案。
基本上,解决方案是摆脱g2.scale
和g2.translate
,而使用g2.setTransform(tx);
。 tx
是AffineTransform
,可以缩放和平移。
这是为我做的代码:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
for (int j=0;j<30;j++) {
double sc = Math.random() * 30 + 10;
AffineTransform tx = new AffineTransform();
tx.scale(sc, sc);
tx.translate(Math.random() * 50, Math.random() * 50);
g2.setTransform(tx);
g2.setStroke(new BasicStroke(0.01f ));
g2.setColor(new Color((int)(Math.random()*255), (int)(Math.random()*255),(int) (Math.random()*255)));
double x1,y1;
double x0 = 0;
int nPoints = 1500;
double y0 = Math.E-2;
for(int i=0;i<nPoints;i++) {
double t= 12*i*Math.PI/nPoints;
x1=(Math.sin(t)*(Math.pow(Math.E,Math.cos(t))-2*Math.cos(4*t)-Math.pow(Math.sin(t/12),5)));
y1 = (Math.cos(t)*(Math.pow(Math.E,Math.cos(t))-2*Math.cos(4*t)-Math.pow(Math.sin(t/12),5)));
g2.draw(new Line2D.Double(x0,y0,x1,y1));
x0=x1;
y0=y1;
}
}
}