Question

Hello guys I need to draw the curved lines in bold mainly those starting N - S and if possible the ones getting 350-10 340-20 and so on. I have tried QuadCurve2D and drawArc, but none of those worked. Is there any way possible to avoid the use of drawPolyline(xPoints, yPoints, WIDTH) because it will take hundreds of pairs to draw just one line.

enter image description here

This is part of the code in order to avoid your loss of time testing yourself :

        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);
Was it helpful?

Solution 2

Im not sure if this is an really an answer - but have I have run into a resolution problem. I have tried anti-aliasing but it looked worse. One way you could do it is in the for loop put an if statement for odd and even numbers.Happy for some advice on this, I was thinking there maybe a better library to get nicer circles. Maybe I'm doing it the old school way?

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;

    }   

OTHER TIPS

If you need bold lines, try so:

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

Make 2 strokes for two types of lines, and use it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top