提示コード /線分の交差判定 平行はfalse/部のprintf()で座標を表示されているのですが何故か誤差が出てしまいます。
A(2,4),B(8,4),C(5,5),D(5,2), Ab線分 CD 線分でこのコードでは5,4と表示され小数点以下はなしです。.0000
ですがこの線分を逆にしてAB をCD 線分にして CD をAB線分にすると誤差が出てしまいます。結果は5,3.2000という結果になってしまいます。
これはなぜでしょうか?float型でやっているのでその以前で細かい値が捨てられてるということは考えにくいです。
また交差しているので同じ座標がかえてっくるはずです。方眼紙で線分交差座標を作っているのでこの線分そもそもがおかしいというのは考えられないです。
#include <iostream> #include "stdio.h" #include "conio.h" #include <optional> //using namespace std; class Position { public: float x; float y; Position(float xx = 0, float yy = 0) { x = xx; y = yy; } bool operator==(const Position& t) { if(x == t.x && y == t.y) { return true; }else{ return false; } } }; /*交差判定と座標を表示*/ void cross_pos(Position a,Position b,Position c,Position d) { //tc = (x1 - x2) * (y3 - y1) + (y1 - y2)* (x1 - x3); float tc = (a.x - b.x) * (c.y - a.y) + (a.y - b.y) * (a.x - c.x); //td = (x1 - x2) * (y4 - y1) + (y1 - y2)* (x1 - x4); float td = (a.x - b.x) * (d.y - a.y) + (a.y - b.y) * (a.x - d.x); //ta = (x3 - x4) * (y1 - y3) + (y3 - y4) * (x3 - x1) float ta = (c.x - d.x) * (a.y - c.y) + (c.y - d.y) * (c.x - a.x); //tb = (x3 - x4) * (y2 - y3) + (y3 - y4) * (x3 - x2) float tb = (c.x - d.x) * (b.y - c.y) + (c.y - d.y) * (c.x - b.x); Position ab, ac, bc, bd, ad, cd, cb, db; /*線分を取得*/ ab = Position(b.x - a.x, b.y - a.y); ad = Position(d.x - a.x, d.y - a.y); ac = Position(c.x - a.x, c.y - a.y); bc = Position(c.x - b.x, c.y - b.y); cb = Position(b.x - c.x, b.y - c.y); bd = Position(d.x - b.x, d.y - b.y); cd = Position(d.x - c.x, d.y - c.y); db = Position(b.x - d.x, b.y - d.y); /*外積を使ってスカラーを取得*/ float BD_AB = (bd.x * ab.y) - (ab.x * bd.y); float CB_DB = (cb.x * bd.y) - (bd.x * cb.y); float BD_BC = (bd.x * bc.y) - (bc.x * bd.y); float AD_CD = (ad.x * cd.y) - (cd.x * ab.y); float BC_BD = (bd.x * bc.y) - (bc.x * bd.y); float BD_AD = (ad.x * bd.y) - (bd.x * ad.y); BD_AB /= 2; BD_BC /= 2; AD_CD /= 2; BC_BD /= 2; BD_AD /= 2; CB_DB /= 2; /*線分の交差判定 平行はfalse*/ if (tc * td < 0 && ta * tb < 0) { printf("交差している。\n"); /*比率*/ float k = AD_CD / (AD_CD + CB_DB); float x = a.x + k * (b.x - a.x); float y = a.y + k * (b.y - a.y); printf("x: %f\n",x); printf("y: %f\n",y); } } int main() { Position a, b, c, d; int t = 0; printf("a.x: "); t = scanf_s("%f", &a.x); printf("a.y: "); t = scanf_s("%f", &a.y); printf("\n"); printf("b.x: "); t = scanf_s("%f", &b.x); printf("b.y: "); t = scanf_s("%f", &b.y); printf("\n"); printf("c.x: "); t = scanf_s("%f", &c.x); printf("c.y: "); t = scanf_s("%f", &c.y); printf("\n"); printf("d.x: "); t = scanf_s("%f", &d.x); printf("d.y: "); t = scanf_s("%f", &d.y); printf("\n"); cross_pos(a, b, c, d); int _ch = _getch(); return 0; }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/25 08:13
2019/12/25 08:18
2019/12/25 08:36
2019/12/25 08:52
退会済みユーザー
2019/12/25 14:29
2019/12/26 01:22