Draw SVG Graphics using Java

15 篇文章 0 订阅
6 篇文章 0 订阅

package tianye.test.rest;

import java.util.Random;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path ("/draw")
public class DrawGraph {
	
	int[] numbers;
	
	public DrawGraph()
	{
		numbers = new int[20];
		
		Random r = new Random();
		
		for(int i=0;i<numbers.length;i++)
		{
			numbers[i] = r.nextInt(30);
		}		
	}
	
	
	private int getMax(int[] intarr)
	{
		int m = intarr[0];
		int c = 0;
		for(int i=1;i<intarr.length;i++)
		{
			c = intarr[i];
			
			if(c > m)
				m = c;
		}
		
		return m;
	}
	
	@GET
	@Produces(MediaType.TEXT_HTML)
	public String getSVGDraw()
	{
		String htmlstr;
		
		int width = 600; 
		int height = 300;		
		int startx = 60;
		int starty = 30;
		
		// if width height ==0 then => error
		
		int maxdatavalue = this.getMax(this.numbers);	
		int datapoints = numbers.length;
		
		String coordi = "<path d='M"+String.valueOf(startx)+" "+String.valueOf(starty)+" L"+String.valueOf(startx)+" "+ 
						String.valueOf(height + starty)+" L"+ String.valueOf(width + startx)+" "+  String.valueOf(height + starty) +
						"' fill='none' stroke='black' stroke-width='2'/>" +
						"<text x='"+String.valueOf(startx - 10)+"' y='"+String.valueOf(starty -10)+"'>y=max:"+String.valueOf(maxdatavalue)+"</text>" +
						"<text x='"+String.valueOf(startx + width + 10)+"' y='"+String.valueOf(starty + height + 10)+"'>x=max:"+String.valueOf(datapoints-1)+"</text>" +
						"<text x='"+String.valueOf(startx - 10)+"' y='"+String.valueOf(height + starty + 10)+"'>0</text>";


		float rw = (float)width / (float)datapoints;
		float rh = (float)height / (float)maxdatavalue;
		
		String points = "";
		
		// System.out.println(height+","+maxdatavalue+","+rh);
		
		for(int i=0;i<datapoints;i++)
		{
			points += " " + String.valueOf((int)(startx + i*rw)) + "," + String.valueOf((starty+height-(float)numbers[i]*(float)rh));
			//System.out.println( " " + String.valueOf(startx + (int)(i*rw)) + "," + String.valueOf((float)starty+(((float)numbers[i])*rh)));
			
		}
		
		int nhl = (int)(height/25); // num of horizontal line
		int nvl = (int)(width/100); // num of vertical line
		
		if(nhl >= maxdatavalue)
			nhl = (int)maxdatavalue;
		
		if(nvl >= datapoints)
			nvl = datapoints;
		
		boolean isdrawdotlinehor = false;
		boolean isdrawdotlinevor = false;
		
		if(nhl >= 1)
			isdrawdotlinehor = true;
		if(nvl >= 1)
			isdrawdotlinevor = true;
						
		String dotLinehor = "";
		String dotLinevor = "";
		
		if(isdrawdotlinehor)
		{
			for(int i=1; i<nhl;i++)
			{
				dotLinehor += "<text x='"+String.valueOf(startx - 10)+"' y='"+String.valueOf(starty + height/nhl*i)+"' text-anchor='end'>"+String.valueOf(maxdatavalue - (int)((float)maxdatavalue/(float)nhl*(float)i))+"</text>"+
								"<line x1='"+String.valueOf(startx)+"' y1='"+String.valueOf(starty + height/nhl*i)+"' x2='"+ String.valueOf(width + startx)+
								"' y2='"+String.valueOf(starty + height/nhl*i)+"' stroke='gray' stroke-dasharray='2'/>";
			}
		}
		
		//System.out.println(nvl);
		
		if(isdrawdotlinevor)
		{
			for(int i=1; i<nvl;i++)
			{
				dotLinehor += "<text x='"+String.valueOf(startx + width/nvl*i)+"' y='"+String.valueOf(starty + height + 20)+"' text-anchor='middle'>"+String.valueOf((int)((float)datapoints/(float)nvl*(float)i))+"</text>"+
								"<line x1='"+String.valueOf(startx + width/nvl*i)+"' y1='"+String.valueOf(starty)+"' x2='"+String.valueOf(startx + width/nvl*i)+
								"' y2='"+String.valueOf(starty + height)+"' stroke='gray' stroke-dasharray='2'/>";
			}
		}
		
		String drawline = "<polyline points='"+points+"' fill='none' stroke='red' />";
		
		String svgstr = "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\"  width='"+String.valueOf(startx + width + 100)+
						"px' height='"+String.valueOf(starty + height + 100)+"px'>" + 
						coordi +
						dotLinehor +
						dotLinevor +
						drawline +
						"</svg>" ; 
		
		htmlstr = " <html>" + 
					"<body>" +
					svgstr +
					"</body>" + 
					"</html>";
		
		return htmlstr;
	}
	
	

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值