绘制曲线,任何建议

时间:2013-10-31 06:28:58

标签: java geometry draw curve

大家好我需要用粗体绘制曲线,主要是那些以N-S开头的曲线,如果可能的话,那些曲线是350-10 340-20等等。我尝试过QuadCurve2D和drawArc,但没有人做过这项工作。有没有办法可以避免使用drawPolyline(xPoints,yPoints,WIDTH),因为它需要数百对才能绘制一条线。

enter image description here

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

        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);

2 个答案:

答案 0 :(得分:1)

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

....
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次击打,然后使用它。

答案 1 :(得分: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;

    }