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

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

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

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python

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

Q&A

解決済

1回答

1944閲覧

動く直線とy=定数の交点の座標を経時的に算出したい

kappar

総合スコア12

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

Python

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

0グッド

0クリップ

投稿2020/06/01 06:57

編集2020/06/02 01:31

前提・実現したいこと

y軸方向に一定速度で動く直線と、y=400という直線との交点を出そうとしています。また、交点の変化を0.1秒ごとに算出したいです。
pygameを使っています。

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

エラーメッセージは出ませんが、正しい交点が算出できていません。
(y軸方向に一定速度で動く直線は270<x<320と指定しているのに、交点のx座標がx=340から記録されてしまいます。)
どこに不備があるのか教えていただけると嬉しいです…。

該当のソースコード

python

1python 2import pygame 3from pygame.locals import * 4import sys 5import time 6 7BLACK = (0, 0, 0) 8RED = (255, 0, 0) 9WHITE = (255, 255, 255) 10 11pygame.init() #初期化 12screen = pygame.display.set_mode((640, 480)) #画面サイズ 13FPSCLOCK = pygame.time.Clock() 14FPSCLOCK.tick(10) 15pygame.display.flip() 16 17pos_1y=330 18pos_2y=380 19velocity_y=0.01 20 21while True: 22 pos_1y+=velocity_y 23 pos_2y+=velocity_y 24 screen.fill(BLACK) 25 st1=(270, pos_1y) 26 en1=(320, pos_2y) 27 pygame.draw.line (screen, WHITE, st1, en1) 28 x1=270 29 y1= pos_1y 30 x2=320 31 y2= pos_2y 32 x3=0 33 y3=400 34 x4=620 35 y4=400 36 a1 = (y2-y1)/(x2-x1) 37 a3 = (y4-y3)/(x4-x3) 38 x0 = (a1*x1-y1-a3*x3+y3)/(a1-a3) 39 with open('file.txt', 'a') as f: 40 print(x0, file=f) 41 pygame.display.update() 42 for event in pygame.event.get(): 43 if event.type==pygame.QUIT: 44 pygame.quit() 45 sys.exit() 46 if event.type==KEYDOWN: 47 if event.key==K_ESCAPE: 48 pygame.quit() 49 sys.exit() 50 51

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

patapi

2020/06/01 11:03

「正しい交点が算出できていません」とのことですが、期待する結果(正しいはずの数字)と、現状出力されている数字を示してください。 (質問文とプログラムを照らし合わせるに、 「y=420という直線」の「420」という数字と、 プログラム中の「y3=400」「y4=400」が符合していないように思います)
kappar

2020/06/02 01:31

ご指摘ありがとうございます。 本文中のy=420が間違っていました。y=400です。 また、予想との結果の差異も書いておきました。。
guest

回答1

0

ベストアンサー

移動する「線分」は最初の状態ではy=400と交わっていません。

ここでいう「線分」とは、点1(270, 330)と点2(320,380)を結ぶ線分です。

点1、点2 それぞれのy座標が400より小さいことから、この線分がy=400と交わっていないことは自明です。
(下図参考)

実際のところ、プログラム中の計算自体は正しく行われています。

最初に得られる、x0 = 340という数字は、上記線分の両端を延長した「直線」y=400の交点のx座標です。
(見えにくいですが、下の図の青線と、y=400が交わる部分)

移動する「線分」がy=400 と交わるときのx0を得たいのであれば
スクリプトのwhile文で2点のy座標が400をまたいでいるかを判定し、
またいでいる時のみ、fileにx0の値を記録する、というやり方になります。
イメージ説明

投稿2020/06/02 14:12

編集2020/06/02 23:38
patapi

総合スコア687

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

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

kappar

2020/06/03 01:12

図までつけていただけて…ありがとうございます! pos_yの範囲を指定したら、またいでいる時のみのx0が得られるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問