ラベル Illustrator の投稿を表示しています。 すべての投稿を表示
ラベル Illustrator の投稿を表示しています。 すべての投稿を表示

金曜日, 9月 12, 2025

JavaScriptでAI遊び 67 
Illustratorでスピログラフを描画


Illustratorでスピログラフを描画させてみました。

■スピログラフのパラメータ
外側の固定円(半径 R)
内側の回転円(半径 r)
描画点の距離 d(内円の中心からの距離)
ステップ数 s(1ユニットのパス数)
角度 θ(回転角)

■スピログラフの方程式
スピログラフの曲線 (x, y) は、以下のパラメータ方程式で表されます。

基本形(ハイポサイクロイド)
x(θ)=(R-r)cos(θ)+d cos(((R-r)r)θ)
y(θ)=(R-r)sin(θ)-d sin(((R-r)r)θ)

ここで:

θ は回転角(0 から 2π × ループ回数 まで変化)
(R - r) の比が整数であれば閉じた軌跡になる

#target illustrator
function drawSpirograph(doc, centerX, centerY, R, r, d,
        steps, rotations) {
var path = doc.pathItems.add();
path.stroked = true;
path.filled = false;
path.strokeWidth = 1;
var points = [];
for (var i = 0; i <= steps * rotations; i++) {
var theta = (Math.PI * 2 * i) / steps;
var x = (R - r) * Math.cos(theta) +
            d * Math.cos(((R - r) / r) * theta);
var y = (R - r) * Math.sin(theta) -
            d * Math.sin(((R - r) / r) * theta);
points.push([centerX + x, centerY + y]);
}
var pathPoints = path.pathPoints;
for (var j = 0; j < points.length; j++) {
var p = pathPoints.add();
p.anchor = points[j];
p.leftDirection = p.anchor;
p.rightDirection = p.anchor;
}
}

// ユーザー入力ダイアログを表示
function getUserInput() {
var dialog = new Window("dialog", "スピログラフ設定");
dialog.add("statictext", undefined, "外円の半径 (R):");
var RInput = dialog.add("edittext", undefined, "150");
RInput.characters = 5;
dialog.add("statictext", undefined, "内円の半径 (r):");
var rInput = dialog.add("edittext", undefined, "70");
rInput.characters = 5;
dialog.add("statictext", undefined, "ペンの距離 (d):");
var dInput = dialog.add("edittext", undefined, "100");
dInput.characters = 5;
dialog.add("statictext", undefined, "ステップ数:");
var stepsInput = dialog.add("edittext", undefined, "200");
stepsInput.characters = 5;
dialog.add("statictext", undefined, "回転数:");
var rotationsInput = dialog.add("edittext", undefined, "10");
rotationsInput.characters = 5;
var okButton = dialog.add("button",
        undefined, "OK", {name: "ok"});
var cancelButton = dialog.add("button",
        undefined, "キャンセル", {name: "cancel"});

var result = null;
okButton.onClick = function () {
result = {
R: parseFloat(RInput.text),
r: parseFloat(rInput.text),
d: parseFloat(dInput.text),
steps: parseInt(stepsInput.text, 10),
rotations: parseInt(rotationsInput.text, 10)
};
dialog.close();
};
cancelButton.onClick = function () {
result = null;
dialog.close();
};
dialog.show();
return result;
}

// メイン処理
function main() {
if (app.documents.length === 0) {
app.documents.add();
}
var doc = app.activeDocument;
var centerX = doc.artboards[0].artboardRect[2] / 2;
var centerY = doc.artboards[0].artboardRect[3] / 2;

var userInput = getUserInput();
if (!userInput) return;

drawSpirograph(doc, centerX, centerY, userInput.R, userInput.r,
        userInput.d, userInput.steps, userInput.rotations);
}

main();

実行して、各パラメーターの値を入力すれば描画が実行されます。パスの塊です。

パラメーター変更例(その1)

パラメーター変更例(その2)

パラメーター変更例(その3)

水曜日, 9月 10, 2025

Illustratorでオブジェクトの再配色より便利な色変換

質問というか、相談?がありましたので・・・
Illustratorでドット絵を作成後、色替えをしたい場合は、[編集]>[カラーを編集]>[オブジェクトの再配色]が、一見便利のようで意外とストレスが溜まるので、パーツ毎に上から描画モードを変更したオブジェクトを乗せる処理がいい感じです。

作成したドット絵。
もちろんドット絵限定のネタではありません。

類似色のバーツ毎に複製をしてレイヤーを分けて作成・・・

最終的にグループ毎に[パスファインダー]>[合体]で1つのオブジェクトに変換します。

レイヤーはこんな感じです。

