首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 繪製阿基米德螺旋線:JFreeChart 實現完整教程

     編輯:程式設計綜合問答

數學原理

阿基米德螺旋線極坐標方程:r = a + b·θ (a, b 為常數)。轉換為笛卡爾坐標:
x = r·cosθ = (a + bθ)cosθ
y = r·sinθ = (a + bθ)sinθ

使用 JFreeChart 繪製步驟

  1. 添加依賴 (Maven):
    <dependency><groupId>org.jfree</groupId><artifactId>jfreechart</artifactId><version>1.5.4</version></dependency>
  2. 構建數據集:實現 `XYDataset` 接口或使用 `DefaultXYDataset` 填充 (x, y) 序列。
  3. 創建圖表:`ChartFactory.createXYLineChart` 或直接構建 `JFreeChart` 對象。
  4. 顯示/導出:嵌入 `ChartPanel` 到 Swing/JavaFX,或輸出 PNG/PDF。

完整可運行代碼 (Swing 窗口顯示)

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;

import javax.swing.*;
import java.awt.*;

public class ArchimedeanSpiral extends JFrame {
    public ArchimedeanSpiral() {
        super("阿基米德螺旋線 r = a + bθ");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800, 600);
        setLocationRelativeTo(null);
        
        XYDataset dataset = createDataset();
        JFreeChart chart = ChartFactory.createXYLineChart(
                "阿基米德螺旋線 (a=0, b=0.2)", // 標題
                "X", "Y",                     // 軸標籤
                dataset,                      // 數據集
                PlotOrientation.VERTICAL,
                true, true, false             // 圖例、工具提示、URL
        );
        
        // 美化繪圖區
        chart.getXYPlot().setDomainGridlinesVisible(true);
        chart.getXYPlot().setRangeGridlinesVisible(true);
        chart.getXYPlot().setBackgroundPaint(Color.WHITE);
        
        add(new ChartPanel(chart));
    }

    private XYDataset createDataset() {
        DefaultXYDataset dataset = new DefaultXYDataset();
        double[][] data = new double[2][1000]; // [x[]][y[]]
        double a = 0, b = 0.2;
        for (int i = 0; i < 1000; i++) {
            double theta = i * 0.1; // θ 從 0 到 100
            double r = a + b * theta;
            data[0][i] = r * Math.cos(theta); // x
            data[1][i] = r * Math.sin(theta); // y
        }
        dataset.addSeries("螺旋線", data);
        return dataset;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new ArchimedeanSpiral().setVisible(true));
    }
}

進階定製:多螺旋、顏色、動畫

// 多條螺旋線 (不同 b 值)
for (double b : new double[]{0.1, 0.2, 0.3, 0.5}) {
    double[][] data = new double[2][500];
    for (int i = 0; i < 500; i++) {
        double theta = i * 0.2;
        double r = b * theta;
        data[0][i] = r * Math.cos(theta);
        data[1][i] = r * Math.sin(theta);
    }
    dataset.addSeries("b=" + b, data);
}

// 自定義渲染器:漸變色、線寬
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
renderer.setSeriesPaint(0, Color.RED);
renderer.setSeriesStroke(0, new BasicStroke(2.0f));
chart.getXYPlot().setRenderer(renderer);

替代方案:JavaFX 原生 Canvas 繪製 (無第三方依賴)

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class SpiralFX extends Application {
    @Override
    public void start(Stage stage) {
        Canvas canvas = new Canvas(600, 600);
        GraphicsContext gc = canvas.getGraphicsContext2D();
        drawSpiral(gc, 300, 300, 0, 0.2, 50, Color.BLUE);
        
        stage.setScene(new Scene(new StackPane(canvas)));
        stage.setTitle("JavaFX Canvas 螺旋線");
        stage.show();
    }

    void drawSpiral(GraphicsContext gc, double cx, double cy, double a, double b, int turns, Color color) {
        gc.setStroke(color);
        gc.setLineWidth(1.5);
        gc.beginPath();
        for (double theta = 0; theta < turns * 2 * Math.PI; theta += 0.01) {
            double r = a + b * theta;
            double x = cx + r * Math.cos(theta);
            double y = cy + r * Math.sin(theta);
            if (theta == 0) gc.moveTo(x, y);
            else gc.lineTo(x, y);
        }
        gc.stroke();
    }

    public static void main(String[] args) { launch(); }
}

總結

  • JFreeChart:適合需坐標軸、圖例、導出報表、打印的科學/工程圖表場景。
  • JavaFX Canvas:輕量、無依賴、適合自定義幾何圖形、動畫、遊戲繪圖。
  • Processing / LWJGL / OpenGL:高性能、3D、大數據量實時渲染。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved