ホームページ ウェブフロントエンド H5 チュートリアル html5 Canvas 描画チュートリアル (11) — lineTo/arc/bezierCurveTo を使用して oval_html5 を描画するチュートリアルのスキル

html5 Canvas 描画チュートリアル (11) — lineTo/arc/bezierCurveTo を使用して oval_html5 を描画するチュートリアルのスキル

May 16, 2016 pm 03:50 PM
arc canvas

Canvasでは円弧法を使うと簡単に円を描くことができますが、本来円は幅と高さが等しい楕円とみなすことができますが、Canvasでは楕円を描く方法がありません。それをシミュレートするために。
まず、楕円を描くためにどのようなパラメータが必要かを明確にする必要があります。基本的な幾何学の知識から、楕円には中心座標、幅、高さ、または回転角度が必要であることがわかりますが、これは当面は省略でき、回転の方が簡単です。
1. lineTo を使用して楕円を描画します
そのとおりです。lineTo は純粋に直線を描画するために使用されますが、実際には楕円を描画するために使用できます。 ?しかし、彼は存在しますが、その書き方は本当に信じられないほどです:

コードをコピー
コードは次のとおりです:

function DrawEllipse(Canvas,O,OA,OB){
//楕円を描画します。例: var B=new Array(150,150); DrawEllipse(hb,B,50,30); ;
with ( Canvas){
var x=O[0] OA;
moveTo(x,y); 0;ivar ii=i*Math.PI/180;
var x=O[0] OA*Math.cos(ii); [1]-OB* Math.sin(ii);
lineTo(x,y)
}
}
}


このメソッドの原理は次のとおりです。円が 360 度であることを確認します。次に、lineTo を使用して 360 回ループし、各度の線分を描画し、最後にそれらを接続して楕円を作成します。計算には三角関数のサインとコサインが必要です。
このメソッドの 2 番目のパラメーターは、楕円の中心座標である配列であることに注意してください。

このアイデアは非常に奇妙で、描画された楕円は比較的滑らかです。しかし、誰にとっても使用する価値があるわけではありません。このメソッドは、楕円を描画するたびに 360 回循環し、ブラウザのパフォーマンスのテストとして、楕円を少しだけ追加して描画します。
私たちは彼のアイデアを理解する必要があるだけです

2. 円弧を使用して円を描き、それを楕円に拡大縮小します

このメソッドの原文はここにあります。関数は次のとおりです:


コードをコピーします
コードは次のとおりです:
var Canvas = document.getElementById('myCanvas ');
var context = Canvas.getContext('2d');
var centerY = 0;
// 状態を保存
context.save();
// コンテキストを変換
context.translate(canvas.width / 2, Canvas.height / 2);水平に
context.scale( 2, 1);
// 楕円形に引き伸ばされる円を描画します
context.beginPath();
context.arc(centerX, centerY, radius, 0) , 2 * Math.PI, false );
// 元の状態に復元します
context.restore()


このメソッドは、これまで説明しなかった Canvas 関数を使用します。 、つまりスケール、ズームのキャンバスを実装できます。拡大縮小の方向は水平方向と垂直方向の2つあり、コードでは水平方向にはキャンバスが拡大されますが、垂直方向はそのままなので、円弧で描いた円は楕円になります。
このメソッドは一見すると非常に優れているように見え、コードも少なく、原理も理解しやすいです。しかし、分析すると、彼の明らかな欠点がわかります。それは、不正確さです。たとえば、幅 171、高さ 56 の楕円が必要です。円弧の半径を 28 に設定すると、171/28/2 という痛くて理解できない数字に落ち込むことになります。

しかし、妥協策として、円弧の半径を常に 100 に設定し、十分でない場合は拡大し、それを超える場合は縮小します。ただし、まだ正確ではありません。
3、ベジェ曲線 bezierCurveTo

上記のスケーリング方法が不正確だと感じたので、楕円を描く正確な方法を探したかったのですが、最終的に stackoverflow でそれを見つけました:



コードをコピー

