各位高手,谁来帮帮我,很着急,工程进度很紧
我是新来的,没多少分给,大家帮帮我,先谢谢了
问题是这样的
我用jfreechart绘制一个轴心轨迹图,横纵坐标都是数值,就是以x方向一个波形与y方向一个波形合成一个轨迹
如果x是正弦波y是余弦波的话刚好是一个圆
简单的说吧,就是画一个圆心在0,0点的圆
本来想用XYDataSet数据类型,用createXYLineChart图形
结果发现它并不是按数据点的顺序来连线的,而是按数据中x轴的增大顺序来连线(如果设置坐标图像方向是x轴),
,结果画出来不是个圆,而是一个圆饼,中间很多竖线,
比如第一个点是(-10,0)第二个点是(-9,1),第三个点是(-8,2),倒数第二个点是(-9,-1)
本来它的连线顺序应该是1,2,3,4,单出来的确实1,2,倒数第二个点,3
不知道我表达清楚了没有谁能告诉我应该怎么实现
我是新来的,没多少分给,大家帮帮我,先谢谢了
问题是这样的
我用jfreechart绘制一个轴心轨迹图,横纵坐标都是数值,就是以x方向一个波形与y方向一个波形合成一个轨迹
如果x是正弦波y是余弦波的话刚好是一个圆
简单的说吧,就是画一个圆心在0,0点的圆
本来想用XYDataSet数据类型,用createXYLineChart图形
结果发现它并不是按数据点的顺序来连线的,而是按数据中x轴的增大顺序来连线(如果设置坐标图像方向是x轴),
,结果画出来不是个圆,而是一个圆饼,中间很多竖线,
比如第一个点是(-10,0)第二个点是(-9,1),第三个点是(-8,2),倒数第二个点是(-9,-1)
本来它的连线顺序应该是1,2,3,4,单出来的确实1,2,倒数第二个点,3
不知道我表达清楚了没有谁能告诉我应该怎么实现
只要圆能画出来了,其他也没问题了
重来
本来应该是这样的,这是我想要的
但画出来成这个了
第一个图是我用两个数据段画的,就是一段y大于0,一段y小于0
按照这个createxylinechart图形绘制方式来说,两段都是在x不断增加的情况下y变化的图形
而如果把两段数据和起来就变成第2个图了
怎么就不能按照我输入的数据的顺序来连,非要按照所有数据中x由小到大来连呢,郁闷
谁能帮我看看jfreechar源代码,看看具体怎么定制……
感激不尽啊!!
实现不是很好,还有一个问题,就是园的上下颜色不一样,正在研究。
有知道的告诉一下哈。package csdn;import java.awt.Dimension;
import java.io.IOException;
import java.io.OutputStream;import javax.swing.JPanel;import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.Range;
import org.jfree.data.general.DatasetChangeEvent;
import org.jfree.data.general.DatasetGroup;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.AbstractXYDataset;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;public class ChartCircle extends ApplicationFrame { public ChartCircle(String title) {
super(title);
JPanel jpanel = createDemoPanel();
jpanel.setPreferredSize(new Dimension(500, 500));
setContentPane(jpanel);
} private static JFreeChart createChart(XYDataset xydataset) {
JFreeChart jfreechart =
ChartFactory.createXYLineChart("Circle Chart Example", "X", "Y",
xydataset, PlotOrientation.VERTICAL,
false, false, false);
XYPlot xyplot = jfreechart.getXYPlot();
xyplot.getDomainAxis().setAutoRange(false);
xyplot.getDomainAxis().setDefaultAutoRange(new Range(-21D,21D));
xyplot.getDomainAxis().setLowerMargin(0D);
xyplot.getDomainAxis().setUpperMargin(0D);
return jfreechart;
} public static JPanel createDemoPanel() {
XYDataset dataset = new SimpleXYDataset();
JFreeChart jfreechart = createChart(dataset);
return new ChartPanel(jfreechart);
} public static void main(String args[]) {
ChartCircle circle = new ChartCircle("Circle Chart Example");
circle.pack();
RefineryUtilities.centerFrameOnScreen(circle);
circle.setVisible(true);
}
}
class SimpleXYDataset extends AbstractXYDataset implements XYDataset { public SimpleXYDataset() {
translate = 0.0D;
} public double getTranslate() {
return translate;
} public void setTranslate(double d) {
translate = d;
notifyListeners(new DatasetChangeEvent(this, this));
} public Number getX(int i, int j) {
return new Double(-20D + translate + (double) j / 50D);
} public Number getY(int i, int j) {
if (i == 0) {
return new Double(Math.sqrt(400D - Math.pow(-20D + translate
+ (double) j / 50D, 2)));
} else {
return new Double(-Math.sqrt(400D - Math.pow(-20D + translate
+ (double) j / 50D, 2)));
}
} public int getSeriesCount() {
return 2;
} public Comparable getSeriesKey(int i) {
if (i == 0)
return "y = sqrt(100-x*x)";
if (i == 1)
return "y = -sqrt(100-x*x)";
else
return "Error";
} public int getItemCount(int i) {
return 2001;
} private double translate;
}
import java.awt.Dimension;
import java.awt.Paint;
import java.io.IOException;
import java.io.OutputStream;import javax.swing.JPanel;import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.DefaultDrawingSupplier;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.Range;
import org.jfree.data.general.DatasetChangeEvent;
import org.jfree.data.general.DatasetGroup;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.AbstractXYDataset;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;public class ChartCircle extends ApplicationFrame { public ChartCircle(String title) {
super(title);
JPanel jpanel = createDemoPanel();
jpanel.setPreferredSize(new Dimension(500, 500));
setContentPane(jpanel);
} private static JFreeChart createChart(XYDataset xydataset) {
JFreeChart jfreechart =
ChartFactory.createXYLineChart("Circle Chart Example", "X", "Y",
xydataset, PlotOrientation.VERTICAL,
false, false, false);
XYPlot xyplot = jfreechart.getXYPlot();
xyplot.getDomainAxis().setAutoRange(false);
xyplot.getDomainAxis().setDefaultAutoRange(new Range(-21D, 21D));
xyplot.setDrawingSupplier(getSupplier());
xyplot.getDomainAxis().setLowerMargin(0D);
xyplot.getDomainAxis().setUpperMargin(0D);
return jfreechart;
} public static JPanel createDemoPanel() {
XYDataset dataset = new SimpleXYDataset();
JFreeChart jfreechart = createChart(dataset);
return new ChartPanel(jfreechart);
} public static void main(String args[]) {
ChartCircle circle = new ChartCircle("Circle Chart Example");
circle.pack();
RefineryUtilities.centerFrameOnScreen(circle);
circle.setVisible(true);
} public static DefaultDrawingSupplier getSupplier() {
return new DefaultDrawingSupplier(
new Paint[]{Color.black, Color.black},
DefaultDrawingSupplier.DEFAULT_OUTLINE_PAINT_SEQUENCE,
DefaultDrawingSupplier.DEFAULT_STROKE_SEQUENCE,
DefaultDrawingSupplier.DEFAULT_OUTLINE_STROKE_SEQUENCE,
DefaultDrawingSupplier.DEFAULT_SHAPE_SEQUENCE);
}}
class SimpleXYDataset extends AbstractXYDataset implements XYDataset { public SimpleXYDataset() {
translate = 0.0D;
} public double getTranslate() {
return translate;
} public void setTranslate(double d) {
translate = d;
notifyListeners(new DatasetChangeEvent(this, this));
} public Number getX(int i, int j) {
return new Double(-20D + translate + (double) j / 50D);
} public Number getY(int i, int j) {
if (i == 0) {
return new Double(Math.sqrt(400D - Math.pow(-20D + translate
+ (double) j / 50D, 2)));
} else {
return new Double(-Math.sqrt(400D - Math.pow(-20D + translate
+ (double) j / 50D, 2)));
}
} public int getSeriesCount() {
return 2;
} public Comparable getSeriesKey(int i) {
if (i == 0)
return "y = sqrt(100-x*x)";
if (i == 1)
return "y = -sqrt(100-x*x)";
else
return "Error";
} public int getItemCount(int i) {
return 2001;
} private double translate;
}
问题我自己看jfreechart的源代码已经解决了,我不止要画一个圆,要更复杂的图形,用拼接的方法实现会带来很大的复杂度,因为数据是随机的
起始问题很简单,就是XYseries的构造函数,其中有一个参数可以控制这个
public XYSeries(Comparable key, boolean autoSort)
autosort的意思是自动排序,就是把你输入的数据 按照其中一个轴的数据进行排序,这样就画出了我以前那种图
将这个参数设为false,就没问题了,完全按照你输入数据的顺序绘图
折腾了好久原来是这么简单的问题,寒一个先。。
另外,感谢hongke1490 兄弟的代码,你的代码我运行了,达到了一个圆的效果,详细实现还没来得及看呢,回头慢慢学习,呵呵,再次感谢
分数大家分吧