⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stackedcylinderrenderer.java

📁 加入Jfreechart1.05直接运行即可.(立体圆柱表示水位效果)使用Jfreechart实现的层叠圆柱体效果.
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	 * @param state
	 *            the state.
	 * @param dataArea
	 *            the data area (adjusted for the 3D effect).
	 * @param plot
	 *            the plot.
	 * @param domainAxis
	 *            the domain axis.
	 * @param rangeAxis
	 *            the range axis.
	 * @param dataset
	 *            the dataset.
	 * 
	 * @since 1.0.4
	 */
	protected void drawStackVertical(List values, Comparable category,
			Graphics2D g2, CategoryItemRendererState state,
			Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis,
			ValueAxis rangeAxis, CategoryDataset dataset)
	{

		int column = dataset.getColumnIndex(category);
		/**
		 * CategoryAxis  //An axis that displays categories. 
		 * CategoryAxis.getCategoryMiddle() //Returns the middle coordinate for the specified category.
		 */
		double barX0 = domainAxis.getCategoryMiddle(column, dataset
				.getColumnCount(), dataArea, plot.getDomainAxisEdge())
				- state.getBarWidth() / 2.0;
		double barW = state.getBarWidth();

		// a list to store the series index and bar region, so we can draw
		// all the labels at the end...
		List itemLabelList = new ArrayList();

		// draw the blocks
		boolean inverted = rangeAxis.isInverted();
		int blockCount = values.size() - 1;
		
		for (int k = 0; k < blockCount; k++)
		{
			int index = (inverted ? blockCount - k - 1 : k);
			Object[] prev = (Object[]) values.get(index);
			Object[] curr = (Object[]) values.get(index + 1);
			int series = 0;
			if (curr[0] == null)
			{
				series = -((Integer) prev[0]).intValue();
			} else
			{
				series = ((Integer) curr[0]).intValue();
				if (series < 0)
				{
					series = -((Integer) prev[0]).intValue();
				}
			}
			double v0 = ((Double) prev[1]).doubleValue();
			double vv0 = rangeAxis.valueToJava2D(v0, dataArea, plot
					.getRangeAxisEdge());

			double v1 = ((Double) curr[1]).doubleValue();
			double vv1 = rangeAxis.valueToJava2D(v1, dataArea, plot
					.getRangeAxisEdge());

//			Shape[] faces = createVerticalBlock(barX0, barW, vv0, vv1, inverted);
			
			Shape[] faces = createVerticalBlockCylinded(barX0,barW,vv0,vv1,k);
			
			Paint fillPaint = getItemPaint(series, column);
			Paint outlinePaint = getItemOutlinePaint(series, column);
			g2.setStroke(getItemOutlineStroke(series, column));

			for (int f = 0; f < 3; f++)
			{
				if(f != 2 )
				{
					GradientPaintTransformer t = getGradientPaintTransformer();
					if (t != null && fillPaint instanceof GradientPaint)
					{
						fillPaint = t.transform((GradientPaint) fillPaint, faces[f]);
					}
					g2.setPaint(fillPaint);
				    g2.fill(faces[f]);
					g2.setPaint(outlinePaint);
					g2.draw(faces[f]);
				    
				}
				else
				{
				g2.setPaint(new Color(0,0,0,160));
				g2.fill(faces[f]);
				g2.setPaint(outlinePaint);
				g2.draw(faces[f]);
				}
			}

			itemLabelList.add(new Object[] { new Integer(series),
					faces[1].getBounds2D(),
					BooleanUtilities.valueOf(v0 < getBase()) });

			// add an item entity, if this information is being collected
			EntityCollection entities = state.getEntityCollection();
			if (entities != null)
			{
				addItemEntity(entities, dataset, series, column, faces[1]);
			}
		}
		
		/**
		 * redraw bottom & top ellipse
		 */
		for (int k = 0; k < blockCount; k++)
		{
			int index = (inverted ? blockCount - k - 1 : k);
			Object[] prev = (Object[]) values.get(index);
			Object[] curr = (Object[]) values.get(index + 1);
			int series = 0;
			if (curr[0] == null)
			{
				series = -((Integer) prev[0]).intValue();
			} else
			{
				series = ((Integer) curr[0]).intValue();
				if (series < 0)
				{
					series = -((Integer) prev[0]).intValue();
				}
			}
			double v0 = ((Double) prev[1]).doubleValue();
			double vv0 = rangeAxis.valueToJava2D(v0, dataArea, plot
					.getRangeAxisEdge());

			double v1 = ((Double) curr[1]).doubleValue();
			double vv1 = rangeAxis.valueToJava2D(v1, dataArea, plot
					.getRangeAxisEdge());
			
			Shape[] faces = createVerticalBlockCylinded(barX0,barW,vv0,vv1,k);
			
			Paint fillPaint = getItemPaint(series, column);
			Paint outlinePaint = getItemOutlinePaint(series, column);
			g2.setStroke(getItemOutlineStroke(series, column));

			for (int f = 0; f < 3; f++)
			{
				if(f != 1 )
				{
					GradientPaintTransformer t = getGradientPaintTransformer();
					if (t != null && fillPaint instanceof GradientPaint)
					{
						fillPaint = t.transform((GradientPaint) fillPaint, faces[f]);
					}
					g2.setPaint(fillPaint);
				    g2.fill(faces[f]);
					g2.setPaint(outlinePaint);
					g2.draw(faces[f]);
				    
				}
			}

			itemLabelList.add(new Object[] { new Integer(series),
					faces[1].getBounds2D(),
					BooleanUtilities.valueOf(v0 < getBase()) });

			// add an item entity, if this information is being collected
			EntityCollection entities = state.getEntityCollection();
			if (entities != null)
			{
				addItemEntity(entities, dataset, series, column, faces[1]);
			}
		}

		for (int i = 0; i < itemLabelList.size(); i++)
		{
			Object[] record = (Object[]) itemLabelList.get(i);
			int series = ((Integer) record[0]).intValue();
			Rectangle2D bar = (Rectangle2D) record[1];
			boolean neg = ((Boolean) record[2]).booleanValue();
			CategoryItemLabelGenerator generator = getItemLabelGenerator(
					series, column);
			if (generator != null && isItemLabelVisible(series, column))
			{
				drawItemLabel(g2, dataset, series, column, plot, generator,
						bar, neg);
			}

		}
	}

	/**
	 * 
	 */
	private Shape[] createVerticalBlockCylinded(double x0, double width, double y0,
			double y1,int blockIndex)// x轴开始坐标,bar宽度,前一个y轴基线点,当前y轴基线点
	{
		double yoff = getYOffset();
		
		Shape[] result = new Shape[3];
		
		Point2D p00 = new Point2D.Double(x0, y0 - yoff/2);  // left bottom cross
		Point2D p01 = new Point2D.Double(x0+width, y0 - yoff/2);  // right bottom cross
				
		Point2D p0 = new Point2D.Double(x0,y1 + yoff/2);  // left top cross
		Point2D p1 = new Point2D.Double(x0+width,y1 + yoff/2);  //right top cross
		
		Ellipse2D bottom = new Ellipse2D.Double(x0,y0 - yoff,width,yoff);
		
		if(blockIndex > 0)
		{
			p00 = new Point2D.Double(x0, y0 + yoff/2);  
			p01 = new Point2D.Double(x0+width, y0 + yoff/2);
			
			bottom = new Ellipse2D.Double(x0,y0,width,yoff);
		}
		
//		Rectangle2D front = new Rectangle2D.Double(x0,y1+yoff/2,width,100);
		
		GeneralPath front = new GeneralPath();
		front.moveTo((float) p00.getX(), (float) p00.getY());
		front.lineTo((float) p01.getX(), (float) p01.getY());
		front.lineTo((float) p1.getX(), (float) p1.getY());
		front.lineTo((float) p0.getX(), (float) p0.getY());
		front.closePath();
		
		Ellipse2D top = new Ellipse2D.Double(x0,y1,width,yoff);
		
		result[0] = bottom;
		result[1] = front;
		result[2] = top;

		return result;
	}	
	
	/**
	 * Creates an array of shapes representing the six sides of a block in a
	 * vertical stack.
	 * 
	 * @param x0
	 *            left edge of bar (in Java2D space).
	 * @param width
	 *            the width of the bar (in Java2D units).
	 * @param y0
	 *            the base of the block (in Java2D space).
	 * @param y1
	 *            the top of the block (in Java2D space).
	 * @param inverted
	 *            a flag indicating whether or not the block is inverted (this
	 *            changes the order of the faces of the block).
	 * 
	 * @return The sides of the block.
	 */
	private Shape[] createVerticalBlock(double x0, double width, double y0,
			double y1, boolean inverted)
	{
		Shape[] result = new Shape[6];
		Point2D p00 = new Point2D.Double(x0, y0);
		Point2D p01 = new Point2D.Double(x0 + width, y0);
		Point2D p02 = new Point2D.Double(p01.getX() + getXOffset(), p01.getY()
				- getYOffset());
		Point2D p03 = new Point2D.Double(p00.getX() + getXOffset(), p00.getY()
				- getYOffset());

		Point2D p0 = new Point2D.Double(x0, y1);
		Point2D p1 = new Point2D.Double(x0 + width, y1);
		Point2D p2 = new Point2D.Double(p1.getX() + getXOffset(), p1.getY()
				- getYOffset());
		Point2D p3 = new Point2D.Double(p0.getX() + getXOffset(), p0.getY()
				- getYOffset());

		GeneralPath right = new GeneralPath();
		right.moveTo((float) p1.getX(), (float) p1.getY());
		right.lineTo((float) p01.getX(), (float) p01.getY());
		right.lineTo((float) p02.getX(), (float) p02.getY());
		right.lineTo((float) p2.getX(), (float) p2.getY());
		right.closePath();

		GeneralPath left = new GeneralPath();
		left.moveTo((float) p0.getX(), (float) p0.getY());
		left.lineTo((float) p00.getX(), (float) p00.getY());
		left.lineTo((float) p03.getX(), (float) p03.getY());
		left.lineTo((float) p3.getX(), (float) p3.getY());
		left.closePath();

		GeneralPath back = new GeneralPath();
		back.moveTo((float) p2.getX(), (float) p2.getY());
		back.lineTo((float) p02.getX(), (float) p02.getY());
		back.lineTo((float) p03.getX(), (float) p03.getY());
		back.lineTo((float) p3.getX(), (float) p3.getY());
		back.closePath();

		GeneralPath front = new GeneralPath();
		front.moveTo((float) p0.getX(), (float) p0.getY());
		front.lineTo((float) p1.getX(), (float) p1.getY());
		front.lineTo((float) p01.getX(), (float) p01.getY());
		front.lineTo((float) p00.getX(), (float) p00.getY());
		front.closePath();

		GeneralPath top = new GeneralPath();
		top.moveTo((float) p0.getX(), (float) p0.getY());
		top.lineTo((float) p1.getX(), (float) p1.getY());
		top.lineTo((float) p2.getX(), (float) p2.getY());
		top.lineTo((float) p3.getX(), (float) p3.getY());
		top.closePath();

		GeneralPath bottom = new GeneralPath();
		bottom.moveTo((float) p00.getX(), (float) p00.getY());
		bottom.lineTo((float) p01.getX(), (float) p01.getY());
		bottom.lineTo((float) p02.getX(), (float) p02.getY());
		bottom.lineTo((float) p03.getX(), (float) p03.getY());
		bottom.closePath();

		result[0] = bottom;
		result[1] = back;
		result[2] = left;
		result[3] = right;
		result[4] = top;
		result[5] = front;
		if (inverted)
		{
			result[0] = top;
			result[4] = bottom;
		}
		return result;
	}

	/**
	 * Tests this renderer for equality with an arbitrary object.
	 * 
	 * @param obj
	 *            the object (<code>null</code> permitted).
	 * 
	 * @return A boolean.
	 */
	public boolean equals(Object obj)
	{
		if (obj == this)
		{
			return true;
		}
		if (!(obj instanceof StackedBarRenderer3D))
		{
			return false;
		}
		if (!super.equals(obj))
		{
			return false;
		}
		StackedBarRenderer3D that = (StackedBarRenderer3D) obj;
		if (this.renderAsPercentages != that.getRenderAsPercentages())
		{
			return false;
		}
		return true;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -