ホームページ Java &#&チュートリアル JavaのGraphics2Dクラスの基本的な使い方チュートリアル

JavaのGraphics2Dクラスの基本的な使い方チュートリアル

Jan 17, 2017 pm 04:13 PM

Java 言語は Graphics クラスを拡張して、描画用のさまざまな基本的な幾何学的図形を提供することに基づいて Graphics2D クラスを提供します。これは、より強力な 2 次元グラフィックス処理機能を備え、座標変換、カラー管理、テキスト レイアウトなどを提供します。 。

描画プロパティ

Graphics2D は、グラフィックスの状態プロパティを追加または変更するためのいくつかのメソッドを定義します。状態プロパティを設定および変更することで、ブラシの幅とブラシの接続方法を指定できます。変換グラフィックスの移動、回転、拡大縮小、トリミングの設定、塗りつぶされたグラフィックスの色やパターンの設定などを行うことができます。グラフィックス状態プロパティは、特定のオブジェクトを使用して保存されます。

1. ストローク属性

ストローク属性は、線の幅、ペンのスタイル、線分の接続方法、または破線のパターンを制御します。このプロパティを設定するには、まず BasicStroke オブジェクトを作成し、次に setStroke() メソッドを呼び出して設定する必要があります。 BasicStroke オブジェクトを作成するメソッドは次のとおりです:
BasicStroke(float w): 線幅 w を指定します。
BasicStroke(float w, int cap, int join):
cap はエンドポイントです: CAP_BUTT (未変更)、CAP_ROUND (半円形の端)、CAP_SQUARE (正方形の端、デフォルト値)。
結合は、2 つの線分の交点での接続方法を定義します: JOIN_BEVEL (変更なし)、JOIN_MTTER (尖った端、デフォルト値)、JOIN_ROUND (丸い端)。

2. ペイント属性

ペイント属性は塗りつぶし効果を制御します。まず、次のメソッドを呼び出して塗りつぶし効果を決定し、setPaint() メソッドを使用して設定します。
GradientPaint(float x1,float y1,Color c1,float x2,flaot y2,Color c2): (x1,y1) から (x2,y2) への c1 から c2 へのカラー グラデーション。その中で、パラメータ c1 と c2 は、色 c1 から色 c2 へのグラデーション色を決定します。パラメータ x1、y1、x2、y2 はグラデーションの強さを決定します。つまり、点 (x1、y1) から点 (x2、y2) に向かって色が c1 から c2 に変化します。
GradientPaint(float x1, float y1, Color c1, float x2, float y2, Color c2, Boolean cyclic): グラデーションを終了して開始点の色にしたい場合は、cyclic を true に設定する必要があります。

3. 変換属性

変換属性は、グラフィックスの変換、スケーリング、ベベルなどの一般的な変換操作を実装するために使用されます。まず AffineTransform オブジェクトを作成し、次に setTransform() メソッドを呼び出して変換属性を設定します。最後に、指定されたプロパティを持つ Graphics2D オブジェクトを使用してグラフィックスが描画されます。 AffineTransform オブジェクトを作成するメソッドは次のとおりです:

getRotateinstrance(double theta): シータ ラジアンを回転します。

getRotateInstance(double theta,dioble x,double y): 回転中心 (x, y) を中心に回転します。

getScaleInstance(double sx,double sy): x 方向と y 方向は、それぞれ sx と sy の比率に従って変換されます。

getTranslateInstance(double tx,double ty): 翻訳変換。

getShearInstance(double shx,double shy): 斜角変換、shx と shy は斜角度を指定します。

最初に変換属性なしで AffineTransform オブジェクトを作成し、次に次のメソッドを使用してグラフィックスの変換、回転、スケーリング変換属性を指定することもできます。

transelate(double dx,double dy): グラフィックを x 軸方向に dx ピクセルずつ移動します。

scale(double sx,double sy): グラフは、x 軸方向に sx 倍、垂直方向に sy 倍にスケールされます。

rotate(double arc, double x, double y): グラフは点 (x, y) を軸点として使用し、円弧ラジアンを回転します。

たとえば、AffineTransform オブジェクトを作成します:

AffineTransform trans = new AffineTransform();
ログイン後にコピー

AffineTransform オブジェクトの点回転変換属性を指定します:

Trans.rotate(50.0*3.1415927/180.0,90,80);
ログイン後にコピー

次に、Graphics2D オブジェクト g2d に対して上記の回転変換関数を使用して「ブラシ」を設定します:

Graphics2D g2d = (Graphics2D)g;g2d.setTranstorm(trans);
ログイン後にコピー

