`
天边一朵雲
  • 浏览: 36148 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Graphics2D渲染(Rendering with Graphics2D)下

 
阅读更多
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 Real time Rendering

    《3D Graphics实时渲染》是浙江大学CAD&CG国家重点实验室推出的一部权威教程,专注于探讨三维图形在实时环境下的渲染技术。这一领域对于游戏开发、虚拟现实、增强现实以及诸多科学可视化应用至关重要。实时渲染不仅...

    Java 2D Graphics

    ### Java 2D Graphics 关键知识点解析 #### 一、Java 2D 概述 **Java 2D** 是 Java 平台的一个组件,它提供了丰富的 2D 图形和图像处理功能。通过 Java 2D API,开发人员可以轻松地在 Java 应用程序中实现高质量的...

    java 2D Graphics

    - **方法**:可以通过 `Graphics` 类或 `Graphics2D` 类的方法获得 `Graphics2D` 实例,例如 `getGraphics()` 方法。 - **使用场景**:在图形界面编程时,通常需要先获取 `Graphics2D` 对象,然后使用该对象来绘制...

    Direct3D Rendering Cookbook

    Direct3D Rendering Cookbook是一本关于Direct3D渲染技术的实践指南,旨在帮助读者掌握高级渲染技术,从而使3D图形项目更加生动。 标题:Direct3D Rendering Cookbook 描述:本书提供了50个实践 recipe,旨在指导...

    Java+2D+API+中文使用指

    Graphics2D g2d = (Graphics2D) g; // 设置抗锯齿 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 绘制蓝色背景 g2d.setColor(Color.BLUE); g2d....

    swt总结draw2d绘图

    - 渲染质量(Rendering Quality):可以调整抗锯齿、线条宽度等参数以优化显示效果。 - 事件处理(Event Handling):Draw2D支持鼠标和键盘事件,可以为Figure添加监听器来响应用户交互。 7. 示例应用: Draw2D常...

    使用Direct2D和DirectWrite渲染文本

    在提供的文件列表中,“Rendering-Text-with-Direct2D-DirectWrite.pdf”很可能是详细的教程或示例代码,展示了如何使用Direct2D和DirectWrite进行文本渲染的步骤。“下载链接.txt”可能包含其他相关资源或更新的...

    Java2D计算机图形学

    - 学习目标包括理解2D图形系统的架构、2D坐标系、Graphics2D对象的使用,以及如何实现2D几何基元和自定义几何体等。 - **2D图形绘制过程**涉及坐标转换、几何变换和渲染。 - **2D几何模型与坐标系**:理解笛卡尔...

    利用CoreGraphics画小黄人

    在iOS和macOS开发中,Core Graphics是一个强大的图形绘制框架,用于低级的2D图形渲染。本项目“利用CoreGraphics画小黄人”旨在教你如何通过编程方式使用Core Graphics来绘制可爱的小黄人形象。这个教程对于理解Core...

    PixelFarm:从矢量到(子)像素,C#2D渲染库

    硬件和软件2D渲染库 硬件渲染技术: 该库使用OpenGL ES2 +及其阴影着色(GLSL)作为其硬件渲染器后端。 从svg文件中读取下面的狮子杯=&gt;镶嵌并使用GLES Painter渲染 GLES后端画家 软件渲染技术: 该库还提供了一...

    fantastic.ex:Vivid是用Elixir编写的简单2D渲染库

    Vivid是一个基于Elixir的2D渲染库,它为开发者提供了构建、操作和渲染图形的工具,特别是对于那些想要在Elixir应用中实现图形界面或者进行2D游戏开发的程序员来说,这是一个非常实用的框架。Vivid的核心特性在于其...

    3D_interactive_graphics_rendering_engine:开发3D交互式图形渲染引擎

    13. **Rendering Engine**:渲染引擎负责将3D模型转化为2D图像,包括视图投影、光照计算、抗锯齿等步骤。 14. **GLSL Shaders**:GLSL着色器是运行在GPU上的程序,用于处理像素和顶点的颜色和属性,如阴影、反射、...

    使用Kotlin - Jonatino/JOGL2D的零开销2D渲染库

    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...

    canvas-basic-graphics.zip

    通过JavaScript,我们可以获取到这个元素的`2D渲染上下文`(`2D Rendering Context`),它提供了一系列的方法和属性,用于绘制和操作图形。 在`canvas-basic-graphics.zip`压缩包中,有三个文件: 1. `main.html`:...

    gg:Go图形-使用简单的API在Go中进行2D渲染

    gg是用于在纯Go中渲染2D图形的库。 安装 go get -u github.com/fogleman/gg 或者,您可以使用gopkg.in获取特定的主版本: go get -u gopkg.in/fogleman/gg.v1 文献资料 godoc: ://godoc.org/github....

    marlin-renderer:Marlin是源自OpenJDK双鱼座(形状)的FAST Java2D抗锯齿光栅化器

    它仅处理带有笔触和破折号属性的形状渲染( Graphics2D draw(Shape) / fill(Shape) ,但效果非常好!发行历史最新版本: : JDK 默认渲染器可用的Marlin版本Oracle JDK 6-8 杜克图斯 开启JDK 6-8 双鱼座 Azul Zulu ...

    Computer Graphics Through OpenGL, 2nd Edition

    OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。它在计算机图形学领域具有举足轻重的地位,尤其是在游戏开发、虚拟现实、科学可视化等领域。本书《通过...

    计算机图形学:应用JAVA 2D和3D X-7

    1. **Graphics2D类**:这是绘图的核心类,继承自Graphics类,提供了更多的绘图操作,如线条、曲线、填充、旋转、缩放等。 2. **Shape接口**:表示几何形状,如矩形、椭圆、多边形等,可以用于绘制和碰撞检测。 3. **...

    cpp-p0267r10(图形库扩展).pdf

    c++提案p0267r10, A Proposal to Add 2D Graphics Rendering and display to C++. C++ 2D图形渲染和显示扩展。

    Computer Graphics - Principles and Practice 3rd edition 2014

    此外,PBR渲染的普及也得益于近年来图形硬件的快速发展,尤其是可编程GPU的出现,使得复杂的PBR渲染算法可以在实时环境下运行,为实时图形应用程序如游戏和模拟提供了强大的技术支持。 本书还介绍了一些其他重要的...

Global site tag (gtag.js) - Google Analytics