コードは次のとおりです:
functiondrawEllipse(ctx, x, y , w, h) { var kappa = 0.5522848; ox = (w / 2) * kappa, // 制御点の水平オフセット
oy = (h / 2) * kappa, // 制御点オフセット垂直
xe = x w, // x 端
ye = y h, // y 端
xm = x w / 2, // x 中間
ym = y h / 2; / y-middle
ctx.beginPath();
ctx.moveTo(x, ym);
ctx.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); 🎜 >ctx.bezierCurveTo(xm ox, y, xe, ym - oy, xe, ym);
ctx.bezierCurveTo(xe, ym oy, xm ox, ye, xm, ye); (xm - ox, ye, x, ym oy, x, ym);
ctx.closePath();


この方法は完璧であると考えられます。彼は楕円を 4 つのベジェ曲線に分割し、それらを接続して楕円を形成しました。最後に、幅と高さがより正確になり、オーバーヘッドが少なくなります。
しかし、この方法にはまだ欠点があります。カッパパラメータを見てください。これは非常に特殊な値です。幾何学の専門家がなぜこの値でなければならないのかを説明するまで、多くの人はなぜこの値でなければならないのか理解できないと思います。私にはまだわかりません。そして、それを変えて、その結果がどうなるかを見てみたいという強い衝動があります。

もちろん、強迫性障害患者に似た衝動がこの方法の欠点であるとは言えません。本当の欠点は、なぜ 4 つのベジェ曲線を使用するのかということです。個人的には、楕円は明らかに 4 つではなく 2 つのベジェ曲線で構成されていると感じます。このアイデアは最終的に、楕円を描くための完璧な方法を導き出しました。
4、2 つのベジェ曲線を使用して楕円を描画します。
前の方法が簡略化できるかどうかを理解するために、特別に stackoverflow アカウントを登録して質問しました。という質問には、移行するのに十分なポイントがなかったので、かろうじて十分な英語を使って外国人からの質問に答えてポイントを稼ぐ必要がありました。しかし、ついに幸運が訪れ、質問に答えることでポイントの問題が解決されました。
ベジェ曲線と楕円の関係について私が質問したのはこちらです
正直、以下の外国人の回答はほとんど理解できませんでしたが、幸いなことにコードサンプルページを提供していただいたので理解できました。 . 改めて感謝の意を表したいと思います。彼の答えによると、楕円を描くために私が見つけた方法は次のとおりです。

コードをコピー
コードは次のとおりです。次のように:

//Ellipse
CanvasRenderingContext2D.prototype.oval = function (x, y, width, height) {
var k = (width/0.75)/2,
w = 幅/ 2、
h = 高さ/2;
this.beginPath();
this.bezierCurveTo(x k, y-h, x k) , y h, x, y h );
this.bezierCurveTo(x-k, y h, x-h, x, y-h);
this.closePath();


この方法は正確で、必要なコードは少なく、奇妙な癖はありません。これを覚えておいてください。楕円を描くベジェ曲線の制御点の座標に対する楕円の幅の比率は次のとおりです:
ベジェ制御点 x=(楕円の幅/0.75)/2 これはすでにに反映されたコードにあります。

楕円を描くには、上記の 4 つの方法を試すことができます。
もっと簡単な方法を見つけたら、議論のために私たちと共有してください。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Arc Battlemage: Intel の次世代ゲーム グラフィックス カードに 3 つの GPU が搭載されることを示唆するリーク Arc Battlemage: Intel の次世代ゲーム グラフィックス カードに 3 つの GPU が搭載されることを示唆するリーク Jul 02, 2024 am 09:44 AM

Intel の次世代 GPU アーキテクチャは、Intel Lunar Lake の一部として 9 月に発売される予定です。 Meteor Lake の Arc Alchemist iGPU と同様に、iGPU には最大 8 個の Xe コアが搭載されていますが、新しいアーキテクチャでは 50% 高いパフォーマンスが達成されると予想されています。

キャンバス矢印プラグインとは何ですか? キャンバス矢印プラグインとは何ですか? Aug 21, 2023 pm 02:14 PM

キャンバス矢印プラグインには、1. シンプルで使いやすい API を備え、カスタムの矢印効果を作成できる Fabric.js、2. 矢印を描画する機能を提供し、さまざまな矢印を作成できる Konva.js が含まれます。スタイル; 3. 豊富なグラフィックス処理機能を提供し、さまざまな矢印効果を実現できる Pixi.js; 4. 矢印のスタイルやアニメーションを簡単に作成および制御できる Two.js; 5. さまざまな矢印効果を作成できる Arrow.js ; 6. 大まかな.jsでは、手描きの矢印などが作成できます。

