2.4 渲染图元
Rendering Graphics Primitives
Graphics2D为图形、文本、图像提供了渲染方法:
(1) draw - 在Graphics2D上下文中通过Stroke和Paint对象描绘图形路径;
(2) fill - 在上下文中使用Paint填充图形;
(3) drawString - 在上下文中使用Paint渲染指定的字符串;
(4) drawImage - 渲染指定图像
为了能描绘并填充图形,你需要调用draw和fill方法。
Graphics2D在先前的JDK版本中同样支持draw和fill方法,例如drawOval和fillRect.
2.4.1 绘制图形
Draw a Shape
图形的轮廓能通过Graphics2D.draw方法来渲染。先前的JDK中支持 的draw方法还有:drawLine、drawRect、drawRoundRect、drawOval、drawAcr、drawPolyline、 drawPolygon和draw2DRect。
当一个图形被绘制,它的路径通过Graphics2D上下文中的Stroke对象来描边。在上下文中通过设置一个合适的BasicStroke对象,你可以绘制任何宽度和样式的线条。BasicStroke同样定义了线条的端部和结合点的属性。
渲染图形的轮廓的步骤:
(1) 创建一个BasicStroke对象;
(2) 调用Graphics2D.setStroke方法;
(3) 创建Shape;
(4) 调用Graphics2D.draw(shape);
下面的示例中,GeneralPath对象用来定义一个五星然后用BasicStroke对象来定义五星的线条和结合点属性:
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D) g ;
//创建并设置stroke
g2.setStroke(new BasicStroke( 4.0f ));
//使用GeneralPath对象创建一个五星
GeneralPath p = new GeneralPath(GeneralPath.NON_ZERO);
p.moveTo( - 100.0f, -25.0f );
p.lineTo(+100.0f, -25.0f );
p.lineTo( - 50.0f, -25.0f);
p.lineTo( +0.0f, -100.0f);
p.lineTo(+50.0f , +100.0f);
p.closePath();
//translate origin towards center of canvas
g2.translate(100.0f, 100.0f);
//渲染五星的路径
g2.draw(p);
}
2.4.2 填充图形
Filling a Shape
Graphics2D.fill方法可用来填充任何的图形。当填充一个图形时,它的图形路径内部的的区域将被Paint的当前属性——Color、TexturePaint、及GradientPaint渲染。
先前的JDK版本中支持的填充方法有:fillRect、fill2DRect、fillRoundRect fillOval、fillArc、fillPolygon、clearRect。
填充一个图形的基本步骤:
(1) 在上下文中使用Graphics2D.setColor或Graphics2D.setPaint设置填充的颜色和模式;
(2) 创建一个Shape对象;
(3) 调用Graphics2D.fillRect渲染图形对象;
在下面的示例中,调用setColor来为一个Rectangle2D对象定义一个绿色填充:
public void paint(Graphics g){
Graphics2D g2 = (Graphcs2D) g;
g2.setPaint(Color.green);
Rectangle2D r2 = new Rectangle2D.Float(25,25,150,250);
g2.fill(r2);
}
2.4.3 渲染文本
Rendering Text
为了渲染字符串,你可以调用Graphics2D.drawString并把它传递到你要渲染的字符串。关于渲染文本和选择字体的信息,请参见"字体和文本布局(Fonts and Text Layout)"。
2.4.4 渲染图像
Rendering Images
为了渲染图像,你需要创建Image对象,并调用Graphics2D.drawImage.更多关于处理和渲染图片的信息请参见"图形渲染(Imaging)"。
2.5 定义自定义的混合规则
Defining Custom Composition Rules
通过实现Composite和CompositeContext接口,你可以创建一个全新的混合操作类型。一个Composite对象提供的CompositeContext对象实际上保持了混合状态并完成混合工作。可以从Composite中创建多种CompositeContext对象来保持在不同环境下独自的状态。
2.6 在多屏幕环境下渲染
Rendering in a Multi-Screen Environment
从JDK1.3版本中,Java 2D API就通过配置在本地平台上的设置来支持三种不同的多屏幕配置:
(1) 两到多个独立的屏幕;
(2) 两到多个屏幕,其中一个是主屏幕其他的屏幕是主屏幕的复制;
(3) 两到多个屏幕组成一个虚拟桌面,这也叫做虚拟设备。
Java 2D API使你能通过一个GraphicsConfiguration创建适应目标渲染显示设备的Frame、JFrame、Window、JWindow对象。
在上面三种配置中,每个屏幕设备都有一个GraphicsDevice表示。每一个GraphicsDevice都能有多个GraphicsConfiguration对象和它关联。
当两个或多个屏幕组成一个虚拟设备时,存在于物理屏幕外的虚拟坐标系统用来表示虚拟设备。在这多屏幕配置中,每个GraphicsConfiguration的界限和虚拟坐标系相联系。这种环境下的每个屏幕被定义为首选屏幕,它在虚拟坐标系中定位在(0,0)位置。根据首先屏幕的位置,虚拟设备的坐标系可能是相反的,如下图所示:

