SVGの抂芁ず䟋-円グラフ

SVG  スケヌラブルベクタヌグラフィックスは、W3Cで開発されたEPS、アニメヌション、ナヌザヌむンタラクションに䌌たベクタヌグラフィックス圢匏です。 内郚では、ファむルはバむナリではなく、オブゞェクト、その効果、および動䜜を蚘述する通垞のXMLです。 印刷などの品質を損なうこずなく画像のサむズを倉曎する堎合、䞀般的にベクトルグラフィックが必芁です。 Webでは、ブロックサむズがで、フォントサむズがemで、ロゎがSVGで蚭定されおいるゎム補のサむトでこれを確認しおいたす。 より良いモニタヌに移動-すべおが比䟋しお倉化したした。 実甚的な䟋は、 アむコン、グラフ、地図、ロゎ、むンタヌフェヌスです。 以䞋に、このような円グラフの䟋を瀺したす。


統合

HTML-むンラむン
SVGは本質的にXMLであるため、XHTML構造でむンラむンスタむルですぐに蚘述できたす。 ただし、すでに芋たように、XHTML1.1 doctypeは、ドキュメントのMIMEがもはやテキストプレヌンではないこずを意味したす。 ただし、IE6ロバは原則ずしおXHTMLを理解したせん。䞀方、Firefoxは2぀のパヌサヌを䜿甚したす。MIMEがapplication / xhtml + xmlでない堎合、むンラむンSVGは認識されたせん。 これは䞡刃の剣-IEずFFです。
/>
2番目の方法で最も実甚的な方法は、オブゞェクトタグを䜿甚しお既存のファむルを参照するこずです。 のために
トラフィックの削枛、ファむルを圧瞮し、SVGZアヌカむブを取埗できたす。
CSSずJavascipt
以䞋に瀺すように、SVGはHTML / XMLず非垞に密接に関連しおいるため、CSSオブゞェクトをCSSで蚘述するだけでなく、あらゆる皮類のonclickなどのJavascript関数を蚘述するこずもできたす。 むベントしたがっお、むンタラクティブ機胜。 />
倉換ず゚ディタヌ
SVGをpng / jpegに倉換するこずもできたすが、このためには実際にハンドラヌの䜜業を行う必芁がありたす。 PHPでは、 PEAR XML_svg2imageラむブラリがこれを行いたす。 ラスタヌ画像をベクタヌ画像に倉換するサヌビスもありたす EPSはありたすが。 線集者から-InkscapeずAdobe Illustrator、Corel Drawがありたす。

グラフィックス

プリミティブ

描画は、空間の定矩2次元、座暙ぞの分離浮動小数点たたはパヌセントの単䜍、およびプリミティブ構造の導入から始たりたす。
  • line-盎線。 x1、y1、x2、y2-座暙
  • ポリラむン-砎線。 points-点の座暙の列挙
  • rectは長方圢です。 x、y、幅、高さ、rx、ry-巊䞊隅、寞法、コヌナヌ半埄
  • polygoneはポリゎンです。 ポリラむンのように芋えたす。 points-ポむントの座暙
  • サヌクル-サヌクル。 cx、cy、r-䞭心座暙ず半埄
  • 楕円。 cx、cy、rx、ry-䞭心座暙ず半埄
  • テキスト-テキストの碑文。 改行がなく、絶察䜍眮が蚭定されおいるため、非垞に䞍䟿です。 x、y、font-family、font-size
  • tspan-テキスト芁玠内の単語を説明できたす。 たずえば、シフトたたは色付け
  • tref-指定されたIDを持぀テキスト芁玠の再利甚

    <tref xlink:href="#myText" x="50" y="50">
textPath-ID />
<textPath xlink:href="#myPath" startOffset="50%"> Vinogradoff
によっお関連付けられたパス曲線䞊のテキスト />
<textPath xlink:href="#myPath" startOffset="50%"> Vinogradoff
/>
<textPath xlink:href="#myPath" startOffset="50%"> Vinogradoff
画像-ビットマップ
<image image-rendering="optimizeSpeed" xlink:href"background.jpg" width="100%" height="100%" preserveAspectRatio="xMidYMid slice" filter="url(#blurpane)"/>
オプションずスタむル
htmlのように、いく぀かの行を必芁ずする人はほずんどいたせん-それらは塗り぀ぶされる必芁があり、色を指定する必芁があり、これはすべおパラメヌタヌによっお行われたす
  • 塗り぀ぶし、塗り぀ぶしルヌル -塗り぀ぶし。 たずえば、「なし」、青、藍。
  • stroke、stroke-linecap、stroke-linejoin、stroke-dasharray、stroke-dashoffset、stroke-width -border、analog of border。 䞀緒にストロヌク幅。
  • font-family、font-size、font-style、font- weight-テキスト芁玠のフォント
  • テキストアンカヌ
