指定角度のバイナリデータ生成
指定角度のバイナリデータ生成
指定角度のバイナリデータ生成
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>指定角度のバイナリデータ生成</title>
<style>
#binaryData {
display: table;
border-collapse: collapse;
margin-top: 20px;
}
#binaryData div {
display: table-row;
}
#binaryData div div {
display: table-cell;
width: 20px;
height: 20px;
border: 1px solid black;
box-sizing: border-box;
text-align: center;
line-height: 20px;
}
</style>
</head>
<body>
<h1>指定角度のバイナリデータ生成</h1>
<form>
<label for="angleInput">角度(0~90度):</label>
<input type="number" id="angleInput" name="angle" min="0" max="90" value="45">
<button type="button" onclick="generateBinaryData()">生成</button>
</form>
<div id="binaryData"></div>
<br>
<br>
<br>
<br>
<br>
<script>
// 指定された角度のバイナリデータを生成する関数
function generateBinaryData() {
const angle = parseInt(document.getElementById('angleInput').value);
const originalRows = 16;
const originalCols = 16;
const maxSize = Math.max(originalRows, originalCols) * 2; // 拡張された正方形のサイズ
const binaryData = [];
// 角度が45度より大きいかどうかで処理を変える
const isSteep = angle > 45;
const initialPattern = [];
// 拡張されたサイズに基づいて初期パターンの計算
if (isSteep) {
for (let y = 0; y < maxSize; y++) {
const index = Math.round(y * Math.tan((90 - angle) * Math.PI / 180));
initialPattern.push(index);
}
} else {
for (let x = 0; x < maxSize; x++) {
const index = Math.round(x * Math.tan(angle * Math.PI / 180));
initialPattern.push(index);
}
}
// 拡張されたバイナリデータの生成
for (let y = 0; y < maxSize; y++) {
const rowData = [];
for (let x = 0; x < maxSize; x++) {
let value;
if (isSteep) {
value = (initialPattern[y] + x) % maxSize; // maxSizeで割った余りを使用
} else {
value = (initialPattern[x] + y) % maxSize; // maxSizeで割った余りを使用
}
rowData.push(value);
}
binaryData.push(rowData);
}
// 必要な部分だけを抽出して切り取る
const trimmedData = binaryData.slice(0, originalRows).map(row => row.slice(0, originalCols));
// 生成したバイナリデータを表示
displayBinaryData(trimmedData);
}
// バイナリデータを表示する関数
function displayBinaryData(binaryData) {
const binaryDiv = document.getElementById('binaryData');
binaryDiv.innerHTML = ''; // 一旦クリア
// インデックスごとの色を保存するオブジェクト
const colorMap = {};
binaryData.forEach(row => {
const rowDiv = document.createElement('div');
row.forEach(value => {
const cellDiv = document.createElement('div');
cellDiv.textContent = value;
// インデックスがまだ色が割り当てられていない場合は、新しい色を割り当てる
if (!colorMap[value]) {
colorMap[value] = getRandomColor();
}
cellDiv.style.backgroundColor = colorMap[value]; // インデックスごとの色をセット
rowDiv.appendChild(cellDiv);
});
binaryDiv.appendChild(rowDiv);
});
}
// ランダムな色を生成する関数
function getRandomColor() {
const letters = '0123456789ABCDEF';
let color = '#';
for (let i = 0; i < 6; i++) {
color += letters[Math.floor(Math.random() * 16)];
}
return color;
}
// 初期化時に生成する
generateBinaryData();
</script>
</body>
</html>