1 回答
TA贡献1865条经验 获得超7个赞
你的 scale 语句也会缩放你的线的宽度,导致你的曲线形状奇怪。有两种简单的方法可以解决这个问题:
减少线的宽度,例如到 0.01f:
Graphics2D g2 = (Graphics2D)g;
g2.translate(300,300);
double x1,y1;
double x0 = 0;
int nPoints = 500;
// Alternative 1 ---------------------
g2.scale(30,-30);
g2.setStroke(new BasicStroke(0.01f ));
// -----------------------------------
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;
}
这导致:
删除您的比例声明并使用其幅度缩放曲线,即使用关于您的 x 和 y 值的恒定前置因子,例如 -30:
Graphics2D g2 = (Graphics2D)g;
g2.translate(300,300);
double x1,y1;
double x0 = 0;
int nPoints = 500;
// Alternative 2 ---------------------
double amp = -30.0;
// -----------------------------------
double y0 = Math.E-2;
for(int i=0;i<nPoints;i++) {
double t= 12*i*Math.PI/nPoints;
// Alternative 2 ----------------------------------------------------------------------------------
x1=amp*(Math.sin(t)*(Math.pow(Math.E,Math.cos(t))-2*Math.cos(4*t)-Math.pow(Math.sin(t/12),5)));
y1=amp*(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;
}
这导致(或多或少相同):
此外,您可以通过使用抗锯齿和增加 nPoints 来提高绘图的质量:
Graphics2D g2 = (Graphics2D)g;
// Optimization ------------------------------------
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int nPoints = 1500;
// -------------------------------------------------
g2.translate(300,300);
double x1,y1;
double x0 = 0;
// Alternative 1 ---------------------
g2.scale(50,-50);
g2.setStroke(new BasicStroke(0.01f ));
// -----------------------------------
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;
}
这导致(看起来好多了):
到目前为止,两点之间的连接是一条直线。当然,您可以使用样条曲线(贝塞尔曲线等)进行进一步优化,但这可能并非易事。
添加回答
举报