土曜日, 4月 12, 2025

Let's start JavaScript 61 
HTML上で16進数からRGB、CMYK、HSBを表示

HTML上で16進数からRGB、CMYK、HSBの値を表示します。
以前作成したもののアップデート版です。

<!-- index.html -->
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport"
                content="width=device-width, initial-scale=1.0">
<title>16進数カラーのRGB・CMYK・HSB表示</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
background-color: #222;
color: white;
padding: 20px;
}
.color-box {
width: 150px;
height: 150px;
margin: 20px auto;
border-radius: 10px;
border: 2px solid white;
}
input {
width: 100px;
text-align: center;
font-size: 16px;
margin: 10px;
}
.result {
margin-top: 20px;
font-size: 18px;
}
</style>
</head>
<body>
<h2>16進数カラーのRGB・CMYK・HSB変換</h2>
<label>カラーコード(#RRGGBB):</label>
<input type="text" id="hexInput" value="#ff69b4">
<button onclick="convertColor()">変換</button>

<div class="color-box" id="colorBox"></div>

<div class="result">
<p><strong>RGB:</strong> <span
                id="rgbValue"></span></p>
<p><strong>CMYK:</strong> <span
                id="cmykValue"></span></p>
<p><strong>HSB:</strong> <span
                id="hsbValue"></span></p>
</div>

<script>
function hexToRGB(hex) {
hex = hex.replace(/^#/, '');
if (hex.length === 3) {
hex = hex.split('').map(x => x + x).join('');
}
let r = parseInt(hex.substring(0, 2), 16);
let g = parseInt(hex.substring(2, 4), 16);
let b = parseInt(hex.substring(4, 6), 16);
return [r, g, b];
}

function rgbToCMYK(r, g, b) {
let c = 1 - (r / 255);
let m = 1 - (g / 255);
let y = 1 - (b / 255);
let k = Math.min(c, m, y);
if (k === 1) {
return [0, 0, 0, 100];
}
c = ((c - k) / (1 - k)) * 100;
m = ((m - k) / (1 - k)) * 100;
y = ((y - k) / (1 - k)) * 100;
k = k * 100;
return [Math.round(c), Math.round(m),
                Math.round(y), Math.round(k)];
}

function rgbToHSB(r, g, b) {
let max = Math.max(r, g, b), min = Math.min(r, g, b);
let h, s, v = max;

let d = max - min;
s = max === 0 ? 0 : d / max;

if (max === min) {
h = 0;
} else {
switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}

return [Math.round(h * 360), Math.round(s * 100),
                Math.round(v / 255 * 100)];
}

function convertColor() {
let hex = document.getElementById("hexInput").value.trim();
if (!/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(hex)) {
alert("正しい16進数カラーコードを入力してください
                (例: #ff69b4)。");
return;
}

let [r, g, b] = hexToRGB(hex);
let [c, m, y, k] = rgbToCMYK(r, g, b);
let [h, s, v] = rgbToHSB(r, g, b);

document.getElementById("colorBox").
                style.backgroundColor = hex;
document.getElementById("rgbValue").
                textContent = `(${r}, ${g}, ${b})`;
document.getElementById("cmykValue").
                textContent = `(${c}%, ${m}%, ${y}%, ${k}%)`;
document.getElementById("hsbValue").
                textContent = `(${h}°, ${s}%, ${v}%)`;
}

window.onload = convertColor;
</script>
</body>
</html>
<!-- index.html -->

表示するとデフォルトの hotpink(#ff69b4)が表示されます。確認したい色の16進巣を入力し[変換]をクリックすれば・・・

結果が表示されます。

TCDW8369
牛乳が手に入って雨に濡れた方がよかったのか悩む

昨日は、スーパの買い物で帰宅したら突然の豪雨。ラッキーでしたが、毎度おなじみ「運の無駄遣い」ですかね〜(^o^)汗。実はス−パーでは、なぜか愛飲しているの牛乳が品切れだったんです。牛乳が手に入って雨に濡れた方がよかったのか悩む今朝(^o^)

金曜日, 4月 11, 2025

modoローポリモデリング 56 
ボックス型パッケージデザイン展開

単なる立方体にボックス型パッケージデザインを展開する手順を整理しました。
以下も参照してください。


これは好みですが、私は背景にスタジオ撮影風の背景を配置するようにしています。

取りあえず背景は別メッシュとして初めは日表示にします。新しいメッシュ上で、立方体を作成するパッケージのサイズに調整します。ここでは単に比率とっしていますが、実データには後からも調整可能です。

次に作成した立方体の展開図のためのスリット位置をエッジ選択してからUVモードに入ると、上の様な画面になりますが・・・

左端の[作成]>[展開ツール]を選択し、展開図相当部分をクリックすれば正しい比率の展開図になります。

そのまま[テクスチャ]>[UVを書き出す]にてEPSまたはSVGを選んで書き出します。


ただしデフォルト(※)の[境界サイズ]だと御題なサイズになってしまうので、適宜調整し、[ライン幅]もそれに合わせて聴視します。

※デフォルトは
[ライン幅:1mm]、[境界サイズ:1m]


今回はSVGで書き出しました。


書き出したデータをPhotosshopで開き・・・


展開図に合わせてパッケージのデザインを配置してjpg等で書き出します。


予めボックスに任意のマテリアルを設定し、それに対して、[シェーディング]>[レイヤー追加]>[画像]>[読み込み]>[画像の読み込み]で書き出した五臓を指定します。ここで、展開図が逆さもになっていたあミスを発見したのですが・・・

回転すれば問題ないので、そのまま進めます。

背後に背景のメッシュを表示とし、任意のマテリアルを設定してレンダリングすれば完成です。

レンダリングの結果です。

modo 17.1v1

TCDW8368
最低1億円らしいので笑うしかないです

チョットした散歩も花粉が気になって躊躇しますね。そうは言っても買い物しないと困るので出かけますが、宇宙服が欲しいですね。最も最低1億円らしいので笑うしかないです(^o^)

木曜日, 4月 10, 2025

JavaScriptでAI遊び 41 
2色間のグラデを指定ステップ数の矩形に分割(RGB)

2色間のグラデーションを指定ステップ数の矩形に分割します。RGB版。グラデーションは2色間であれば線形、円形のどちらでも問題ありませんが、フリーグラデーションには未対応です。

function mmToPoints(mm) {
return mm * 2.83465; // 1 mm ≈ 2.83465 pt
}

function interpolateColor(c1, c2, t) {
var color = new RGBColor();
color.red = c1.red + (c2.red - c1.red) * t;
color.green = c1.green + (c2.green - c1.green) * t;
color.blue = c1.blue + (c2.blue - c1.blue) * t;
return color;
}

function createGradientStepsScaled() {
if (app.documents.length === 0) {
alert("ドキュメントを開いてください。");
return;
}

var doc = app.activeDocument;
var selection = doc.selection;

if (selection.length !== 1 || selection[0].typename !==
        "PathItem" || !selection[0].filled || selection[0].
        fillColor.typename !== "GradientColor") {
alert("1つのグラデーション塗りのオブジェクトを
            選択してください。");
return;
}

var gradient = selection[0].fillColor.gradient;
if (gradient.gradientStops.length < 2) {
alert("グラデーションに2つ以上の色が必要です。");
return;
}

var steps =
        parseInt(prompt("分割するステップ数を入力:", "10"), 10);
if (isNaN(steps) || steps < 2) {
alert("2以上の整数を入力してください。");
return;
}

var totalWidthMM =
        parseFloat(prompt("全体の幅(mm)を入力:", "100"));
var totalHeightMM =
        parseFloat(prompt("全体の高さ(mm)を入力:", "50"));

if (isNaN(totalWidthMM) || isNaN(totalHeightMM) ||
        totalWidthMM <= 0 || totalHeightMM <= 0) {
alert("正しい数値を入力してください。");
return;
}

var totalWidth = mmToPoints(totalWidthMM);
var totalHeight = mmToPoints(totalHeightMM);

var rectWidth = totalWidth / steps;
var rectHeight = totalHeight;

var artboard =
        doc.artboards[doc.artboards.getActiveArtboardIndex()];
var artboardBounds = artboard.artboardRect;
var centerX = (artboardBounds[0] + artboardBounds[2]) / 2;
var centerY = (artboardBounds[1] + artboardBounds[3]) / 2;

var startX = centerX - totalWidth / 2;
var startY = centerY + totalHeight / 2;

for (var i = 0; i < steps; i++) {
var t = i / (steps - 1);

// グラデーションストップ間の色を計算
var lowerIndex = 0;
var upperIndex = gradient.gradientStops.length - 1;
for (var j = 0; j < gradient.gradientStops.length - 1; j++) {
if (t >= gradient.gradientStops[j].rampPoint / 100 &&
            t <= gradient.gradientStops[j + 1].rampPoint / 100) {
lowerIndex = j;
upperIndex = j + 1;
break;
}
}

var tLerp =
            (t - gradient.gradientStops[lowerIndex].rampPoint / 100) /
((gradient.gradientStops[upperIndex].rampPoint / 100) -
                    (gradient.gradientStops[lowerIndex].rampPoint / 100));
var fillColor =
            interpolateColor(gradient.gradientStops[lowerIndex].color,
            gradient.gradientStops[upperIndex].color, tLerp);

var rect = doc.pathItems.rectangle(startY, startX + i *
            rectWidth, rectWidth, rectHeight);
rect.filled = true;
rect.fillColor = fillColor;
rect.stroked = false;
}
}

createGradientStepsScaled();


グラデーションを設定したオブジェクトを選択して実行すると・・・


サイズとステップ数を指定します。サイズは全体のサイズになります。


結果の配置位置は中心です。

TCDW8367
わし掴みして帰って行ったのには驚きました

昨日、花粉症に処方箋を持って薬局に行ったら、私の前に会計を済ませたオバサンさんが、サービスで置いてあるキャンディーを、わし掴みして帰って行ったのには驚きました。オバサンはやっぱり最強ですね(^o^)汗

水曜日, 4月 09, 2025

InDesignでレイアウトグリッド本文に埋め込む表組み設定



以前整理した表組みの設定はもう少し簡単に設定できますので再整理しました。

InDesign マージンと段落事始め(10)チョットややこしい表作成 2022/07/21

本文と同等の文字グミ状態で表組みをする場合です。

段落スタイルはデフォルトのフォントサイズ13に対して、
行送り23Q(行間10H)として計算します。

セルスタイルの余白は1.25mm(行間10Hの半分)。
(10/2/4)=1.25mm

表スタイルの[表の設定]は、
罫線0.25mmに対して表の前と後ろのアキは1.125mmとします。
(10/2/4)-(0.25/2)=1.125mm

もし、上の様に表の前後を1行空けたい場合は・・・

表スタイルの[表の設定]は、
罫線0.25mmに対して表の前と後ろのアキは6.875mmとします。
((10+13+(10/2))/4)-(0.25/2)=6.875mm

整理すると・・・
フォントサイズ:13Q
行間:10H
罫線サイズ0.25mm

a=(10+13)/4=5.75mm
b=((10+13+5)/4)-(0.25/2)=6.875mm
c=5/4=1.25mm(ここは線幅を考慮しなくても大丈夫?です)
d=(5/4)-(0.25/2)=1.125mm

TCDW8366
そうじゃないと知った切っ掛けは餡ドーナツとの出会いでした

Baby Alien 076
みんな大好きドーナッツ(^o^)
穴があいているのがドーナツだと小学生の頃は信じていました。オバカですね〜。そうじゃないと知った切っ掛けは餡ドーナツとの出会いでした(^o^)

火曜日, 4月 08, 2025

Blender Study Notes 54 
ポリゴンのローポリ化はデシメートで調整(2)

ポリゴンのローポリ化はデシメートでの調整がとてもいい感じですが、前回はBlender上だけでのしょりだったので、今回はZBrushで作成したデータで実験してみました。

まずZBrushで適当なデータを作成してobj形式で書き出します。

objデータをBlenderに読み込みます。

編集モードでポリゴン状態を確認。

オブジェクトモードに変更し[モディファイアー]>[モディファイアーを追加] >[生成]>[デシメート]にて[分割]>[復元]を[2]に設定して[適用]します。これでポリゴンの密度が下がります。

処理を確定後に編集モードでポリゴン状態を確認します。前回のように綺麗にはいきませんが、許容範囲だと思います。

もう少しローポリを確認したいので、[デシメート]にて[分割]>[復元]を[3]に設定して[適用]した結果です。

処理を確定後に編集モードでポリゴン状態を確認します。


もちろん右クリックで[スムースシェード]にすれば滑らかに表示出来るので、このくらいなら問題ないカモですね。 

Blender 4.3.1 macOS

TCDW8365
ソレを見ないと計算できないのは、なんとも複雑な感じ

滅多に使わない単位計算のために関数電卓の関数を調べて使うのですが、マニュアル無くすと致命的ですね。もちろん無くしていません。最悪でもダウンロードできますが、ソレを見ないと計算できないのは、なんとも複雑な感じです。

月曜日, 4月 07, 2025

modo〜blender互換考 06 
modoからobjを書き出す時はサブディビジョンが重要

modoからobjを書き出す時は[TAB]キーでサブディビジョン設定の有無がとても重要です。

もし[TAB]キーでサブディビジョン設定せずにOBJ形式で書き出し・・・

Blenderに読み込むと、オブジェクトモードで[右クリック]>[フラッドシェード]を実行した状態になります。


しかし、オブジェクトモードで[右クリック]>[スムーズシェード]を実行してもスムーズ表示には成りません。

また、このまま編集モードにするとエッジが謎のブルー状態になります。編集は出来ますが、好ましくない状態です。

そこで、[TAB]キーでサブディビジョン設定してOBJ形式で書き出し・・・

Blenderに読み込むと、オブジェクトモードで[右クリック]>[スムーズシェード]を実行した状態になります。

このまま編集モードにしても、特に問題はありません。

もちろん、オブジェクトモードで[右クリック]>[フラッドシェード]を実行すればポリゴンを確認できる状態になり・・・

編集モードにしても、特に問題はありません。
常用3Dツールで確認したところ・・・

ZBrush どちらもフラッドシェード状態で読み込まれました。
Wing3D どちらもフラッドシェード状態で読み込まれました。
Strata 3D どちらもスムーズシェード状態で読み込まれました。