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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

861閲覧

決められたエリア内にのみ直線を引きたい

takes.it.easy

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/24 03:19

前提・実現したいこと

決められたエリア内に図のように直線を引きたいです。

直線は2点を決め、その2点間に一定間隔で点を打つようなものです。

エリアは頂点Pの座標のみがわかっています。

直線の間隔dは任意です。

イメージ説明

直線自体の作り方、直線のオフセットの仕方は自分で考えているものがあります。

分からないのは、限定されたエリア内にのみ直線を引く方法で、その2点をどのように取ればよいかです。

なにかアイデアがあればご教授お願い致します。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/24 03:45 編集

要件で不明な点があります。 ・与えられる点は5点に限らないのか?(3点以上の、平面を構成可能な任意の点数に対応しなければならないのか) ・与えられるエリアの点は、順番も一緒に与えられ、その順番も考慮しなければならないのでしょうか。 たとえば、与えられる点に順番がついており、その点を順に直線でつないだ時にできたエリアが鼓型になるようなことがあり得るのか? ・図を見ると、描画する直線は、P4とP5の2点を結んだ直線と平行に見えます。  描画する直線はこのように、「与えられたエリアのどこかの1辺と平行でなければならない」のでしょうか? それとも「どのそうな角度の直線(デバイスに対して水平・垂直)でも構わない」のでしょうか
takes.it.easy

2021/05/24 03:55

①与えられる点は5点に限りません。平面を構成可能な任意の点数に対応する必要があります。 ②与えられるエリアの点は頂点の配列に格納されており、順番が決められています。また順番に点をつなぎ鼓形になることは今回は考えません。 ③描画する直線は必ずしもどこかの1辺と平行である必要はありませんが、必要であればどこかの1辺と平行になることもあり得ます。つまりどのような角度の直線でも引けるようにしたいというのが答えになります。
退会済みユーザー

退会済みユーザー

2021/05/24 04:00

実装は、pythonのmatplotlib.pyplot 限定でしょうか? もしかして前の御質問 https://teratail.com/questions/290378 の内容に関連するものかと思ったので
takes.it.easy

2021/05/24 04:04

現在はpythonのmatplotlib.pyplotで記述を行っていますが、後々Javaに移植することも考えています。(Javaは経験がないため勉強中です) 以前の質問と直接関係はありません。今回複数の直線を引く手法は別のものを考えています。
退会済みユーザー

退会済みユーザー

2021/05/24 04:28

わかりました。PYTHONタグが付いていますが、「複数の直線を引く手法は別のものを考えています。」ということで、具体的な実装ではなくて、「質問内容の要件を満たす一般的な考え方(アルゴリズム)について知りたい」、ということですね。
takes.it.easy

2021/05/24 04:33

すみません。いつもの癖でつけてしまいましたが、おっしゃる通り知りたいことは一般的な考え方、アルゴリズムになります。よろしくお願い致します。
guest

回答1

0

ベストアンサー

コメントによると特定の実装ではなく、考え方のアイデアが知りたいとのことなので、
https://web.cs.ucdavis.edu/~ma/ECS175_S00/Notes/0411_b.pdf
をベースに説明します。

1.まず、任意の傾きの直線でできるようにしたいとのことですが、最初から任意の直線で適用しようとすると難しいので、
その引きたい直線の傾きが水平になるよう、全部の点pの座標を回転して変換しておきます。

これら回転後の座標で囲まれる領域を「zR」とします。

今後は、その回転後の点の座標について述べます。
また、ここでは簡便のため、5点が与えられていると仮定します。

2.p1~p5を直線の傾き分回転した後の点をq1~q5とします。

q1-q2、q2-q3 ... のように、各点の隣同士をつないだ線分を l1 ~ l5とします。

(コメントより、点は順番に与えられて、かつ、各点を順番に結んだ線分は鼓型にならない、という前提です)

3.領域を構成する点のうち、最もY座標が小さい点と、最もY座標が大きい点を取得しておきます。
これを ymin , ymax とおきます。

4.水平な直線を、y座標=yminからスタートして、ymaxまで、距離dの幅ごとに区切って「スキャン」していきます。

5.ここでの「スキャン」とは、以下のような操作です。
スキャンする(動かしていく)水平な直線を「lh」とします。

①領域を構成するすべての線分l1~l5について、lh (y = yh)と交差するかどうかを調べます。

②交差する場合は、その交点を取得します。

③ここで取得できた交点の座標が s1(x1, yh)、s2(x2, yh)、s3(x3, yh)、s4(x4, yh)だったとします。(Y座標はすべてyhで同一)

このうち、x座標 x1、x2、x3、x4 をキーとして小さい順にソートします。

ソートした結果を、小さい方から2つずつペアにして格納します。(これを線分mとします)
たとえばソート結果が
x2、x3、x1、x4だった場合は
m1[(x2,yh)、(x3,yh)]、m2[(x1, yh)、(x4, yh)] という2つの線分になります。

④各ペアでできる線分が、「領域zR内に描画される線分」になります。

⑤距離dの分だけhlを垂直に動かします。( yh = yh+d )

⑥ hlのy座標がymaxを超えるまで、①~⑤を繰り返します。

6.5で取得した各線分m1~mNの座標を、1で回転させた角度の分だけ戻します。

投稿2021/05/24 04:48

編集2021/05/24 05:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takes.it.easy

2021/05/24 05:24

ありがとうございます。ご回答を基にpythonで記述してみますので少々お待ちください。
退会済みユーザー

退会済みユーザー

2021/05/24 05:30 編集

なお、上記アルゴリズムをpythonで具体的に実装する際に不明点が出た場合は、別質問を立てられた方がよいかと思います。詳しい方がおられると思いますので。
takes.it.easy

2021/05/25 15:31

無事実装することができました。ありがとうございました。また機会がありましたらよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問