Создать многоугольник из линии - PullRequest
7 голосов
/ 13 мая 2010

Я хочу нарисовать линию с толщиной в j2me. Это может быть легко достигнуто в настольном Java, установив ширину пера в качестве значения толщины. Однако в j2me класс Pen не поддерживает ширину. Моя идея состоит в том, чтобы создать многоугольник из линии, которая у меня есть, которая напоминает линию с толщиной, которую я хочу нарисовать. На рисунке слева есть линия с точками. Справа есть то, что я хочу, многоугольник, который при заполнении, линия с толщиной. Может кто-нибудь знает, как создать многоугольник из линии?

альтернативный текст http://www.freeimagehosting.net/uploads/140e43c2d2.gif

Ответы [ 4 ]

4 голосов
/ 15 мая 2010

Ах, если вы проводите предварительную обработку, это должно облегчить вашу жизнь. Вот небольшой код, который я написал с помощью Graphics2D (используя J2SE). Мне не нравится, что вывод включает в себя дополнительные внутренние сегменты, но когда он заполнен, он выглядит довольно хорошо.

import java.awt.BasicStroke;
import java.awt.Shape;
import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;

public class StrokePath
{
    public static void main(String[] args)
    {
        // set line width to 6, use bevel for line joins
        BasicStroke bs = new BasicStroke(6.0f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_BEVEL);

        // create a path for the input
        Path2D p = new Path2D.Float();
        p.moveTo(50.0, 50.0);
        p.lineTo(65.0, 100.0);
        p.lineTo(70.0, 60.0);
        p.lineTo(120.0, 65.0);
        p.lineTo(40.0, 200.0);

        // create outline of wide lines by stroking the path with the stroke
        Shape s = bs.createStrokedShape(p);
        // output each of the segments of the stroked path for the output polygon
        PathIterator pi = s.getPathIterator(null);
        while (!pi.isDone())
        {
            pi.next();
            double[] coords = new double[6];
            int type = pi.currentSegment(coords);
            switch (type)
            {
            case PathIterator.SEG_LINETO:
                System.out.println(String.format("SEG_LINETO %f,%f", coords[0], coords[1]));
                break;
            case PathIterator.SEG_CLOSE:
                System.out.println("SEG_CLOSE");
                break;
            case PathIterator.SEG_MOVETO:
                System.out.println(String.format("SEG_MOVETO %f,%f", coords[0], coords[1]));
                break;
            default:
                System.out.println("*** More complicated than LINETO... Maybe should use FlatteningPathIterator? ***");
                break;
            }
        }
    }
}

Вот мои результаты после рендеринга этих координат:

Unfilled Filled

0 голосов
/ 13 мая 2010

Полагаю, я нарисую параллельные линии рядом с линией и соединю их в виде многоугольника. Чем заполнить. Чтобы нарисовать параллельную линию, Нарисуйте параллельную линию .

0 голосов
/ 14 мая 2010

К сожалению, общий алгоритм для этого довольно сложный, и если вы рисуете карту, вам, вероятно, нужен общий алгоритм ... Библиотека TinyLine выглядит многообещающе, если вы можете потратить деньги, см., Например:

http://www.tinyline.com/2d/download/guide/gstate.html#joinStyle

Скорее всего, это поможет вам и с другими вещами, которые вы захотите сделать при рисовании своей карты.

Я не использовал библиотеку (или, честно говоря, не занимался программированием на J2ME), но если она делает то, что заявляет, она, вероятно, стоит денег.

0 голосов
/ 13 мая 2010

Это нарисует линию:

Graphics g = this.CreateGraphics();
Pen pen = new Pen(Color.Black, 2); //black Width 2
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid;
g.DrawLine(pen, point1, point2); //point1 and point2 are instances of Point class

Так что, если у вас есть множество точек, вы можете сделать что-то вроде

for(int i=0;i<myPoints.Length-1;i++)
g.DrawLine(pen,myPoints[i],myPoints[i+1]); 

вопрос не очень понятен ... надеюсь, это поможет

...