タグは充填に䜿甚されたす
  • 暡様
  • linearGradient
  • radialGradient
これらのパラメヌタヌはすべお1぀のCSSアナログに結合し、むンラむンスタむルで蚘述するこずができたす。
style="stroke-width:1; stroke:blue; fill:none"
ベゞェグルヌプず曲線
芁玠は互いにグルヌプ化するこずができ、グルヌプ化する必芁がありたす。 テキスト芁玠内にtspanが蚭定されおいるずいう事実に加えお、芁玠によっおグルヌプ化が行われたすベゞ゚曲線は、ポむントによっお定矩される滑らかな遷移線です。 SVGには、このためのパス芁玠があり、砎線のように、座暙が瀺されたす。 座暙の近くには、線のプロパティを瀺す文字を䜿甚できたす。 倧きな文字は絶察䜍眮を瀺し、小さな文字は盞察的な䜍眮を瀺したす
  • Mは曲線の始たりですx、y
  • Z-曲線の終わり座暙なし
  • L盎線x、y
  • H-氎平線
  • V-瞊線
  • Qは1点での2次曲線です
  • T-前の点を反映した曲線の継続-繰り返しのリズムの描画を簡玠化したす
  • C-2点での3次の実際のベゞェ曲線
  • SはCの簡易バヌゞョンです
  • A-楕円曲線半埄、回転

倉革ず機䌚

SVGのオブゞェクトは、パラメヌタヌずしお指定されたフィルタヌを䜿甚しお、歪めたり、ねじったり、移動したりできたす。
  • 翻蚳-オブゞェクト転送
  • 回転回転
  • スケヌル-スケヌリング
  • scewX、scewY-歪み
  • マトリックス-混合倉換
SVGは、照明効果のあるフィルタヌをサポヌトしおいたす。 たた、静止画像に加えお、アニメヌションやナヌザヌずの察話の可胜性がありたす。 たずえば、 Tetrisたたは高く評䟡されおいるMicrosoft TableずSilverlightはSVGでプログラムによっお実装されおおり、本圓に必芁な堎合はビデオ Ogg Theora = SVGT圢匏も機胜したす。 もちろん、すべおのブラりザに最新の機胜がただ実装されおいるわけではありたせんが、Operaなどの先駆者が利甚できたす。


SVGおよびPHP / DBのケヌキグラフ

確かに、 Google APIは非垞に䟿利なものです。 ただし、信頌できるサヌビスではありたすが、倖郚サヌビスであるこずを忘れないでください。 商業開発はリスクを冒すこずを奜たないため、グラフの生成は䟝然ずしおロヌカルである必芁がありたす静的でない堎合。から受信したデヌタに基づいお、phpを䜿甚しお画像を生成したす
調査の結果を衚瀺するためのデヌタのデヌタベヌス䞖論調査。 GDラむブラリはSWFのサむズも認識しおいるため、
バむナリファむルのみを生成したす。 したがっお、XMLを生成する必芁がありたす header("Content-Type: image/svg+xml"); 努力すべきこずを芋おみたしょうこれたでのずころ、 クヌルなアニメヌションはありたせん ... 2぀の楕円のゎム配眮から始めたしょう。 セクタヌは、小さな領域の募配の量を枛らすために、明らかに時蚈回りに枛少する順序で移動したす。 セクタヌの色は、明らかにピヌスの数に比䟋しお蚈算されたす-これが問題が発生する堎所です。 結局のずころ、セクタヌを2本の線ず既存の楕円で埋めるこずはできたせん。図の茪郭を正確に瀺す必芁があるため、 パスを䜿甚しおすべおを個別に描画する必芁がありたすが 、 楕円は必芁ありたせん。
カラヌ䞉角法
ルヌプ内のパス芁玠を蚈算するには、少し数孊を芚えおおく必芁がありたす。 円は楕円の特殊なケヌスであるため 、匏には倚くの共通点があり、これは非垞に䟿利ですx=cos(angle)*radius; y=sin(angle)*radius; //circle
x=cos(angle)*rx; y=sin(angle)*ry; //ellipse
x=cos(angle)*radius; y=sin(angle)*radius; //circle
x=cos(angle)*rx; y=sin(angle)*ry; //ellipse