キャンバスクロックの詳細は何ですか? キャンバスクロックの詳細は何ですか? Aug 21, 2023 pm 05:07 PM

キャンバス時計の詳細には、時計の外観、目盛り、デジタル時計、時針、分針、秒針、中心点、アニメーション効果、その他のスタイルなどが含まれます。詳細な紹介: 1. 時計の外観、キャンバスを使用して時計の外観として円形の文字盤を描画し、文字盤のサイズ、色、境界線などのスタイルを設定できます; 2. 目盛り線、目盛り線を描画します。位置; 3. デジタル時計、現在の時と分を示すために文字盤にデジタル時計を描くことができます; 4. 時針、分針、秒針など。

キャンバス フレームワークを学び、一般的に使用されるキャンバス フレームワークについて詳しく説明します キャンバス フレームワークを学び、一般的に使用されるキャンバス フレームワークについて詳しく説明します Jan 17, 2024 am 11:03 AM

Canvas フレームワークを探索する: 一般的に使用される Canvas フレームワークを理解するには、特定のコード例が必要です。 はじめに: Canvas は HTML5 で提供される描画 API であり、これを通じて豊富なグラフィックスやアニメーション効果を実現できます。描画の効率と利便性を向上させるために、多くの開発者がさまざまな Canvas フレームワークを開発しました。この記事では、一般的に使用される Canvas フレームワークをいくつか紹介し、読者がこれらのフレームワークの使用方法をより深く理解できるように、具体的なコード例を示します。 1.EaselJSフレームワークEa

html2canvas にはどのようなバージョンがありますか? html2canvas にはどのようなバージョンがありますか? Aug 22, 2023 pm 05:58 PM

html2canvas のバージョンには、html2canvas v0.x、html2canvas v1.x などが含まれます。詳細な紹介: 1. html2canvas v0.x (html2canvas の初期バージョン) 最新の安定バージョンは v0.5.0-alpha1 です。これは、多くのプロジェクトで広く使用され、検証されている成熟したバージョンです。2. html2canvas v1.x、これは html2canvas の新しいバージョンです。

uniapp は、キャンバスを使用してチャートやアニメーション効果を描画する方法を実装します。 uniapp は、キャンバスを使用してチャートやアニメーション効果を描画する方法を実装します。 Oct 18, 2023 am 10:42 AM

キャンバスを使用して uniapp でチャートやアニメーション効果を描画する方法には、特定のコード例が必要です。 1. はじめに モバイル デバイスの普及に伴い、モバイル端末上でさまざまなチャートやアニメーション効果を表示する必要があるアプリケーションがますます増えています。 uniapp は、Vue.js に基づくクロスプラットフォーム開発フレームワークとして、キャンバスを使用してチャートやアニメーション効果を描画する機能を提供します。この記事では、uniapp がキャンバスを使用してチャートやアニメーション効果を実現する方法を紹介し、具体的なコード例を示します。 2.キャンバス

tkinter Canvas にはどのようなプロパティがありますか? tkinter Canvas にはどのようなプロパティがありますか? Aug 21, 2023 pm 05:46 PM

tkinter Canvas 属性には、bg、bd、relief、width、height、cursor、highlightbackground、highlightcolor、highlightthickness、insertbackground、insertwidth、selectbackground、selectforeground、xscrollcommand 属性などが含まれます。詳しい紹介

ゲーム開発におけるキャンバスの強力な役割と応用を探る ゲーム開発におけるキャンバスの強力な役割と応用を探る Jan 17, 2024 am 11:00 AM

ゲーム開発におけるキャンバスの力と応用を理解する 概要: インターネット技術の急速な発展に伴い、Web ゲームはプレイヤーの間でますます人気が高まっています。 Web ゲーム開発の重要な部分として、キャンバス テクノロジーがゲーム開発に徐々に登場し、その強力なパワーと応用性を示しています。この記事では、ゲーム開発におけるキャンバスの可能性を紹介し、具体的なコード例を通じてその応用例を示します。 1. Canvas テクノロジの概要 Canvas は HTML5 の新しい要素で、これにより次のことが可能になります。

See all articles