Computar um polígono que envolve uma linha multiponto

Estou tentando calcular um polígono que envolve uma linha que conecta vários pontos (por exemplo, uma pista GPX). A imagem abaixo mostra um exemplo com a faixa como linha vermelha e o polígono desejado em azul.

omo simplificação, os pontos vermelhos são indicados por xey, não por latitude / longitud

Como calcular esse ambiente (polígono azul claro) se eu tiver apenas a lista dos três pontos que especificam o caminho?

Soluções parciais (por exemplo, apenas dois pontos) ou dicas sobre bibliotecas matemáticas (em Java) que fornecem algoritmos para esse cálculo também me trariam um passo à frent

ais suposições:

A faixa é livre de interseção.

Atualizar Usando a abordagem apresentada por Rogach e xan, tive alguns problemas se o ângulo entre as linhas for menor que 90 graus ou maior que 270 graus: Como você pode ver, o polígono é interceptado, o que leva a um problema séri

Do meu ponto de vista usando umjava.awt.geom.Area é a melhor abordagem:

Minha solução (baseada no código de Rogach):

Para cada linha que conecta dois pontos da trilha, eu calculo um polígono ao redor. Depois, adiciono (união de área) o polígono computado a uma Área que faz todo o cálculo necessário para mim. Como a Área usa estritamente o algoritmo "ou" para adicionar novos polígonos, não preciso me preocupar com as "auto-interseções" do polígono, conforme apresentado na atualização acima.

Area area = new Area();
for (int i = 1; i < points.size(); i++) {
    Point2D point1 = points.get(i - 1);
    Point2D point2 = points.get(i);

    Line2D.Double ln = new Line2D.Double(point1.getX(), point1.getY(), point2.getX(), point2.getY());
    double indent = 15.0; // distance from central line
    double length = ln.getP1().distance(ln.getP2());

    double dx_li = (ln.getX2() - ln.getX1()) / length * indent;
    double dy_li = (ln.getY2() - ln.getY1()) / length * indent;

    // moved p1 point
    double p1X = ln.getX1() - dx_li;
    double p1Y = ln.getY1() - dy_li;

    // line moved to the left
    double lX1 = ln.getX1() - dy_li;
    double lY1 = ln.getY1() + dx_li;
    double lX2 = ln.getX2() - dy_li;
    double lY2 = ln.getY2() + dx_li;

    // moved p2 point
    double p2X = ln.getX2() + dx_li;
    double p2Y = ln.getY2() + dy_li;

    // line moved to the right
    double rX1_ = ln.getX1() + dy_li;
    double rY1 = ln.getY1() - dx_li;
    double rX2 = ln.getX2() + dy_li;
    double rY2 = ln.getY2() - dx_li;

    Path2D p = new Path2D.Double();
    p.moveTo(lX1, lY1);
    p.lineTo(lX2, lY2);
    p.lineTo(p2X, p2Y);
    p.lineTo(rX2, rY2);
    p.lineTo(rX1_, rY1);
    p.lineTo(p1X, p1Y);
    p.lineTo(lX1, lY1);

    area.add(new Area(p));
}

questionAnswers(4)

yourAnswerToTheQuestion