0

大家好,我需要以粗体绘制曲线,主要是那些以 N - S 开头的曲线,如果可能的话,那些曲线会得到 350-10 340-20 等等。我已经尝试过 QuadCurve2D 和 drawArc,但这些都不起作用。有什么办法可以避免使用 drawPolyline(xPoints, yPoints, WIDTH) 因为只画一条线需要数百对。

在此处输入图像描述

这是代码的一部分,以避免您浪费时间测试自己:

        public class PaintMyQuad extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();

        QuadCurve2D.Double curve = new QuadCurve2D.Double(200,0,200,100,200,200);
        QuadCurve2D.Double curve1 = new QuadCurve2D.Double(200,0,180,100,200,200);
        QuadCurve2D.Double curve2 = new QuadCurve2D.Double(200,0,160,100,200,200);
        //etc
        g2d.setColor(Color.RED);
        g2d.draw(curve);
        g2d.draw(curve1);
        g2d.draw(curve2);
        g2d.drawOval(100,100,200,200);
        g2d.drawArc(100,100, 100, 200, 90, 180);
        g2d.drawArc(100, 100, 100, 200, 180, 360);
        g2d.drawArc(100, 100, 0, 200, 90, 180);
        g2d.drawRect(100, 100, 200, 200);
4

2 回答 2

2

如果您需要粗线,请尝试:

....
Graphics2D g2d = (Graphics2D)g;

BasicStroke pen1 = new BasicStroke(5); // this is stroke with 5px width,
g2d.setStroke(pen1);

g2d.drawArc(100,100, 100, 200, 90, 180);
g2d.drawArc(100, 100, 100, 200, 180, 360);
...

为两种类型的线条画 2 笔,然后使用它。

于 2013-10-31T06:44:38.500 回答
1

我不确定这是否真的是一个答案 - 但我是否遇到了解决问题。我试过抗锯齿,但看起来更糟。你可以做到的一种方法是在 for 循环中为奇数和偶数添加一个 if 语句。很高兴对此提出一些建议,我想可能有一个更好的库来获得更好的圈子。也许我是按照老派的方式做的?

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

public class Stereonet{

  private static int centreX, centreY, radius;
  private Color colour;

  /**Stereonet template contructor takes 3 int parameters 
    * x, y for centre position and radius for stereonet radius*/
  public Stereonet(int x , int y, int radius, Color colour){

    centreX = x;
    centreY = y;
    this.radius = radius;
    this.colour = colour;

  }

    public void draw(Graphics g){

      Graphics2D g2D = (Graphics2D) g;           
      g2D.setStroke(new BasicStroke(2F));  
      g.setColor(colour);
      g.drawOval(centreX - radius , centreY - radius, radius * 2 , radius * 2);
      g2D.setStroke(new BasicStroke(1F)); 
      g.drawLine(centreX, centreY - radius, centreX, centreX + radius);
      g.drawLine(centreX - radius, centreY, centreX + radius, centreY);

      g2D.setStroke(new BasicStroke(1F));

      for(int degrees = 10; degrees <= 80; degrees += 10){


        double greatRadius = radius / (Math.cos(Math.toRadians(degrees))); // radius of great circle
        int greatX1 = (int)Math.round(centreX + radius * (Math.tan(Math.toRadians(degrees))) 
                                        - greatRadius); // x coord of great circle left hemisphere
        int greatX2 = (int)Math.round(centreX - (radius * (Math.tan(Math.toRadians(degrees)))) 
                                        - greatRadius); // x coord of great circle right hemisphere
        int greatY = (int)Math.round(centreY - greatRadius); // y coord of great circle

        double smallRadius = (radius / (Math.tan(Math.toRadians(degrees))));
        int smallY1 = (int)Math.round((centreY  - (radius / (Math.sin(Math.toRadians(degrees)))) - smallRadius));
        int smallY2 = (int)Math.round((centreY  + (radius / (Math.sin(Math.toRadians(degrees)))) - smallRadius));
        int smallX = (int)Math.round(centreX - smallRadius);

        g.drawArc(greatX1, greatY, 2 * (int)Math.round(greatRadius), 2 * (int)Math.round(greatRadius), 
                  90 + degrees, 180 - ( 2 * degrees));
        g.drawArc(greatX2, greatY, 2 * (int)Math.round(greatRadius), 2 * (int)Math.round(greatRadius), 
                  270 + degrees, 180 - ( 2 * degrees));
        g.drawArc(smallX, smallY1, 2 * (int)Math.round(smallRadius), 2 * (int)Math.round(smallRadius), 
                  270 - degrees, 180 - ( 2 * (90 - degrees)));
        g.drawArc(smallX, smallY2, 2 * (int)Math.round(smallRadius), 2 * (int)Math.round(smallRadius), 
                  90 - degrees, 180 - ( 2 * (90 - degrees)));  

      }

    }

    public static int getRadius(){

      return radius;

    }  

    public static int getX(){

      return centreX;

    }  

     public static int getY(){

      return centreY;

    }   
于 2013-10-31T06:47:16.420 回答