欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

菜鸟学Java: Java 2D绘图,

来源: javaer 分享于  点击 11302 次 点评:181

菜鸟学Java: Java 2D绘图,


以前从没有接触过Java的2D绘图,由于工作的需要,我要绘制一个根据log文件得到各个组件之间通信的图片。所以,我只能从头开始学习了。那我说说我学习的历程吧。

1 在网上下载了一些Java绘图的小程序,对Java绘图有了一个直观上的认识。如:Java的绘图板的小程序(百度一下就有很多的)

2 根据Java官方的tutorial教程,逐步对Java绘图有了较高层次的认识,Java 2D的demo,我上传到了CSDN,链接:http://download.csdn.net/detail/xuanyuanlei1020/8460299点击打开链接,这个demo我在eclipse中测试都是可以的。

3 开始解决实际问题。

我在解决实际问题的时候是将每两个组件通信都作为一个类,为以后的操作提供了方便,并从新创建了一个绘图的类,里面包含了各个组件的颜色和绘制连线的方法,并在里面初始化各个组件的初始坐标。

遇到的问题:我开始是使用Java的QuadCurve2D.Double类(二次曲线)进行曲线连线的绘制,但是我要在这条曲线上写字,主要是序号,用以告知使用者消息传递的顺序。(我还没有实现文字按照曲线的进行排列,如果我做的话,首先我得算出这条曲线的斜率,然后将文字按照曲线上的点的坐标和斜率排列和旋转字体)。但是使用这个类我并没有找到怎么在这条曲线上绘制字符串(也许是我太笨了,如果您知道,请告诉我)。于是,我开始使用自己的知道的起止点坐标和控制点坐标,进行贝塞尔曲线二次形式的插值,这样我就可以知道这条曲线上n个点(取决于自己插值的数量),这样我就可以实现在曲线的中间进行序号的标出。(如果以后要实现字体方向和与曲线的切线垂直,这样也好算出曲线的斜率)

相关的代码:

1 得到1000个相关点

<span >	/**
	 * Method Name:bezier2
	 * Purpose:use this method to instead the QuadeCurve2D.Double class.
	 */
	public static Point2D.Double[] bezier2(Point2D.Double sp,
			Point2D.Double ctrp, Point2D.Double ep)
	{
		int num = 1000;
		Point2D.Double[] p = new Point2D.Double[num];

		for (int i = 0; i < num; i++)
		{
			double u = (double) i / num;
			double x = sp.x * (1 - u) * (1 - u) + 2 * ctrp.x * (1 - u) * u
					+ ep.x * u * u;
			double y = sp.y * (1 - u) * (1 - u) + 2 * ctrp.y * (1 - u) * u
					+ ep.y * u * u;
			p[i] = new Point2D.Double(x, y);
		}

		return p;
	}</span>


2 进行绘制

/**
		 * curve
		 */
		double ctrx = (startPoint.x + endPoint.x) / 2 + gap * (index / 2);//gap 是用于将分离相同起止点的连线
		double ctry = (startPoint.y + endPoint.y) / 2;
		if(startPoint.y == endPoint.y)
		{
			ctrx = (startPoint.x + endPoint.x) / 2;
			ctry = (startPoint.y + endPoint.y) / 2 + gap * (index / 2);

		}
		Point2D.Double ctrP = new Point2D.Double(ctrx, ctry);
		Point2D.Double[] pathPoint = bezier2(startPoint, ctrP, endPoint);

		GeneralPath gp = new GeneralPath();
		int startIndex = 30;
		int endIndex = pathPoint.length - 30;
		gp.moveTo(pathPoint[startIndex].x, pathPoint[startIndex].y);
		for (int i = startIndex + 1; i < endIndex; i++)
		{
			gp.lineTo(pathPoint[i].x, pathPoint[i].y);
		}

		g2.draw(gp);
		/**
		 * draw string 绘制序号
		 */
		double strPX = pathPoint[pathPoint.length / 2 + index * 10].x;
		double strPY = pathPoint[pathPoint.length / 2 + index * 10].y;
		Font f1 = g2.getFont();
		Font f = new Font("Dialog", Font.BOLD, 10);
		g2.setFont(f);
		g2.setColor(Color.blue);
		FontMetrics fm = (FontMetrics) g2.getFontMetrics(f);
		int h = fm.getHeight();
		int strW = fm.stringWidth(String.valueOf(sequence));
		g2.drawString(String.valueOf(sequence), (float) (strPX - strW / 2),
				(float) (strPY + h / 3));
		g2.setFont(f1);

		g2.setColor(c1);

好吧,我现在只能搞到这样了。

相关文章

    暂无相关文章
相关栏目:

用户点评