最後に、グラフィックスオブジェクトを変換関数付きのGraphics2Dオブジェクトのdraw()メソッドをパラメータ付きで呼び出します。たとえば、二次曲線オブジェクト カーブがあると仮定すると、次のコードは、上記の回転関数を備えた g2d オブジェクトを使用してこの二次曲線の描画を実装します。

g2d.draw(curve)
ログイン後にコピー

4. クリップ属性

クリップ属性は、クリッピング効果を実現するために使用されます。クリッピング属性を設定するには、setClip() メソッドを呼び出してクリッピング領域の形状を決定します。複数の setClip() 操作が連続して実行され、それらが交差するクリッピング領域が取得されます。

5. コンポジット属性

コンポジット属性は、グラフィックの重なり部分の効果を設定します。まず、AlphaComposite.getInstance(int rules, float alpha) メソッドを使用して AlphaComposite オブジェクトを取得し、次に setComposite() メソッドを通じて混合効果を設定します。アルファ値の範囲は 0.0f (完全に透明) から 0.1f (完全に不透明) です。
Graphics2D クラスの描画メソッド

Graphics2D クラスは、Graphics クラスの描画メソッドを保持しつつ、多くの新しいメソッドを追加しています。新しいメソッドは、幾何学的形状 (線分、円など) をオブジェクトとして描画します。 java.awt.geom パッケージで宣言された一連のクラスは、さまざまなボディ グラフィックス オブジェクトを作成するために使用されます。主に含まれるもの:

Line2D 線分クラス、RoundRectangle2D 角丸長方形クラス、Ellipse2D 楕円クラス、Arc2D 円弧クラス、QuadCurve2D 二次曲線クラス、CubicCurve2D 三次曲線クラス。

Graphics2D クラスの新しいメソッドを使用してグラフィックを描画します。まず、再描画メソッドのpaintComponent()またはpaint()で、パラメータ・オブジェクトgをGraphics2Dオブジェクトに強制的に追加し、次に、上記のグラフィックス・クラスによって提供される静的メソッドDouble()を使用して、グラフィックスのオブジェクトを作成します。パラメータとしてグラフィックス オブジェクトを呼び出します。 Graphics2D オブジェクトのdraw() メソッドを呼び出して、このグラフィックスを描画します。たとえば、次のコードは、Graphics2D の新しいメソッドを使用して線分と角丸四角形を描画します。

Graphics2D g2d = (Graphics2D)g;//将对象g类型从Graphics转换成Graphics2D
Line2D line = new Line2D.Double(30.0,30.0,340.0,30.0);
g2d.draw(line);
RoundRectangle2D rRect = new RoundRectangle2D.Double(13.0,30.0,100.0,70.0,40.0,20.0);
g2d.draw(rRect);
ログイン後にコピー

最初に java.awt.geom パッケージによって提供される Shape オブジェクトを使用し、単精度の Shape オブジェクトを作成することもできます。 Float 座標または倍精度 Double 座標を使用して、draw() メソッドを使用して描画します。たとえば、次のコードは、最初に円弧オブジェクトを作成し、次に円弧を描画します。
Line2D line = new Line2D.Double(2,3,200,300);//声明并创建线段对象
//起点是(2,3),终点是(200,300)
ログイン後にコピー

矩形

Rectangle2D rect = new Rectangle2D.Double(20,30,80,40);//声明并创建矩形对象,矩形的左上角是(20,30),宽是300,高是40
ログイン後にコピー

圆角矩形

RoundRectangle2D rectRound = new RoundRectangle2D.Double(20,30,130,100,18,15);
//左上角是(20,30),宽是130,高是100,圆角的长轴是18,短轴是15。
ログイン後にコピー

椭圆

Ellipse2D ellipse = new Ellipse2D.Double(20,30,100,50);
//左上角 (20,30),宽是100,高是50
ログイン後にコピー

圆弧

Arc2D arc1 = new Arc2D.Double(8,30,85,60,5,90,Arc2D.OPEN);
//外接矩形的左上角(10,30),宽85,高60,起始角是5度,终止角是90度
Arc2D arc2 = new Arc2D.Double(20,65,90,70,0,180,Arc2D.CHORD);
Arc2D arc3 = new Arc2D.Double(40,110,50,90,0,270,Arc2D.PIE);
ログイン後にコピー

参数Arc2D.OPEN、Arc2D.CHORD、Arc2D.PIE分别表示圆弧是开弧、弓弧和饼弧。
二次曲线
二次曲线用二阶多项式表示:

