🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1285閲覧

線分と線分の当たり判定がうまく実装出来ない。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/03/16 05:47

提示コードの交点を算出関数部ですが線分と線分の交点が参考サイト通りやっても上手実装出来ません。以下のように方眼紙に点を配置して実験しましたが交点4,9と表示されてしまいます。参考サイトが間違えて居るのでしょうか?

A: 4,1
B: 4,9
C: 1,4
D: 12,3

交点: 4,4

参考サイト: https://qiita.com/kaityo256/items/988bf94bf7b674b8bfdc (2つ線分の交点)

cpp

1#include <iostream> 2#include "glm/glm.hpp" 3 4glm::ivec2 A; 5glm::ivec2 B; 6glm::ivec2 C; 7glm::ivec2 D; 8 9 10void inputValue(glm::ivec2 &pos) 11{ 12 int x; 13 int y; 14 15 printf("X: "); 16 scanf_s("%d", &x, sizeof(x)); 17 printf("Y: "); 18 scanf_s("%d", &y, sizeof(y)); 19 20 pos.x = x; 21 pos.y = y; 22} 23 24//交点を算出 25glm::ivec2 Intersection(glm::vec2 a, glm::vec2 b, glm::vec2 c, glm::vec2 d) 26{ 27 int det = (a.x - b.x) * (d.y - c.y) - (d.x - c.x) * (a.y - b.y); 28 int t = ((d.y - c.y) * (d.x - b.x) + (c.x - d.x) * (d.y - b.y)) / det; 29 int x = t * a.x + (1.0 - t) * b.x; 30 int y = t * a.y + (1.0 - t) * b.y; 31 32 return glm::ivec2(x,y); 33} 34 35int main() 36{ 37 38 printf("A 座標\n"); 39 inputValue(A); 40 41 printf("B 座標\n"); 42 inputValue(B); 43 44 printf("C 座標\n"); 45 inputValue(C); 46 47 printf("D 座標\n"); 48 inputValue(D); 49 50 printf("\n\n交点\n"); 51 glm::ivec2 pos = Intersection(A,B,C,D); 52 printf("X: %d\n", pos.x); 53 printf("Y: %d\n",pos.y); 54 55 56 57 58 59 60 61 62 63 64 65 return 0; 66}

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

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

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

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

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

guest

回答2

0

型はintではなく、全てdoubleにしましょう。
計算式は合っていると思います。

なお、ABとCDの交点は手計算したところ、
x = 4, y = 41/11 (=3.7272…)
でした。

実際に確認するとこうなりました。

cpp

1#include <iostream> 2using namespace std; 3 4struct point{ 5 double x; 6 double y; 7}; 8 9int main() 10{ 11 point a = {4.0, 1.0}; 12 point b = {4.0, 9.0}; 13 point c = {1.0, 4.0}; 14 point d = {12.0, 3.0}; 15 16 double det = (a.x - b.x) * (d.y - c.y) - (d.x - c.x) * (a.y - b.y); 17 double t = ((d.y - c.y) * (d.x - b.x) + (c.x - d.x) * (d.y - b.y)) / det; 18 double x = t * a.x + (1.0 - t) * b.x; 19 double y = t * a.y + (1.0 - t) * b.y; 20 21 cout << x << " " << y << endl; 22 23 return 0; 24} 25 26>> 274 3.72727

投稿2021/03/16 06:25

nanoseeing

総合スコア133

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

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

退会済みユーザー

退会済みユーザー

2021/03/16 06:26

はい、誤差だったみたいです。ありがとうございます。。
fana

2021/03/16 06:31

tの意味をまともに把握していれば,決して int t = ... とか書かない. そういうのは「誤差」とは呼ばない.
guest

0

ベストアンサー

関数Intersection()内の変数群は何故int型なのですか?
とりあえずこれでは真っ当な結果が得られないように思えます.

投稿2021/03/16 06:18

fana

総合スコア11987

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問