Java 1.5 Проблема с рисованием фигуры с использованием линий и углов - PullRequest
0 голосов
/ 31 октября 2010

Эй, я пытаюсь написать метод, который берет начальную декартову координату (x, y), угол (в градусах), длину и количество сторон и рисует форму для апплета.Пока это то, что у меня есть, но я не могу понять, что я делаю неправильно.Я планирую использовать преобразования линий для фактического изменения угла, и это еще не записано, но логика для рисования линии под углом должна работать, но не настолько, насколько я могу судить.Могу ли я получить пару новых глаз, чтобы посмотреть на это и сказать мне, если я что-то упустил.

public void paint(Graphics g)
{
    g.setColor(Color.BLACK);
    Point startPt = new Point(0,0);
    //Function in question  
    drawRegularPolygon(g, startPt, 5,60,50);    
}

public static void drawRegularPolygon(Graphics g, Point2D startPoint, int numOfSides, int angle, int length)
{

    Point2D current = startPoint;
    for(int i=0; i<numOfSides; i++)
    {
        drawAngularLine(g, current, angle, length);
        current = getEndPoint(current ,length,angle);
    }
}

public static void drawAngularLine(Graphics g, Point2D startPoint, int angle, int length)
{
    g.setColor(Color.BLACK);
    Point2D endPoint = getEndPoint(startPoint, length, angle);
    ((Graphics2D) g).draw(new Line2D.Double(startPoint, endPoint));
}

private static Point2D getEndPoint(Point2D p, int length, int angle)
{
    //Starting point you know (x1, x2), 
    //end point is (x1 + l * cos(ang), y1 + l * sin(ang)) 
    //where l is the length and ang is the angle.
    Point2D retVal = p; 
    double x = Math.cos(Math.toRadians(angle)*length+p.getX());
    double y = Math.sin(Math.toRadians(angle)*length+p.getY());
    retVal.setLocation(x,y);
    return retVal;
}

Ответы [ 2 ]

1 голос
/ 31 октября 2010

Пара вещей. Первое - быть осторожным в том, что вы принимаете за грех / косинус. Это не cos (угол * длина), а длина * cos (угол).

Второй момент - подумать о системах координат. Это может помочь сделать математику, предполагая, что начальная точка равна (0,0), а затем перевести на экранные координаты. Это помогает избежать путаницы с осью Y, которая кажется перевернутой (значения увеличиваются сверху вниз).

Итак, если мы просто хотим, чтобы точка, длина которой находилась под углом от начала координат в стандартной правой системе, мы получили бы:

x1 = length * cos(angle)
y1 = length * sin(angle)

Но так как отрицательный у у, мы на самом деле хотим

x2 = length * cos(angle)
y2 = -length * sin(angle)

Чтобы мысленно проверить это, представьте, что вы выполняете эту математику в начале координат (0,0), которое находится в верхнем левом углу и имеет угол 45 °. Если бы y2 был положительным, мы бы в конечном итоге увидели угол, который выглядит для нас как -45 °.

Теперь переведите начало координат в нашу начальную точку (x_i, y_i), чтобы получить наши окончательные значения:

x_f = x_i + length * cos(angle)
y_f = y_i + (-length * cos(angle)) = y_i - length * cos(angle)

В качестве альтернативы, если имеет больше смысла работать в стандартной правосторонней системе координат, вы, вероятно, могли бы избежать выполнения всей математики, как если бы (0,0) находилось в центре, а затем применить перевод и Зеркальное преобразование оси Y, но эта система координат экрана не слишком сложна для работы, когда вы привыкнете переключать значения y вокруг.

1 голос
/ 31 октября 2010

Вы рисуете линию с одинаковой начальной и конечной точкой, поэтому ничто не рисуется.

Объекты Java передаются по ссылке, поэтому:

private static Point2D getEndPoint(Point2D p, int length, int angle){
   Point2D retVal = p;
   retVal.setLocation(x,y);
   return retVal;
}

также меняет начальную точку p. Таким образом, он рисует линию длиной 1 (показывает ли она точку на экране?).

Попробуйте использовать:

Point2D retVal = p.clone();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...