菜鸟学Java: Java 2D绘图,
分享于 点击 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);
好吧,我现在只能搞到这样了。
相关文章
- 暂无相关文章
用户点评