y(x)=ax2+bx+c
ログイン後にコピー

一条二次曲线需要三个点确定:始点、控制点和终点。

QuadCurve2D curve1 = new QuadCurver2D.Double(20,10,90,65,55,115);
QuadCurve2D curve2 = new QuadCurver2D.Double(20,10,15,63,55,115);
QuadCurve2D curve3 = new QuadCurver2D.Double(20,10,54,64,55,115);
ログイン後にコピー

方法Double()中的6个参数分别是二次曲线的始点、控制点和终点。以上3条二次曲线的开始点和终点分别相同。
三次曲线
三次曲线用三阶多项式表示:

y(x)=ax3+bx2+cx+d
ログイン後にコピー

一条三次曲线需要四个点确定:始点、两个控制点和终点。

CubicCurve2D curve1 = new CubicCurve2D.Double(12,30,50,75,15,15,115,93);
CubicCurve2D curve2 = new CubicCurve2D.Double(12,30,15,70,20,25,35,94);
CubicCurve2D curve3 = new CubicCurve2D.Double(12,30,50,75,20,95,95,95);
ログイン後にコピー

方法Double()中的8个参数分别是三次曲线的始点、两个控制点和终点。

一般的方程曲线的绘制过程用一个循环控制。通过循环产生自变量的值,按照方程计算出函数值,再作必要的坐标转换:原点定位的平移变换,图像缩小或放大的缩放变换,得到曲线的图像点,并绘制这个点。以绘制以下曲线方程为例:

Y=sin(x)+cos(x),x
ログイン後にコピー

绘制的部分代码可以写成如下:

double x0,y0,x1,y1,x2,y2,scale;
x0=100;y0=80;
scale =20.0;
for(x1=-3.1415926d;x1<=2*3.1415926d;x1+=0.01d){
  y1=Math.sin(x1)+Math.cos(x1);
  x2=x0+x1*scale;y2=y0+y1*scale;//(x2,y2)是图像点
  g.fillOval((int)x2,(int)y2,1,1);//画一个圆点作为图像点
}
ログイン後にコピー

更多Java中的Graphics2D类基本使用教程相关文章请关注PHP中文网!


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte 2025年のトップ4 JavaScriptフレームワーク:React、Angular、Vue、Svelte Mar 07, 2025 pm 06:09 PM

この記事では、2025年の上位4つのJavaScriptフレームワーク(React、Angular、Vue、Svelte)を分析し、パフォーマンス、スケーラビリティ、将来の見通しを比較します。 強力なコミュニティと生態系のためにすべてが支配的なままですが、彼らの相対的なポップ

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか? Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

node.js 20:キーパフォーマンスが向上し、新機能 node.js 20:キーパフォーマンスが向上し、新機能 Mar 07, 2025 pm 06:12 PM

node.js 20は、V8エンジンの改善、特により速いガベージコレクションとI/Oを介してパフォーマンスを大幅に向上させます。 新機能には、より良いWebセンブリのサポートと洗練されたデバッグツール、開発者の生産性とアプリケーション速度の向上が含まれます。

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか? Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

Iceberg:データレイクテーブルの未来 Iceberg:データレイクテーブルの未来 Mar 07, 2025 pm 06:31 PM

大規模な分析データセットのオープンテーブル形式であるIcebergは、データの湖のパフォーマンスとスケーラビリティを向上させます。 内部メタデータ管理を通じて、寄木細工/ORCの制限に対処し、効率的なスキーマの進化、タイムトラベル、同時wを可能にします

Spring Boot Snakeyaml 2.0 CVE-2022-1471問題修正 Spring Boot Snakeyaml 2.0 CVE-2022-1471問題修正 Mar 07, 2025 pm 05:52 PM

この記事では、リモートコードの実行を可能にする重大な欠陥であるSnakeyamlのCVE-2022-1471の脆弱性について説明します。 Snakeyaml 1.33以降のSpring Bootアプリケーションをアップグレードする方法は、このリスクを軽減する方法を詳述し、その依存関係のアップデートを強調しています

Javaで機能的なプログラミング技術を実装するにはどうすればよいですか? Javaで機能的なプログラミング技術を実装するにはどうすればよいですか? Mar 11, 2025 pm 05:51 PM

この記事では、Lambda式、Streams API、メソッド参照、およびオプションを使用して、機能プログラミングをJavaに統合することを調べます。 それは、簡潔さと不変性を通じてコードの読みやすさと保守性の改善などの利点を強調しています

高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? 高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか? Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

See all articles