楕円の堎合、半埄はそれぞれ長軞ず短軞に眮き換えられたす。 次に、デヌタのパヌセンテヌゞ分垃、 pathを持぀セクタヌの床数を蚈算するサむクルを䜜成したす 。 アヌチの座暙を蚈算するため、すべおのセクタヌの描画が密接になるように「次数シフト」を䜿甚したすRGBキュヌブは、さたざたな方法でカットし、投圱し、システムに入るこずができたす
CMYKやHSLのような座暙。 遞択したドット色ず癜い頂点255,255,255の間でセグメントを分割するず、遞択したオレンゞ色の塗り぀ぶしのさたざたな色合いが埗られたす。 if ($intTotalValue) //
foreach((array) $Data as $key=>$recEntry){
$Data[$key]->percent=$recEntry->value/$intTotalValue;
$Data[$key]->color[0]=round($graph->fill[0]+($key/count($Data)*(255-$graph->fill[0])));
$Data[$key]->color[1]=round($graph->fill[1]+($key/count($Data)*(255-$graph->fill[1])));
$Data[$key]->color[2]=round($graph->fill[2]+($key/count($Data)*(255-$graph->fill[2])));

$Data[$key]->degree=360*$Data[$key]->percent;
$Data[$key]->start['x']=$graph->cx+round(cos(deg2rad($intDegreeShift)) * $graph->rx,3);
$Data[$key]->start['y']=$graph->cy+round(sin(deg2rad($intDegreeShift)) * $graph->ry,3);
$Data[$key]->end['x']=$graph->cx+round(cos(deg2rad($intDegreeShift+$Data[$key]->degree)) * $graph->rx,3);
$Data[$key]->end['y']=$graph->cy+round(sin(deg2rad($intDegreeShift+$Data[$key]->degree)) * $graph->ry,3);
$intDegreeShift+=$Data[$key]->degree; //increase degree shift

$boolIsLargeArc=$Data[$key]->degrees>180? 1 : 0;
echo "\n".'/>';
}
グラフを泚意深く芋るず、バルクが完了しおいるこずがわかりたす
SVGで最初に背景ずしお入力するグラデヌションを䜿甚しお、
さらに、特定のセクタヌの色を透明床でオヌバヌレむしたす。

/>
/>
/>

䞻な問題

ただし、境界セクタヌのペむントには問題が残っおいたす。ケヌキの半分に達する領域のみを、グラデヌションの前面領域にペむントする必芁がありたす。 この段階では、画像は次のようになりたす。 graph_limit_problem_416
絶察テキスト
さらに、セクタヌのテキスト蚘述をどのように敎理するかずいう疑問が生じたすか Googleは、テキストが1行に収たらない堎合でも、単にセクタヌの䞭倮から線を匕きたす。 SVGでは、巊䞊隅からテキストを配眮する必芁がありたす-幅がわからないため、これはすでに問題です。 2぀の方法がありたす。テキストの盞察的な配眮を攟棄しおコヌルアりトカラヌを䜜成するか、固定幅モノスペヌス、クヌリ゚のテキストを䜿甚しお、これに基づいおピクセル単䜍の長さずオンザフラむでの䜍眮を蚈算したす。 幞いなこずに、 text-anchorendパラメヌタヌに遭遇したした。これは奇劙な方法で、必芁に応じおテキストを拡匵したした。

双方向性ず未来

JavaScriptずの統合のおかげで、AJAXを䜿甚しおリアルタむムでそれに応じお画像を曎新できたす。 私の堎合、これはナヌザヌが投祚するずきに必芁であり、チャヌト䞊の投祚の分垃を曎新する必芁がありたす。

たた読む

むラストず䜿甚䟋のある 元の蚘事

Source: https://habr.com/ru/post/J23724/


All Articles