我正在编写一个程序,用一定范围内的变量t(由用户输入)绘制[x(t),y(t)]。到目前为止,我创建了3个向量来保存t,x(t)和y(t)的值。我目前的方法是创建点矢量(大约1000点),然后在矢量中的两个相邻点之间绘制一条线(或路径)。但是,结果并不像我预期的那样。
来自用户的完整格式:
Plot [x(t),y(t)] x=a..b y=a..b t=a..b where a,b are the range of x,y,t
例如,用户可以输入功能:
x(t) = 5*sin(3t + 5), t=-19..19
y(t) = 4*cos(2t), t=-19.19
这是我的绘图代码:
public static void drawGraph(String sf, String sx, String sy, String st) {
JFrame mygraph = new JFrame("PlotGraph v0.1");
final Vector<Double> range_t = getRangeT(st); //get the range of t
//create a corresponding vectors of x and y based on values of t
final Vector<Double> range_x = getRangeX(range_t,funcX,var);
final Vector<Double> range_y = getRangeY(range_t,funcY,var);
//draw the graph to a JPanel, our graph is actually just a collection of points connecting 2 points
mygraph.add(new JPanel() {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(Color.BLUE );
g2.setStroke(new BasicStroke(1));
GeneralPath gpx = new GeneralPath();
GeneralPath gpy = new GeneralPath();
for (int i=0; i<998; i++) {
gpy.moveTo(range_t.get(i),range_y.get(i));
gpy.curveTo(range_t.get(i),range_y.get(i),range_t.get(i+1),range_y.get(i+1),range_t.get(i+2),range_y.get(i+2));
gpx.moveTo(range_t.get(i),range_x.get(i));
gpx.curveTo(range_t.get(i),range_x.get(i),range_t.get(i+1),range_x.get(i+1),range_t.get(i+2),range_x.get(i+2));
//g2.draw(lineY);
g2.draw(gpx);
g2.draw(gpy);
}
g2.dispose();
}
});
mygraph.setBounds(125,25,650,600);
mygraph.setLocationRelativeTo(null);
mygraph.setDefaultCloseOperation(mygraph.EXIT_ON_CLOSE);
mygraph.setVisible(true);
}
以下是我获得的2个函数:
问题: 有什么方法可以让情节更好(扩大规模)?!
答案 0 :(得分:2)
在我看来,你正在绘制错误的参数方程图。
对于参数方程,您应该从t min 迭代t
到t max 。在每个值处,评估x(t)和y(t),并在那里绘制一个点 - (x(t),y(t))。
看起来你正在(t,y(t))等处绘制点。你需要一个辅助函数来评估每个变量的用户输入函数,例如:
public double evaluateX(double t) { ... }
public double evaluateY(double t) { ... }
在这些函数中,您必须将用户的文本解析为代码(可能是tokenize,然后?),然后对其进行评估。
然后,你可以这样循环:
GeneralPath gp = new GeneralPath();
double tstep = (tmax - tmin) / 998;
for (double t=tmin; t += tstep; t<tmax) {
double x = evaluateX(t);
double y = evaluateY(t);
if (t == 0) {
gp.moveTo(x, y);
} else {
gp.lineTo(x, y);
}
}
g2d.draw(gp);
从那里,比例因子应该易于实施。尝试这样的事情:
GeneralPath gp = new GeneralPath();
final double scale = 3.0;
double tstep = (tmax - tmin) / 998;
for (double t=tmin; t += tstep; t<tmax) {
double x = scale * evaluateX(t);
double y = scale * evaluateY(t);
if (t == 0) {
gp.moveTo(x, y);
} else {
gp.lineTo(x, y);
}
}
g2d.draw(gp);