简体   繁体   中英

Drawing a Head and Neck in Java. Issue with drawline

Inside the Person Class:

  public Point[] endPointArray;
  private int scalar;
  private Head head;
  private Neck neck;

  public Person(){
    scalar = 1;
    endPointArray = new Point[100];
    for ( int i = 0 ; i < 100 ; i++ ){
      endPointArray[i] = new Point();
    }
    positionArray = new int[4];
    point = new Point(0,0);
    endPointArray[0].x = 5;
    endPointArray[0].y = 5;

    head = new Head(neck, endPointArray, scalar);
    neck = new Neck(body, endPointArray, scalar);
  }

  public void draw(Graphics g){
    head.draw(g);
    neck.draw(g);
  }

Inside the Head Class:

// ---------- CONSTANTS. ----------
  private static int Base_Radius = 20;

  // ---------- VARIABLE DECLARATIONS. ----------
  private int radius;
  private int scale; // Scale determines how large the Head will be.
  private Point startingPoint; //Starting Point for the Person and the Head.
  private Point endingPoint; //Ending Point, where the Neck will start from.
  private Point[] endPointArray; // Contains startingPoint in position [0] by this point from Person.
  private Point centre;
  private Neck neck;

  // ----------------------------------------
  // HEAD CREATION.
  // ----------------------------------------
  public Head(Neck neck, Point[] endPointArray, int scale){

    this.neck = neck;
    this.endPointArray = endPointArray;
    this.scale = scale;

    radius = Base_Radius * scale;
    startingPoint = new Point();
    endingPoint = new Point();
    centre = new Point();

    // Copies the value of endPointArray[0] into startingPoint.
    startingPoint.x = endPointArray[0].x;
    startingPoint.y = endPointArray[0].y;

    // Picks the point on the Head where the Neck will start from.
    endingPoint.x = startingPoint.x + radius;
    endingPoint.y = startingPoint.y + ( 2*radius );

    // Assigns the value of the circles centre to the centre point.
    centre.x = startingPoint.x + radius;
    centre.y = startingPoint.y + radius;
    // Puts the value of the endingPoint into the endPointArray[1].
    endPointArray[1].x = endingPoint.x;
    endPointArray[1].y = endingPoint.y;
  }

  // ----------------------------------------
  // DRAW THE HEAD.
  // ----------------------------------------
  public void draw(Graphics g){
    g.drawOval(startingPoint.x, startingPoint.y, radius, radius);
    System.out.println("Radius : " + radius);
    System.out.println("Head Starting Point : ("+startingPoint.x+","+startingPoint.y+").");
    System.out.println("Head Ending Point : ("+endingPoint.x+","+endingPoint.y+").\n");
  }

Inside the Neck Class:

// ---------- CONSTANTS. ----------
 private static int Base_Length = 10;

 // ---------- VARIABLE DECLARATIONS. ----------
 private int length;
 private int scale; // Scale determines how large the Head will be.
 private Point anglePoint;
 private Point startingPoint; //Starting Point for the Person and the Head.
 private Point endingPoint; //Ending Point, where the Neck will start from.
 private Point[] endPointArray; // Contains startingPoint in position [0] by this point from Person.
 private Body body;

 // ----------------------------------------
 // NECK CREATION.
 // ----------------------------------------
 public Neck(Body body, Point[] endPointArray, int scale){

  this.endPointArray = endPointArray;
  this.body = body;
  this.scale = scale;

  length = Base_Length * scale;
  startingPoint = new Point();
  endingPoint = new Point();
  anglePoint = new Point();

  // Making the startingPoint equal to the endPointArray[1].
  startingPoint.x = endPointArray[1].x;
  startingPoint.y = endPointArray[1].y;

  // Seting the values of the point where the neck finishes.
  endingPoint.x = startingPoint.x;
  endingPoint.y = startingPoint.y + length;

 }

 // ----------------------------------------
 // DRAW THE HEAD.
 // ----------------------------------------
 public void draw(Graphics g){
    g.drawLine(startingPoint.x, startingPoint.y, endingPoint.x, endingPoint.y);
    System.out.println("Neck Starting Point : ("+startingPoint.x+","+startingPoint.y+").");
    System.out.println("Neck Ending Point : ("+endingPoint.x+","+endingPoint.y+").");
  }

Output:

Radius : 20

Head Starting Point : (5,5).

Head Ending Point : (25,45).

Neck Starting Point : (25,45).

Neck Ending Point : (25,55).

The Head is drawn in the Panel at 5,5 and seems to have the right radius. The neck is floating apart from the head a way away from it. The output seems to look right, but visually it is incorrect. The neck is supposed to be a horizontal line downwards from the base of the head and I don't know why it isn't behaving the way I expect it to. Sorry if this is a newbie question but I am quite stuck at the moment.

The problem is that drawOval takes width and height as parameters but you're passing in the radius. You need to use:

g.drawOval(startingPoint.x, startingPoint.y, 2 * radius, 2 * radius);

From the API :

public abstract void drawOval(int x, int y, int width, int height)
    Draws the outline of an oval. The result is a circle or ellipse that fits within the rectangle specified by the x, y, width, and height arguments.
    The oval covers an area that is width + 1 pixels wide and height + 1 pixels tall.

Parameters:
    x - the x coordinate of the upper left corner of the oval to be drawn.
    y - the y coordinate of the upper left corner of the oval to be drawn.
    width - the width of the oval to be drawn.
    height - the height of the oval to be drawn.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM