Monday 15 August 2011

java - Drawing a diamond with Polygon on the end of a Line2D -



java - Drawing a diamond with Polygon on the end of a Line2D -

i'm trying draw diamond (for composition uml relationship). right now, making triangle this:

but want create this:

and triangle code:

private void drawarrowhead(graphics2d g2, point tip, point tail, color color) { g2.setpaint(color); double dy = tip.y - tail.y; double dx = tip.x - tail.x; double theta = math.atan2(dy, dx); double x, y, rho = theta + phi; point p1 = new point(); point p2 = new point(); p1.setlocation(tip.x - barb * math.cos(rho), tip.y - barb * math.sin(rho)); rho = theta - phi; p2.setlocation(tip.x - barb * math.cos(rho), tip.y - barb * math.sin(rho)); int[] xpoints = new int[5]; int[] ypoints = new int[5]; xpoints[0] = tip.x; xpoints[1] = p1.x; xpoints[2] = p2.x; ypoints[0] = tip.y; ypoints[1] = p1.y; ypoints[2] = p2.y; g2.setpaint(color.black); shape shape = new polygon(xpoints, ypoints, 3); g2.fill(shape); //tip.x - barb * math.cos(rho); //y = tip.y - barb * math.sin(rho); }

does have thought on how create diamond out of this? :)

