正多角形

夏空

湧き上がる雲。 いかにも夏の空。

しばらく前に css の三角関数の用途を考えて、時計の文字盤を作るのに使ってみた。 文字盤のように円周上に何かを並べるには便利だとは思ったが、同時に、用途が文字盤しか思いつかないのはどうなんだとも思った。

そして今日。 雲をぼんやり眺めているときに、三角関数を clip-path と組み合わせれば正多角形が作れるのではないかと閃いた。 円周をN等分する点を結べばいいのだから簡単だろうと。

以下、その成果。

html

<div class="polygon_base"> <div class="p3"></div> </div> <div class="polygon_base"> <div class="p4"></div> </div> <div class="polygon_base"> <div class="p5"></div> </div>

css

.polygon_base { width: 200px; height: 200px; border: 1px solid black; border-radius: 50%; padding: 4px; } .polygon_base div { width: 100%; height: 100%; background: black; } .polygon_base .p3 { clip-path: polygon( calc( 50% + cos( 360deg / 3 * 0 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 3 * 0 - 90deg ) * 50% ), calc( 50% + cos( 360deg / 3 * 1 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 3 * 1 - 90deg ) * 50% ), calc( 50% + cos( 360deg / 3 * 2 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 3 * 2 - 90deg ) * 50% ) ); } .polygon_base .p4 { clip-path: polygon( calc( 50% + cos( 360deg / 4 * 0 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 4 * 0 - 90deg ) * 50% ), calc( 50% + cos( 360deg / 4 * 1 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 4 * 1 - 90deg ) * 50% ), calc( 50% + cos( 360deg / 4 * 2 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 4 * 2 - 90deg ) * 50% ), calc( 50% + cos( 360deg / 4 * 3 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 4 * 3 - 90deg ) * 50% ) ); } .polygon_base .p5 { clip-path: polygon( calc( 50% + cos( 360deg / 5 * 0 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 5 * 0 - 90deg ) * 50% ), calc( 50% + cos( 360deg / 5 * 1 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 5 * 1 - 90deg ) * 50% ), calc( 50% + cos( 360deg / 5 * 2 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 5 * 2 - 90deg ) * 50% ), calc( 50% + cos( 360deg / 5 * 3 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 5 * 3 - 90deg ) * 50% ), calc( 50% + cos( 360deg / 5 * 4 - 90deg ) * 50% ) calc( 50% + sin( 360deg / 5 * 4 - 90deg ) * 50% ) ); }

見ての通り、頂点の指定に同じ形の式を並べるだけ。 根性さえあれば何角形でもできる。 俺の根性は五角形で尽きかけているが。

同じ形の式の繰り返しだからと、 JavaScript で作ってみた多角形ジェネレーター。

数字を変えると、その数の正多角形を描画する。 最小3から最大20まで。

折角の正多角形だが、15ぐらいから違いが地味になってきて、20はもう円。 上限を20にしたのもこれが理由。 これがゲームのグラフィックだったら、15ぐらいで円と言って許されそう。 ポリゴンならシェーディングで余裕で誤魔化せそうだし。

で、この正多角形をどこで使うのか?

なんてことを考えちゃ駄目。

以下、ソース。

html

<div class="polygon_base"> <div class="pN" id="p0"></div> </div> <div> <input type="number" value="3" min="3" max="20" onchange="applyNumber(this)" /> </div>

JavaScript

function applyNumber( elm ) { const n = parseInt( elm.value ); const s = ( new Array( n ) ) .fill( "" ) .map( ( e, i ) => `calc( 50% + cos( 360deg / ${ n } * ${ i } - 90deg ) * 50% ) calc( 50% + sin( 360deg / ${ n } * ${ i } - 90deg ) * 50% )` ) .join( "," ); document.getElementById( "p0" ).style.clipPath = `polygon( ${ s } )`; }

正五角形でちょっと頑張ったのを悔やんでしまう簡単さ。 根性とか、ねぇ。