Создание многоугольника из линии
Я хочу нарисовать линию с толщиной в j2me. Это может быть легко достигнуто в desktop java, установив ширину пера в качестве значения толщины. Однако в J2ME класс Pen не поддерживает ширину. Моя идея состоит в том, чтобы создать многоугольник из линии, которая похожа на линию с толщиной, которую я хочу нарисовать. На картинке слева то, что у меня есть, линия с точками. Справа-то, что я хочу, многоугольник, который при заполнении-линия с толщиной. Может ли кто-нибудь знать, как создать полигон из линия?
alt текст http://www.freeimagehosting.net/uploads/140e43c2d2.gif
4 ответов
Ах, если вы предварительно обрабатываете, это должно облегчить вашу жизнь. Вот небольшой код, который я взбил с помощью 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;
}
}
}
}
вот мои результаты после перевода этих координат:
это нарисует линию:
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]);
вопрос не очень понятен... надеюсь, это поможет
думаю, я нарисую параллельные линии рядом с линией и соединю их как многоугольник. Чем заполнить. Чтобы провести параллельную линию, нарисуйте параллельную линию.
к сожалению, общий алгоритм для этого довольно сложный, и если вы рисуете карту, вам, вероятно, нужен общий алгоритм... Библиотека TinyLine выглядит многообещающе, если вы можете потратить деньги, см., например:
http://www.tinyline.com/2d/download/guide/gstate.html#joinStyle
скорее всего, это поможет вам с другими вещами, которые вы захотите сделать при рисовании карты.
Я не использовал библиотеку (или сделали любое Программирование J2ME, честно говоря), но если он делает то, что он утверждает, это, вероятно, стоит денег.