import java.awt.basicstroke; import java.awt.color; import java.awt.cursor; import java.awt.eventqueue; import java.awt.graphics; import java.awt.graphics2d; import java.awt.panel; import java.awt.point; import java.awt.polygon; import java.awt.renderinghints; import java.awt.shape; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.geom.line2d; import java.awt.geom.point2d; import java.awt.geom.rectangle2d; import java.util.arraylist; import java.util.list; import javax.swing.jframe; import javax.swing.jmenubar; import javax.swing.jmenuitem; import javax.swing.jpanel; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception; public class drawarrows { public static void main(string[] args) { new drawarrows(); } public drawarrows() { eventqueue.invokelater(new runnable() { @override public void run() { seek { uimanager.setlookandfeel(uimanager .getsystemlookandfeelclassname()); } grab (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) { ex.printstacktrace(); } jframe frame = new umlwindow(); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.setbounds(30, 30, 1000, 700); frame.getcontentpane().setbackground(color.white); frame.setvisible(true); frame.setlocationrelativeto(null); } }); } public static class umlwindow extends jframe { shapes shapelist = new shapes(); panel panel; private static final long serialversionuid = 1l; public umlwindow() { addmenus(); panel = new panel(); } public void addmenus() { getcontentpane().add(shapelist); setsize(300, 200); setlocationrelativeto(null); setdefaultcloseoperation(exit_on_close); jmenuitem linemenuitem = new jmenuitem("new line"); linemenuitem.addactionlistener(new actionlistener() { public void actionperformed(actionevent event) { system.out.println("adding line"); shapelist.addline(); } }); jmenubar menubar = new jmenubar(); menubar.add(linemenuitem); setjmenubar(menubar); } } public static class shapes extends jpanel { private static final long serialversionuid = 1l; private list<line2d.double> lines = new arraylist<line2d.double>(); private boolean drawing = false; private point linestartingpoint = new point(); private point lineendingpoint = new point(); private line2d.double linepath; double phi = math.toradians(40); int barb = 20; public shapes() { mymouseadapter mymouseadapter = new mymouseadapter(); addmouselistener(mymouseadapter); addmousemotionlistener(mymouseadapter); this.setopaque(true); this.setbackground(color.white); // set canvas color } public void addline() { drawing = true; repaint(); } @override protected void paintcomponent(graphics g) { super.paintcomponent(g); graphics2d g2 = (graphics2d) g; g2.setstroke(new basicstroke(2)); if (drawing) { g2.setrenderinghint(renderinghints.key_antialiasing, renderinghints.value_antialias_on); g2.setstroke(new basicstroke(2)); g2.drawline(linestartingpoint.x, linestartingpoint.y, lineendingpoint.x, lineendingpoint.y); drawarrowhead(g2, lineendingpoint, linestartingpoint, color.black); } (line2d line : lines) { g2.setcolor(color.black); point sw = new point((int) line.getx1(), (int) line.gety1()); point ne = new point((int) line.getx2(), (int) line.gety2()); g2.draw(line); drawarrowhead(g2, ne, sw, color.black); } } public rectangle2d drawrect(int x, int y) { homecoming new rectangle2d.double(x - 4, y - 4, 8, 8); } private void drawarrowhead(graphics2d g2, point tip, point tail, color color) { g2.setpaint(color); double dy = tip.y - tail.y; double dx = tip.x - tail.x; double theta = math.atan2(dy, dx); double x, y, rho = theta + phi; point p1 = new point(); point p2 = new point(); p1.setlocation(tip.x - barb * math.cos(rho), tip.y - barb * math.sin(rho)); rho = theta - phi; p2.setlocation(tip.x - barb * math.cos(rho), tip.y - barb * math.sin(rho)); int[] xpoints = new int[5]; int[] ypoints = new int[5]; xpoints[0] = tip.x; xpoints[1] = p1.x; xpoints[2] = p2.x; ypoints[0] = tip.y; ypoints[1] = p1.y; ypoints[2] = p2.y; g2.setpaint(color.black); shape shape = new polygon(xpoints, ypoints, 3); g2.fill(shape); //tip.x - barb * math.cos(rho); //y = tip.y - barb * math.sin(rho); } class mymouseadapter extends mouseadapter { int currentindex; point2d.double startpoint = new point2d.double(); point2d.double endpoint = new point2d.double(); boolean resizing = false; @override public void mousepressed(mouseevent e) { if (drawing) { linestartingpoint = e.getpoint(); lineendingpoint = linestartingpoint; } } @override public void mousedragged(mouseevent e) { if (drawing) { lineendingpoint = e.getpoint(); repaint(); system.out.println(lines.size()); } } @override public void mousereleased(mouseevent e) { if (drawing) { drawline(e); } drawing = false; } @override public void mousemoved(mouseevent e) { } public void drawline(mouseevent e) { drawing = false; lineendingpoint = e.getpoint(); linepath = new line2d.double(linestartingpoint.getx(), linestartingpoint.gety(), lineendingpoint.getx(), lineendingpoint.gety()); lines.add(linepath); repaint(); } } } }

personally, focus on generating shape , using graphics2d api perform translation , transformation...

the shape api makes easy generate complex shapes, example, diamond shape used in next example...

public class diamondshape extends path2d.double { public diamondshape(int width, int height) { moveto(width / 2, 0); lineto(width, height / 2); lineto(width / 2, height); lineto(0, height / 2); closepath(); } }

it's short, simple , (for part), easy understand...

"but needs rotate" hear say, of course, graphics api provides awesome , simple functionality accomplish that, allow heavy lifting. however, if need transform shape, shape api can (transform shape itself)

import java.awt.basicstroke; import java.awt.color; import java.awt.dimension; import java.awt.eventqueue; import java.awt.graphics; import java.awt.graphics2d; import java.awt.point; import java.awt.renderinghints; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.geom.affinetransform; import java.awt.geom.path2d; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception; public class followme { public static void main(string[] args) { new followme(); } public followme() { eventqueue.invokelater(new runnable() { @override public void run() { seek { uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname()); } grab (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) { ex.printstacktrace(); } jframe frame = new jframe("testing"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.add(new testpane()); frame.pack(); frame.setlocationrelativeto(null); frame.setvisible(true); } }); } public class testpane extends jpanel { private point mousepoint; private diamondshape head; public testpane() { head = new diamondshape(10, 20); addmousemotionlistener(new mouseadapter() { @override public void mousemoved(mouseevent e) { mousepoint = e.getpoint(); repaint(); } }); } @override public dimension getpreferredsize() { homecoming new dimension(200, 200); } @override protected void paintcomponent(graphics g) { super.paintcomponent(g); graphics2d g2d = (graphics2d) g.create(); g2d.setrenderinghint(renderinghints.key_alpha_interpolation, renderinghints.value_alpha_interpolation_quality); g2d.setrenderinghint(renderinghints.key_antialiasing, renderinghints.value_antialias_on); g2d.setrenderinghint(renderinghints.key_color_rendering, renderinghints.value_color_render_quality); g2d.setrenderinghint(renderinghints.key_dithering, renderinghints.value_dither_enable); g2d.setrenderinghint(renderinghints.key_fractionalmetrics, renderinghints.value_fractionalmetrics_on); g2d.setrenderinghint(renderinghints.key_interpolation, renderinghints.value_interpolation_bilinear); g2d.setrenderinghint(renderinghints.key_rendering, renderinghints.value_render_quality); g2d.setrenderinghint(renderinghints.key_stroke_control, renderinghints.value_stroke_pure); double rotation = 0f; int width = getwidth() - 1; int height = getheight() - 1; if (mousepoint != null) { int x = width / 2; int y = height / 2; int deltax = mousepoint.x - x; int deltay = mousepoint.y - y; rotation = -math.atan2(deltax, deltay); rotation = math.todegrees(rotation) + 180; } g2d.rotate(math.toradians(rotation), width / 2, height / 2); int x = width / 2; int y = height / 2; g2d.setstroke(new basicstroke(3)); g2d.setcolor(color.red); g2d.drawline(x, y, x, y - height / 4); y -= height / 4 + (head.getbounds().height); x -= head.getbounds().width / 2; g2d.fill(head.createtransformedshape(affinetransform.gettranslateinstance(x, y))); g2d.dispose(); g2d.dispose(); } } public class diamondshape extends path2d.double { public diamondshape(int width, int height) { moveto(width / 2, 0); lineto(width, height / 2); lineto(width / 2, height); lineto(0, height / 2); closepath(); } } }

java swing java-2d shapes

No comments:

Post a Comment