各位高手,谁来帮帮我,很着急,工程进度很紧
我是新来的,没多少分给,大家帮帮我,先谢谢了
问题是这样的
我用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
不知道我表达清楚了没有谁能告诉我应该怎么实现

解决方案 »

  1.   

    很简单,就画个圆,jfreechart复杂的图都没问题,没想到简单的把人给难住了
    只要圆能画出来了,其他也没问题了
      

  2.   

    你先把你想要得到的图画出来,然后我们给你说说,我以前做过jfreechart的东西
      

  3.   

    晕,qq空间还不让转载
    重来
    本来应该是这样的,这是我想要的
    但画出来成这个了
    第一个图是我用两个数据段画的,就是一段y大于0,一段y小于0
    按照这个createxylinechart图形绘制方式来说,两段都是在x不断增加的情况下y变化的图形
    而如果把两段数据和起来就变成第2个图了
    怎么就不能按照我输入的数据的顺序来连,非要按照所有数据中x由小到大来连呢,郁闷
      

  4.   

    源代码看了半天,也没找到具体实现绘图的地方,貌似没有参数可以设置这个
    谁能帮我看看jfreechar源代码,看看具体怎么定制……
    感激不尽啊!!
      

  5.   

    给你一个实现的代码,没有注释,看不懂的话再解释吧。
    实现不是很好,还有一个问题,就是园的上下颜色不一样,正在研究。
    有知道的告诉一下哈。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;
    }
      

  6.   

    颜色问题解决了,重贴一下代码package csdn;import java.awt.Color;
    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;
    }
      

  7.   

    用两个XYDataSet就可以了,上面一个下面一个
      

  8.   

    好久没来,刚来看到大家的回复,非常感谢
    问题我自己看jfreechart的源代码已经解决了,我不止要画一个圆,要更复杂的图形,用拼接的方法实现会带来很大的复杂度,因为数据是随机的
    起始问题很简单,就是XYseries的构造函数,其中有一个参数可以控制这个
     public XYSeries(Comparable key, boolean autoSort)
    autosort的意思是自动排序,就是把你输入的数据  按照其中一个轴的数据进行排序,这样就画出了我以前那种图
    将这个参数设为false,就没问题了,完全按照你输入数据的顺序绘图
    折腾了好久原来是这么简单的问题,寒一个先。。
    另外,感谢hongke1490 兄弟的代码,你的代码我运行了,达到了一个圆的效果,详细实现还没来得及看呢,回头慢慢学习,呵呵,再次感谢
    分数大家分吧