ここで任意の色で塗り潰してから[ウィンドウ]>[透明]で描画モードを[通常]から[ソフトライト]等に変更すれば・・・

オレンジ色の部分だけに深みが増します。

そのままブルーに変更すれば・・・

彩度が少し下がったような雰囲気になります。

輪郭とグリーン部分をオレンジ色に変更して[ウィンドウ]>[透明]で描画モードを[通常]から[ソフトライト]等に変更すれば・・・

グリーンの部分がオレンジ色のボディーに馴染みます。後は色替えと描画モードの変更で、かなり大きな変更を手軽に行うことが出来ます。色数が少なければ[編集]>[カラーを編集]>[オブジェクトの再配色]でも問題ないですが、色数が多い場合は無理ゲーですから。この上から描画モードを変更したオブジェクトを乗せるがお薦めです。

火曜日, 9月 09, 2025

JavaScriptでAI遊び 66 
Illustratorでオブジェクトを楕円へ均等配置(改訂版)

Illustratorで任意オブジェクトを楕円へ均等配置させます。前回の処理に回転設定の有無っを追加しました。

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

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

if (selection.length !== 2) {
alert("配置オブジェクト、楕円の順に選択してください。");
return;
}

var ellipse, object;
// 楕円とオブジェクトを特定
if (selection[0].typename ===
"PathItem" && selection[0].pathPoints.length > 3) {
ellipse = selection[0];
object = selection[1];
} else if (selection[1].typename ===
"PathItem" && selection[1].pathPoints.length > 3) {
ellipse = selection[1];
object = selection[0];
} else {
alert("楕円(パス)と配置するオブジェクトを選択してください。");
return;
}

// ユーザーに配置する数を入力させる
var count = parseInt(prompt
("楕円周上に配置するオブジェクトの数を入力:", "6"), 10);
if (isNaN(count) || count < 1) {
alert("正しい数値を入力してください。");
return;
}

// 回転の有無を選択
var rotateOption =
confirm("オブジェクトを楕円の角度に沿って回転させますか?");

// 楕円の中心座標とサイズを取得
var centerX = ellipse.position[0] + ellipse.width / 2;
var centerY = ellipse.position[1] - ellipse.height / 2;
var radiusX = ellipse.width / 2;
var radiusY = ellipse.height / 2;

var angleStep = 360 / count;

for (var i = 0; i < count; i++) {
var angle = angleStep * i * (Math.PI / 180);
var x = centerX + radiusX * Math.cos(angle);
var y = centerY + radiusY * Math.sin(angle);

var newObj = object.duplicate();
newObj.position =
[x - newObj.width / 2, y + newObj.height / 2];

if (rotateOption) {
newObj.rotate(angleStep * i);
}
}

alert("オブジェクトを均等配置しました!");
}

distributeObjectsOnEllipse();

配置するオブジェクトはグループ化されていても問題ありません。ここではシンボル登録したモノを利用しました。なお、楕円はオブジェクトの後に作成またはペーストします。

事項鵜したらオブジェクトの数と回転の有無を入力するだけです。

「オブジェクトを楕円の角度に沿って回転させますか?」で「はい」をクリックした結果。楕円での均等配置は3D視点での見た目で均等配置にしています。

「オブジェクトを楕円の角度に沿って回転させますか?」で「いいえ」をクリックした結果。

もちろん正円でも問題ありません。

日曜日, 9月 07, 2025

Illustratorで分割データの貼り合わせ手順

質問がありましたので・・・
Illustratorなどで作成した大判データを分割プリントしてから貼り合わせる手順を整理しました。Illustratorのデータで説明していますが、トリムマークを付けて出力できればアプリケーションは問いません。ここではPDF書き出しをベースに処理しています。


例えばA2サイズのデータを作成してもA3伸び対応のプリンタしかない場合は分割してプリント後に貼り合わせます。


トリムマークを入れて上半分をプリントします。



同様にしてトリムマークを入れて下半分をプリントします。

ここで、上半分のデータのトリムマーク位置でカットして下半分に重ねます。


位置を間違えないようにします。


カットした直後の状態です。

※下半分はカットしません。

次に下半分のトリムマークに合わせて上半分を乗せてからテープで固定します。ここでは解りやすいように黄色で示していますが透明テープで処理します。

続けて横幅分のテープを貼って完了です。ただし、最後のテープは貼り方に注意が必要です。

1. 片側の端を固定(指は離さない)
2. 反対側の端を固定(指は離さない)
3. 両端の指は離さずに、中間地点を指で押さえて仮止め
4. 最後に全体を指でなぞって固定

裏側も同じ手順で張り合わせば完成です。

木曜日, 9月 04, 2025

JavaScriptでAI遊び 65 
Illustratorでオブジェクトを楕円へ均等配置

