Путь JavaFX: ненужные строки - PullRequest
       37

Путь JavaFX: ненужные строки

0 голосов
/ 24 октября 2018

Я пытаюсь нарисовать гоночную трассу, по очереди, используя JavaFX.

Я разграничиваю дорожки, рисуя фигуры с путем на моем GraphicsContext.

Проблема в том, что яникогда не заставлял работать arcTo, поэтому я использую дугу, которая, как я понял, всегда рисует против часовой стрелки, и это затрудняет рисование моих поворотов, вот лучший результат, который я получил:

malformed track

innerRadius - это расстояние между центром и (x1, y1), а radius - это расстояние между центром и (x0, y0).

Вот мойкод:

    gc.beginPath();

    gc.moveTo(x1, y1);
    gc.lineTo(x0, y0);

    gc.arc(centerX, centerY, radius, radius, startAngle, arcLength);

    gc.lineTo(x3, y3);

    gc.arc(centerX, centerY, innerRadius, innerRadius, startAngle, arcLength);

    gc.closePath();

Я не знаю, как сделать так, чтобы путь не включал строку от (x2, y2) до (x1, y1).Я бы предпочел придерживаться arc, но если вы знаете, как заставить arcTo работать с имеющимися у меня переменными, продолжайте.

Спасибо.

1 Ответ

0 голосов
/ 24 октября 2018

Проблема в этой строке:

gc.arc(centerX, centerY, innerRadius, innerRadius, startAngle, arcLength);

Здесь начальный угол "вниз", и дуга должна быть нарисована против часовой стрелки так же, как была нарисована внешняя дуга.Вы хотите нарисовать дугу в противоположном направлении, хотя для нее необходимо использовать другие параметры:

gc.arc(centerX, centerY, innerRadius, innerRadius, startAngle + arcLength, -arcLength);

Вы также можете избавиться от одного из lineTo s, так как closePath автоматически делаетдля подключения к началу пути.

@Override
public void start(Stage stage) {
    Canvas canvas = new Canvas(400, 400);
    GraphicsContext gc = canvas.getGraphicsContext2D();
    gc.setStroke(Color.BLACK);
    gc.setFill(Color.LIGHTGRAY);

    final double centerX = 100;
    final double centerY = 200;

    final double dR = 20;
    final double radius = (350 - centerY) / 2;
    final double innerRadius = radius - dR;

    final double x0 = centerX;
    final double y0 = centerY + radius;

    final double x3 = x0 + innerRadius;
    final double y3 = centerY;

    final double startAngle = 270;
    final double arcLength = 90;

    gc.beginPath();

    gc.moveTo(x0, y0);
    gc.arc(centerX, centerY, radius, radius, startAngle, arcLength);
    gc.lineTo(x3, y3);
    gc.arc(centerX, centerY, innerRadius, innerRadius, startAngle + arcLength, -arcLength);

    gc.closePath();

    gc.fill();
    gc.stroke();

    Scene scene = new Scene(new StackPane(canvas));

    stage.setScene(scene);
    stage.show();
}
...