在你的系统上,你可以在每个GraphicsConfiguration对象上调用getBounds来检查原点是(0,0)而不是其它位置来检测你的环境是否为虚拟环境,在它上面Window或Frame能跨越一人或多个物理设备。GraphicsConfiguration上的getBounds方法返回在虚拟坐标上的一个矩形区域。所以如果任何设备的原点不是(0,0)那么它们就是虚拟设备环境。
在虚拟设备环境,GraphicsConfiguration对象的坐标是和虚拟的坐标系想联系的。所以当你调用一个Frame或Window的setLocation方法时,你必须使用虚拟坐标。举例来说,下面的代码获得GraphicsConfiguration的界限,并根据这个范围在相对于由这个GraphicsConfiguration表示的物理屏幕原点的(10,10)位置设备了一个Frame:
Frame f = new Frame(GraphicsConfiguration gc);
Rectangle bounds = gc.getBounds();
f.setLocation(10 + bounds.x , 10 + bounds.y);
如果没有把GraphicsConfiguration的界限考虑在内,把这个Frame显示在首先物理屏幕的(10,10)位置,那么它将和指定的GrapihcsConfiguration表示的物理屏幕上显示的不同。
getBounds方法同样可用于限定虚拟设备的界限。在你的系统上的每个GraphicsConfiguration上调用getBounds。为了限定物理设备的边界,你需要高处所有的边界。这种技术正如下面的示例中所用到的:
Rectangle virtualBounds = new Rectangle();
GraphicsEnvironment ge = GrahicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for( int j = 0; j < gs.length; j++){
GraphicsDevice gd = gs[j];
GraphicsConfiguration[] gc = gd.getConfigurations();
for( int i = 0; i < gc.length; i++){
VirturalBounds = virtualBounds.union(gc[i].getBounds());
}
}
现在的applet中,利用GraphicsEnvironment里的每个GraphicsDevice的GraphicsConfiguration来创建一个JFrame。每个JFrame显示了一组红、绿、蓝条纹的集合,屏幕的数量、GraphiscConfiguration的数量以其GraphicsConfiguration的界限。下面的代码必须在Jdk1.3以后的版本中运行:
import java.applet.Applet;
import java.awt.*;
import javax.swing.*;
public class MultiFrameApplet extends Applet{
public MultiFrameApplet(){
main(null);
}
public static void main(String[] args){
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
for(int j = 0; j < gs.length; j++){
GraphicsDevice gd = gs[j];
GraphicsConfiguration[] gc = gd.getConfigurations();
for ( int i = 0; i < gc.length; i++){
JFrame f = new JFrame(gs[j].getDefaultConfiguration());
GCCanvas c = new GCCanvas(gc[i]);
Rectangle gcBounds = gc[i].getBounds();
int xoffs = gcBounds.x;
int yoffs = gcBounds.y;
f.getContentPane().add(c);
f.setTitle("Screen# "+Integer.toString(j)+", GC# "+Integer.toString(i));
f.setSize(300,150);
f.setLocation((i * 50) + xoffs , (i * 60 ) + yoffs);
f.show();
}
}
}
}
class GCCanvas extends Canvas{
GraphicsConfiguration gc;
Rectangle bounds;
public GCCanvas(GraphicsConfiguration gc){
super(gc);
this.gc = gc;
bounds = gc.getBounds();
}
public Dimension getPreferedSize(){
return new Dimension(300,150);
}
public void paint(Graphics g){
g.setColor(Color.red);
g.fillRect(0 , 0 , 100 , 150 );
g.setColor(Color.green);
g.fillRect(100 , 0 , 100 , 150);
g.setColor(Color.blue);
g.fillRect(200 , 0 , 100 ,150);
g.setColor(Color.black);
g.drawString( "ScreenSize = " + Integer.toString(bounds.width) + " X " + Integer.toString(boudns.height), 10 , 15) ;
g.drawString(gc.toString(), 10 , 30);
}
}
分享到:
相关推荐
《3D Graphics实时渲染》是浙江大学CAD&CG国家重点实验室推出的一部权威教程,专注于探讨三维图形在实时环境下的渲染技术。这一领域对于游戏开发、虚拟现实、增强现实以及诸多科学可视化应用至关重要。实时渲染不仅...
- **方法**:可以通过 `Graphics` 类或 `Graphics2D` 类的方法获得 `Graphics2D` 实例,例如 `getGraphics()` 方法。 - **使用场景**:在图形界面编程时,通常需要先获取 `Graphics2D` 对象,然后使用该对象来绘制...
Direct3D Rendering Cookbook是一本关于Direct3D渲染技术的实践指南,旨在帮助读者掌握高级渲染技术,从而使3D图形项目更加生动。 标题:Direct3D Rendering Cookbook 描述:本书提供了50个实践 recipe,旨在指导...
Graphics2D g2d = (Graphics2D) g; // 设置抗锯齿 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 绘制蓝色背景 g2d.setColor(Color.BLUE); g2d....
- 渲染质量(Rendering Quality):可以调整抗锯齿、线条宽度等参数以优化显示效果。 - 事件处理(Event Handling):Draw2D支持鼠标和键盘事件,可以为Figure添加监听器来响应用户交互。 7. 示例应用: Draw2D常...
在提供的文件列表中,“Rendering-Text-with-Direct2D-DirectWrite.pdf”很可能是详细的教程或示例代码,展示了如何使用Direct2D和DirectWrite进行文本渲染的步骤。“下载链接.txt”可能包含其他相关资源或更新的...
- 学习目标包括理解2D图形系统的架构、2D坐标系、Graphics2D对象的使用,以及如何实现2D几何基元和自定义几何体等。 - **2D图形绘制过程**涉及坐标转换、几何变换和渲染。 - **2D几何模型与坐标系**:理解笛卡尔...
在iOS和macOS开发中,Core Graphics是一个强大的图形绘制框架,用于低级的2D图形渲染。本项目“利用CoreGraphics画小黄人”旨在教你如何通过编程方式使用Core Graphics来绘制可爱的小黄人形象。这个教程对于理解Core...
硬件和软件2D渲染库 硬件渲染技术: 该库使用OpenGL ES2 +及其阴影着色(GLSL)作为其硬件渲染器后端。 从svg文件中读取下面的狮子杯=>镶嵌并使用GLES Painter渲染 GLES后端画家 软件渲染技术: 该库还提供了一...
Vivid是一个基于Elixir的2D渲染库,它为开发者提供了构建、操作和渲染图形的工具,特别是对于那些想要在Elixir应用中实现图形界面或者进行2D游戏开发的程序员来说,这是一个非常实用的框架。Vivid的核心特性在于其...
13. **Rendering Engine**:渲染引擎负责将3D模型转化为2D图像,包括视图投影、光照计算、抗锯齿等步骤。 14. **GLSL Shaders**:GLSL着色器是运行在GPU上的程序,用于处理像素和顶点的颜色和属性,如阴影、反射、...
JOGL2DZero-overhead 2D rendering library for JOGLThis library is licensed under Apache License 2.0.JOGL2D is an open source Kotlin library that provides easy 2D graphics rendering capabilities to JOGL...
gg是用于在纯Go中渲染2D图形的库。 安装 go get -u github.com/fogleman/gg 或者,您可以使用gopkg.in获取特定的主版本: go get -u gopkg.in/fogleman/gg.v1 文献资料 godoc: ://godoc.org/github....
通过JavaScript,我们可以获取到这个元素的`2D渲染上下文`(`2D Rendering Context`),它提供了一系列的方法和属性,用于绘制和操作图形。 在`canvas-basic-graphics.zip`压缩包中,有三个文件: 1. `main.html`:...
它仅处理带有笔触和破折号属性的形状渲染( Graphics2D draw(Shape) / fill(Shape) ,但效果非常好!发行历史最新版本: : JDK 默认渲染器可用的Marlin版本Oracle JDK 6-8 杜克图斯 开启JDK 6-8 双鱼座 Azul Zulu ...
OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。它在计算机图形学领域具有举足轻重的地位,尤其是在游戏开发、虚拟现实、科学可视化等领域。本书《通过...
1. **Graphics2D类**:这是绘图的核心类,继承自Graphics类,提供了更多的绘图操作,如线条、曲线、填充、旋转、缩放等。 2. **Shape接口**:表示几何形状,如矩形、椭圆、多边形等,可以用于绘制和碰撞检测。 3. **...
c++提案p0267r10, A Proposal to Add 2D Graphics Rendering and display to C++. C++ 2D图形渲染和显示扩展。
此外,PBR渲染的普及也得益于近年来图形硬件的快速发展,尤其是可编程GPU的出现,使得复杂的PBR渲染算法可以在实时环境下运行,为实时图形应用程序如游戏和模拟提供了强大的技术支持。 本书还介绍了一些其他重要的...