Illustratorで任意オブジェクトを楕円へ均等配置させます。

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

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

if (selection.length !== 2) {
alert("配置オブジェクト、楕円の順に選択してください。");
return;
}

var ellipse, object;
// 楕円とオブジェクトを特定
if (selection[0].typename ===
"PathItem" && selection[0].pathPoints.length > 3) {
ellipse = selection[0];
object = selection[1];
} else if (selection[1].typename ===
"PathItem" && selection[1].pathPoints.length > 3) {
ellipse = selection[1];
object = selection[0];
} else {
alert("楕円(パス)と配置するオブジェクトを選択してください。");
return;
}

// ユーザーに配置する数を入力させる
var count = parseInt(prompt
("楕円周上に配置するオブジェクトの数を入力:", "6"), 10);
if (isNaN(count) || count < 1) {
alert("正しい数値を入力してください。");
return;
}

// 楕円の中心座標とサイズを取得
var centerX = ellipse.position[0] + ellipse.width / 2;
var centerY = ellipse.position[1] - ellipse.height / 2;
var radiusX = ellipse.width / 2;
var radiusY = ellipse.height / 2;

var angleStep = 360 / count;

for (var i = 0; i < count; i++) {
var angle = angleStep * i * (Math.PI / 180);
var x = centerX + radiusX * Math.cos(angle);
var y = centerY + radiusY * Math.sin(angle);

var newObj = object.duplicate();
newObj.position =
[x - newObj.width / 2, y + newObj.height / 2];
}

alert("オブジェクトを均等配置しました!(回転なし)");
}

distributeObjectsOnEllipseNoRotation();

配置するオブジェクトはグループ化されていても問題ありません。ここではシンボル登録したモノを利用しました。なお、楕円はオブジェクトの後に作成またはペーストします。

事項鵜したらオブジェクトの数を入力するだけです。

楕円での均等配置は3D視点での見た目で均等配置にしています。

もちろん正円でも問題ありません。

火曜日, 9月 02, 2025

Illustratorの無駄知識29 
円の縮小コピーと隙間の関係

円の縮小コピーと隙間の関係を整理してみました。

任意の円を作成します。ここでは直径100mmの正円を描きました。

作成したあ円の半分の直径の円(赤)は2つ配置できます。ここで発生した上下の隙間には・・・

直径33.33mmの円(橙)が収まります。赤い円と橙の円の中心点を結んで作成出来る非地型の幅は50mmですが、高さは66.67mmとなります。続けて残りの隙間に収まる円は・・・

赤い円と橙の円の直径の差分の直径を持つ円(黄)16.67mmとなります。

元の円(青)を1としたとき
円(赤)は50%
円(橙)33.33%
円(黄)16.67%

これ以降は・・・更に無駄なので省略しました。

日曜日, 8月 31, 2025

JavaScriptでAI遊び 64 
Illustratorでカラー設定の明度を反転

特に目的は無いのですが、色相・彩度・明度の反転実験の明度版です。
CMYKでもRGBでも使えます。

function invertBrightness() {
var doc = app.activeDocument;
var selection = doc.selection;

if (selection.length === 0) {
alert("オブジェクトを選択してください。");
return;
}

for (var i = 0; i < selection.length; i++) {
var obj = selection[i];

if (obj.typename === "PathItem" && obj.filled) {
var color = obj.fillColor;

if (color.typename === "RGBColor") {
// RGBの明度を反転
color.red = 255 - color.red;
color.green = 255 - color.green;
color.blue = 255 - color.blue;

} else if (color.typename === "CMYKColor") {
// CMYKの明度を反転(K値の反転)
color.black = 100 - color.black;
}

obj.fillColor = color;
}
}
}

invertBrightness();

左からCMYKで・・・
ベースチャート、カラー反転、カラー反転を2回実行

左からCMYKで・・・
ベースチャート、明度反転、明度反転を2回実行

左からRGBで・・・
ベースチャート、カラー反転、カラー反転を2回実行

左からRGBで・・・
ベースチャート、明度反転、明度反転を2回実行

以下も参考にしてください

金曜日, 8月 29, 2025

Illustratorの3D機能で地球を作成(3)

質問がありましたので、2023/10/24にアップした「Illustratorの3D機能で地球を作成」の保続です。

前回作成した地球にクモを追加します。

地球を作成した半円よりも若干大きい半円で球体を作成します。

次に適当なブラシで雲モドキを作成します。

作成後に若干ぼかしてから色を白に変更して・・・

シンボル登録します。

作成した若干大きめの球体にシンボルを配置し[構造体を表示しない]にチェックを入れます。
コレで雲のようなイメージを造ることが出来ますが・・・

若干不透明度を下げて背景を黒にした方が良いですね。