質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

379閲覧

p5.jsでscaleしてもstrokeWeightを一定に保つ方法

kekke59

総合スコア2

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

1グッド

0クリップ

投稿2022/09/28 08:40

前提

p5.jsでいろいろな図形を描いて楽しんでいます。
座標変換をするscale関数利用時に問題が発生しました。

実現したいこと

strokeWeightを一定に保ったままscaleしたい。

つまり、

p5.js

1rect(0, 0, 100, 100);

p5.js

1scale(4); 2rect(0, 0, 25, 25);

が、同じ図形を出力するようにしたいのです。

発生している問題・エラーメッセージ

scale関数はstrokeWeightにも影響を与えるので、上記のソースコードを実行すると当然後者はscale(4);された分、線の幅(strokeWeight)も4倍太い図形が出力されてしまいます。

試したこと

strokeWeight関数を使って相殺する

scale関数の直後にstrokeWeight関数を挿入することで、線の幅を一定に保つ方法です。
以下の例では、4倍に拡大したので線の幅は1/4にしています。

p5.js

1scale(4); 2strokeWeight(1/4); 3rect(0, 0, 25, 25);

これでとりあえずrect(0, 0, 100, 100);と同じ図形を出力するようになったのですが、この方法ではscaleが複数回出てくる場合に対応できません。

例えば、下のソースコードのような場合です。scaleは先程と同じように2×2で4ですが、strokeWeightは上書きされるだけなので1/2となり、線が太くなってしまいます。

p5.js

1scale(2); 2strokeWeight(1/2); 3scale(2); 4strokeWeight(1/2); 5rect(0, 0, 25, 25);

質問

この問題を解決するスマートな方法は何かないでしょうか?

現在のstrokeWeightの値が取得できれば以下のように書けて複数回のscaleでも問題ないと思うのですが、取得できませんよね?

p5.js

1scale(4); 2strokeWeight(getStrokeWeight() / 4); 3rect(0, 0, 25, 25);

補足情報(FW/ツールのバージョンなど)

https://openprocessing.org/ 上でプログラミングしています。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

現在のstrokeWeightの値が取得できれば

drawingContext.lineWidthがそれっぽいです。

reference | drawingContext
CanvasRenderingContext2D.lineWidth - Web APIs | MDN

js

1function setup() { 2 createCanvas(500, 500); 3} 4 5function draw() { 6 background(220); 7 8 // strokeWeightは永続なので、push・popで囲うか1にリセットが必要! 9 //push(); 10 strokeWeight(1); 11 rect(100, 100, 100, 100); 12 13 myScale(2); 14 rect(100, 100, 50, 50); 15 16 myScale(2); 17 rect(75, 75, 25, 25); 18 //pop(); 19} 20 21function myScale(s) { 22 scale(s); 23 strokeWeight(drawingContext.lineWidth / s); 24}

strokeWeightは永続で、scaledrawごとにリセットされるのが地味に扱いにくいですね^^;(今のスケールを取れるほうが話が早いのですが...

投稿2022/09/28 11:05

TN8001

総合スコア9315

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kekke59

2022/09/28 11:58

ありがとうございます! やりたいことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問