Как я могу поместить круги в центр строки?

#java #draw

#java #рисовать

Вопрос:

У меня есть диагональная линия, и у меня также есть круги с расстоянием 100 метров. Проблема в том, что круги на самом деле не находятся в центре строки. Я знаю, что это очень просто, но я просто не понимаю, как это сделать .. Может кто-нибудь помочь мне, как поместить круги в центр строки?

Вот что я пробовал до сих пор :

 public void paint(Graphics g)
{
    super.paint(g);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setBackground(Color.white);

    int x0_pixel = 0;
    int y0_pixel = 0;

    int x1_pixel = getWidth();
    int y1_pixel = getHeight();

    int x0_world = 0;
    int y0_world = 0;
    double x1_world = 2000; // meters
    double y1_world = 1125; // meters

    double x_ratio = (double) x1_pixel / x1_world;
    double y_ratio = (double) y1_pixel / y1_world;

    int xFrom = 0;
    int yFrom = 0;

    double xTo = x1_world;
    double yTo = y1_world;

    int FromX_pixel = convertToPixelX(xFrom, x_ratio);
    int FromY_pixel = convertToPixelY(y1_pixel, yFrom, y_ratio);

    int ToX_pixel = convertToPixelX((int) xTo, x_ratio);
    int ToY_pixel = convertToPixelY(y1_pixel, (int) yTo, y_ratio);

    g2d.setColor(Color.RED);
    g2d.drawLine(FromX_pixel, FromY_pixel, ToX_pixel, ToY_pixel);

    double theta = Math.atan(yTo / xTo);

    int len = (int) Math.sqrt(xTo * xTo   yTo * yTo);

    int interval = 100;

    final double cosTheta = Math.cos(theta);
    final double sinTheta = Math.sin(theta);

    for (int distance = xFrom; distance <= len; distance  = interval)
    {

        double distance_x = distance * cosTheta;
        double distance_y = distance * sinTheta;

        int x_circle_pixel = convertToPixelX(distance_x, x_ratio);
        int y_circle_pixel = convertToPixelY(y1_pixel, distance_y, y_ratio);

        g2d.drawOval(x_circle_pixel, y_circle_pixel, 50, 50);

        g2d.setColor(Color.BLUE);

    }

    Toolkit.getDefaultToolkit().

            sync();

    g2d.dispose();

}

private static int convertToPixelY(int y_offset, double y_world, double y_ratio)
{
    return (int) (y_offset - (y_world * y_ratio));
}

private static int convertToPixelX(double x_world, double x_ratio)
{
    return (int) (x_world * x_ratio);
}
  

Комментарии:

1. Некоторые комментарии и описания того, что делает ваш код, очень помогли бы . Кроме того , SSCCE даст вам наилучшую надежду на быстрый полезный ответ.

Ответ №1:

Когда вы рисуете овал, первые два параметра — это верхний левый угол прямоугольника, в котором находится овал. Следующие два параметра — это ширина и высота этого же ограничивающего прямоугольника. Ваш текущий код помещает верхний левый угол на саму линию, но на самом деле вы хотите, чтобы центр ограничивающего прямоугольника был размещен на линии. Решение вашей проблемы — просто сдвинуть верхний левый угол на 1/2 диаметра. Ваш код должен иметь что-то вроде так:

 public class GraphicsFoo extends JPanel {
   // avoid using magic numbers:
   private static final int CIRCLE_DIAMETER = 50; 

   //....

   // override a JComponent's paintComponent method, not its paint method
   @Override
   protected void paintComponent(Graphics g) {
       super.paintComponent(g);

       Graphics2D g2d = (Graphics2D) g;
       g2d.setBackground(Color.white);

       // make your graphics smooth
       g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
             RenderingHints.VALUE_ANTIALIAS_ON);

       // ...

       final double cosTheta = Math.cos(theta);
       final double sinTheta = Math.sin(theta);

       for (int distance = xFrom; distance <= len; distance  = interval)
       {

           //....

           // *** here's the key: ***    
           g2d.drawOval(
              x_circle_pixel - CIRCLE_DIAMETER / 2, 
              y_circle_pixel - CIRCLE_DIAMETER / 2, 
              CIRCLE_DIAMETER, CIRCLE_DIAMETER);

           g2d.setColor(Color.BLUE);

       }
  

Комментарии:

1. извините за поздний ответ, на самом деле моя проблема — единственная часть рисования овала, и вы даете мне точный код для этого .. tnx .. это работает.. Я принимаю ваш ответ .. 😉