/** * @brief 誘導交差点補正 * @param [I]誘導テーブル */ static E_SC_RESULT RT_TBL_RevGuideCrs(RT_TBL_MAIN_t *guidetbl_p) { RT_TBL_GUIDELINK_t *guide_link_p; RT_TBL_GUIDECRS_t *guide_crs_p; RT_XY_t *guide_sharp_p; DOUBLE l_real_x; DOUBLE l_real_y; DOUBLE ic_x,ic_y,oc_x,oc_y,ii_x,ii_y,oo_x,oo_y; UINT32 base_id; INT32 xsft,ysft; INT32 angle; INT16 ilp,jlp; INT16 i_no,o_no; UINT16 dir; UINT16 sharp_vol; if (NULL == guidetbl_p) { SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] ERROR " HERE); return (e_SC_RESULT_FAIL); } // 誘導交差点2点(1点は目的地のはず)以上が判定条件 if (1 > guidetbl_p->guide_crs_vol) { return (e_SC_RESULT_SUCCESS); } l_real_x = RT_real_x; l_real_y = RT_real_y; // 先頭誘導リンク情報取得 guide_link_p = guidetbl_p->guide_link_p; // 誘導リンク情報数分ループ for (ilp = 0; ilp < guidetbl_p->guide_link_vol - 1; ilp++) { // 交差点情報なし if (ALLF16 == (guide_link_p + ilp)->crs_offset) { continue; } // 一般誘導交差点でない guide_crs_p = (guidetbl_p->guide_crs_p + (guide_link_p + ilp)->crs_offset); if (CRSTYPE_NORMAL != guide_crs_p->crs_type) { continue; } i_no = ilp; // 交差点進入リンクは10m以下 if (CRSREV_DIST > (guide_link_p + ilp)->dist) { i_no = 0; // 下限設定 // 10m以上のリンクを経路始点方向にサーチ for (jlp = ilp - 1 ; jlp > 0 ; jlp--) { if (CRSREV_DIST <= (guide_link_p + jlp)->dist) { i_no = jlp; break; } } } o_no = (ilp+1); // 交差点退出リンクは10m以下 if (CRSREV_DIST > (guide_link_p + (ilp+1))->dist) { o_no = guidetbl_p->guide_link_vol - 1; // 上限設定 // 10m以上のリンクを経路終点方向にサーチ for (jlp = ilp + 1 ; jlp < guidetbl_p->guide_link_vol ; jlp++) { if (CRSREV_DIST <= (guide_link_p + jlp)->dist) { o_no = jlp; break; } } } // SC_LOG_ErrorPrint(SC_TAG_RT, "i = %d->%d o = %d->%d", ilp, i_no, (ilp+1), o_no); // 角度補正の必要あり if ((i_no != ilp)||(o_no != (ilp+1))) { // 進入リンクの形状点情報取得 guide_sharp_p = (guidetbl_p->guide_sharp_p + (guide_link_p + i_no)->sharp_offset); sharp_vol = (guide_link_p + i_no)->sharp_vol; // 進入パーセルを中心とした3×3左下パーセル算出 base_id = SC_MESH_SftParcelId((guide_link_p + i_no)->parcel_id, -1, -1); // 進入座標取得 ii_x = (DOUBLE)(guide_sharp_p[sharp_vol - 2].x + 4096); // 左下パーセルからの相対値 ii_x *= l_real_x; // 実長変換 ii_y = (DOUBLE)(guide_sharp_p[sharp_vol - 2].y + 4096); // 左下パーセルからの相対値 ii_y *= l_real_y; // 実長変換 // 中心座標取得 ic_x = (DOUBLE)(guide_sharp_p[sharp_vol - 1].x + 4096); // 左下パーセルからの相対値 ic_x *= l_real_x; // 実長変換 ic_y = (DOUBLE)(guide_sharp_p[sharp_vol - 1].y + 4096); // 左下パーセルからの相対値 ic_y *= l_real_y; // 実長変換 // 退出リンクの形状点情報取得 guide_sharp_p = (guidetbl_p->guide_sharp_p + (guide_link_p + o_no)->sharp_offset); sharp_vol = (guide_link_p + o_no)->sharp_vol; // 中心座標取得 SC_MESH_GetAlterPos(base_id, (guide_link_p + o_no)->parcel_id, 1, (INT32 *)&xsft, (INT32 *)&ysft); oc_x = (DOUBLE)(guide_sharp_p[0].x + (4096 * xsft)); // 左下パーセルからの相対値 oc_x *= l_real_x; // 実長変換 oc_y = (DOUBLE)(guide_sharp_p[0].y + (4096 * ysft)); // 左下パーセルからの相対値 oc_y *= l_real_y; // 実長変換 // 退出座標取得 oo_x = (DOUBLE)(guide_sharp_p[1].x + (4096 * xsft)); // 左下パーセルからの相対値 oo_x *= l_real_x; // 実長変換 oo_y = (DOUBLE)(guide_sharp_p[1].y + (4096 * ysft)); // 左下パーセルからの相対値 oo_y *= l_real_y; // 実長変換 // 進入座標と中心座標、もしくは中心座標と退出座標が同一の場合 if ((CompareDouble(ii_x, ic_x) && CompareDouble(ii_y, ic_y)) || (CompareDouble(oo_x, oc_x) && CompareDouble(oo_y, oc_y))) { dir = TURN_ST; } else { // 角度計算 (進入リンクと退出リンクが接続されていない場合の角度計算) angle = RT_LIB_GetCrossAngle2(ii_x, ii_y, ic_x, ic_y, oc_x, oc_y, oo_x, oo_y); if ((0 > angle) || (360 < angle)) { SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] ERROR " HERE); return (e_SC_RESULT_FAIL); } // 案内方向取得 dir = RT_TURNDIR_TBL[ RT_GET_ANGLE_NO(angle) ]; // ターンバイターン案内の表示不正を防ぐため、退出リンクが存在する方向をチェック // TODO 海外対応時には自車の車線位置によって確認方向の追加が必要 // 角度再計算 (進入リンクから見て退出リンクが存在する角度を計算) angle = RT_LIB_GetCrossAngle(ii_x, ii_y, ic_x, ic_y, oc_x, oc_y); if ((0 > angle) || (360 < angle)) { SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] ERROR " HERE); return (e_SC_RESULT_FAIL); } // 左後方向かつ、第一交差点時に右折(退出リンクへの角度が180度未満)している場合はUターンで固定 if (TURN_BL == dir && 180 > angle) { dir = TURN_UT; } // Uターンかつ、第一交差点時に左折(退出リンクへの角度が180度超過)した場合は表示不正のため補正を行わない else if(TURN_UT == dir && 180 < angle){ continue; } } // 補正基点交差点情報更新 if (TURN_ST == dir) { // 第1交差点 guide_crs_p = (guidetbl_p->guide_crs_p + (guide_link_p + ilp)->crs_offset); guide_crs_p->crs_type = CRSTYPE_NOTCRS; // 非誘導交差点 guide_crs_p->dir = TURN_ST; // 案内方向 } else { // 第1交差点 guide_crs_p = (guidetbl_p->guide_crs_p + (guide_link_p + ilp)->crs_offset); guide_crs_p->crs_type = CRSTYPE_NORMAL; // 案内交差点 guide_crs_p->dir = dir; // 案内方向 } // 中継点交差点情報更新 for (jlp = (ilp + 1) ; jlp < o_no; jlp++) { if (ALLF16 != (guide_link_p + jlp)->crs_offset) { guide_crs_p = (guidetbl_p->guide_crs_p + (guide_link_p + jlp)->crs_offset); guide_crs_p->crs_type = CRSTYPE_NOTCRS; // 非誘導交差点 guide_crs_p->dir = TURN_ST; // 案内方向 } } } } return (e_SC_RESULT_SUCCESS); }
bool Test() { bool fail = false; asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); engine->RegisterGlobalFunction("void Assert(bool)", asFUNCTION(Assert), asCALL_GENERIC); COutStream out; CBufferedOutStream bout; float f = 0; double d = 0; asUINT ui = 0; asINT64 i64 = 0; int i = 0; signed char i8 = 0; asQWORD ui64 = 0; short i16 = 0; unsigned char ui8 = 0; unsigned short ui16 = 0; engine->RegisterGlobalProperty("float f", &f); engine->RegisterGlobalProperty("double d", &d); engine->RegisterGlobalProperty("uint ui", &ui); engine->RegisterGlobalProperty("uint8 ui8", &ui8); engine->RegisterGlobalProperty("uint16 ui16", &ui16); engine->RegisterGlobalProperty("uint64 ui64", &ui64); engine->RegisterGlobalProperty("int i", &i); engine->RegisterGlobalProperty("int8 i8", &i8); engine->RegisterGlobalProperty("int16 i16", &i16); engine->RegisterGlobalProperty("int64 i64", &i64); engine->RegisterGlobalFunction("void TestDouble(double)", asFUNCTION(TestDouble), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestFloat(float)", asFUNCTION(TestFloat), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI64(int16)", asFUNCTION(TestI64), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestInt(int)", asFUNCTION(TestInt), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI16(int16)", asFUNCTION(TestI16), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI8(int8)", asFUNCTION(TestI8), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI64(uint)", asFUNCTION(TestUI64), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUInt(uint)", asFUNCTION(TestUInt), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI16(uint16)", asFUNCTION(TestUI16), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI8(uint8)", asFUNCTION(TestUI8), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestDoubleByRef(double &in)", asFUNCTION(TestDoubleByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestFloatByRef(float &in)", asFUNCTION(TestFloatByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI64ByRef(int &in)", asFUNCTION(TestI64ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestIntByRef(int &in)", asFUNCTION(TestIntByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI16ByRef(int16 &in)", asFUNCTION(TestI16ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestI8ByRef(int8 &in)", asFUNCTION(TestI8ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI64ByRef(uint &in)", asFUNCTION(TestUI64ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUIntByRef(uint &in)", asFUNCTION(TestUIntByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI16ByRef(uint16 &in)", asFUNCTION(TestUI16ByRef), asCALL_GENERIC); engine->RegisterGlobalFunction("void TestUI8ByRef(uint8 &in)", asFUNCTION(TestUI8ByRef), asCALL_GENERIC); engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "d = double(d);"); if( d != 12.3 ) fail = true; f = 12.3f; engine->ExecuteString(0, "d = double(f);"); if( d != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "d = double(ui);"); if( d != 123.0 ) fail = true; ui8 = 123; engine->ExecuteString(0, "d = double(ui8);"); if( d != 123.0 ) fail = true; ui16 = 123; engine->ExecuteString(0, "d = double(ui16);"); if( d != 123.0 ) fail = true; ui64 = 123; engine->ExecuteString(0, "d = double(ui64);"); if( d != 123.0 ) fail = true; i = -123; engine->ExecuteString(0, "d = double(i);"); if( d != -123.0 ) fail = true; i8 = -123; engine->ExecuteString(0, "d = double(i8);"); if( d != -123.0 ) fail = true; i16 = -123; engine->ExecuteString(0, "d = double(i16);"); if( d != -123.0 ) fail = true; i64 = -123; engine->ExecuteString(0, "d = double(i64);"); if( d != -123.0 ) fail = true; ui64 = asQWORD(I64(-1000000000000000000)); double d2 = 18446744073709551615.0 + double(asINT64(ui64)); engine->ExecuteString(0, "d = double(ui64);"); if( d != d2 ) fail = true; d = 12.3; engine->ExecuteString(0, "d = d;"); if( d != 12.3 ) fail = true; f = 12.3f; engine->ExecuteString(0, "d = f;"); if( d != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "d = ui;"); if( d != 123.0 ) fail = true; ui8 = 123; engine->ExecuteString(0, "d = ui8;"); if( d != 123.0 ) fail = true; ui16 = 123; engine->ExecuteString(0, "d = ui16;"); if( d != 123.0 ) fail = true; ui64 = 123; engine->ExecuteString(0, "d = ui64;"); if( d != 123.0 ) fail = true; i = -123; engine->ExecuteString(0, "d = i;"); if( d != -123.0 ) fail = true; i8 = -123; engine->ExecuteString(0, "d = i8;"); if( d != -123.0 ) fail = true; i16 = -123; engine->ExecuteString(0, "d = i16;"); if( d != -123.0 ) fail = true; i64 = -123; engine->ExecuteString(0, "d = i64;"); if( d != -123.0 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "d = 12.3; "); if( !CompareDouble(d,12.3) ) fail = true; engine->ExecuteString(0, "d = 12.3f;"); if( !CompareDouble(d,12.3f) ) fail = true; engine->ExecuteString(0, "d = 123; "); if( !CompareDouble(d,123.0) ) fail = true; engine->ExecuteString(0, "d = -123; "); if( !CompareDouble(d,-123.0) ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "f = float(d);"); if( f != 12.3f ) fail = true; f = 12.3f; engine->ExecuteString(0, "f = float(f);"); if( f != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "f = float(ui);"); if( f != 123.0f ) fail = true; ui8 = 123; engine->ExecuteString(0, "f = float(ui8);"); if( f != 123.0f ) fail = true; ui16 = 123; engine->ExecuteString(0, "f = float(ui16);"); if( f != 123.0f ) fail = true; ui64 = 123; engine->ExecuteString(0, "f = float(ui64);"); if( f != 123.0f ) fail = true; i = -123; engine->ExecuteString(0, "f = float(i);"); if( f != -123.0f ) fail = true; i8 = -123; engine->ExecuteString(0, "f = float(i8);"); if( f != -123.0f ) fail = true; i16 = -123; engine->ExecuteString(0, "f = float(i16);"); if( f != -123.0f ) fail = true; i64 = -123; engine->ExecuteString(0, "f = float(i64);"); if( f != -123.0f ) fail = true; d = 12.3; engine->ExecuteString(0, "f = d;"); if( f != 12.3f ) fail = true; f = 12.3f; engine->ExecuteString(0, "f = f;"); if( f != 12.3f ) fail = true; ui = 123; engine->ExecuteString(0, "f = ui;"); if( f != 123.0f ) fail = true; ui8 = 123; engine->ExecuteString(0, "f = ui8;"); if( f != 123.0f ) fail = true; ui16 = 123; engine->ExecuteString(0, "f = ui16;"); if( f != 123.0f ) fail = true; ui64 = 123; engine->ExecuteString(0, "f = ui64;"); if( f != 123.0f ) fail = true; i = -123; engine->ExecuteString(0, "f = i;"); if( f != -123.0f ) fail = true; i8 = -123; engine->ExecuteString(0, "f = i8;"); if( f != -123.0f ) fail = true; i16 = -123; engine->ExecuteString(0, "f = i16;"); if( f != -123.0f ) fail = true; i64 = -123; engine->ExecuteString(0, "f = i64;"); if( f != -123.0f ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "f = 12.3; "); if( f != 12.3f ) fail = true; engine->ExecuteString(0, "f = 12.3f;"); if( f != 12.3f ) fail = true; engine->ExecuteString(0, "f = 123; "); if( f != 123.0f ) fail = true; engine->ExecuteString(0, "f = -123; "); if( f != -123.0f ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "i64 = int64(d);"); if( i64 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i64 = int64(f);"); if( i64 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i64 = int64(ui);"); if( i64 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i64 = int64(ui8);"); if( i64 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i64 = int64(ui16);"); if( i64 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i64 = int64(ui64);"); if( i64 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i64 = int64(i);"); if( i64 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i64 = int64(i8);"); if( i64 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i64 = int64(i16);"); if( i64 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i64 = int64(i64);"); if( i64 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i64 = d;"); if( i64 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i64 = f;"); if( i64 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i64 = ui;"); if( i64 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i64 = ui8;"); if( i64 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i64 = ui16;"); if( i64 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i64 = ui64;"); if( i64 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i64 = i;"); if( i64 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i64 = i8;"); if( i64 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i64 = i16;"); if( i64 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i64 = i64;"); if( i64 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i64 = 12.3; "); if( i64 != 12 ) fail = true; engine->ExecuteString(0, "i64 = -12.3f;"); if( i64 != - 12 ) fail = true; engine->ExecuteString(0, "i64 = 123; "); if( i64 != 123 ) fail = true; engine->ExecuteString(0, "i64 = -123; "); if( i64 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "i = int(d);"); if( i != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i = int(f);"); if( i != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i = int(ui);"); if( i != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i = int(ui8);"); if( i != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i = int(ui16);"); if( i != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i = int(ui64);"); if( i != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i = int(i);"); if( i != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i = int(i8);"); if( i != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i = int(i16);"); if( i != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i = int(i64);"); if( i != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i = d;"); if( i != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i = f;"); if( i != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i = ui;"); if( i != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i = ui8;"); if( i != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i = ui16;"); if( i != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i = ui64;"); if( i != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i = i;"); if( i != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i = i8;"); if( i != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i = i16;"); if( i != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i = i64;"); if( i != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i = 12.3; "); if( i != 12 ) fail = true; engine->ExecuteString(0, "i = -12.3f;"); if( i != - 12 ) fail = true; engine->ExecuteString(0, "i = 123; "); if( i != 123 ) fail = true; engine->ExecuteString(0, "i = -123; "); if( i != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "i8 = int8(d);"); if( i8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i8 = int8(f);"); if( i8 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i8 = int8(ui);"); if( i8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i8 = int8(ui8);"); if( i8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i8 = int8(ui16);"); if( i8 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i8 = int8(ui64);"); if( i8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i8 = int8(i);"); if( i8 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i8 = int8(i8);"); if( i8 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i8 = int8(i16);"); if( i8 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i8 = int8(i64);"); if( i8 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i8 = d;"); if( i8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i8 = f;"); if( i8 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i8 = ui;"); if( i8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i8 = ui8;"); if( i8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i8 = ui16;"); if( i8 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i8 = ui64;"); if( i8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i8 = i;"); if( i8 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i8 = i8;"); if( i8 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i8 = i16;"); if( i8 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i8 = i64;"); if( i8 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i8 = 12.3; "); if( i8 != 12 ) fail = true; engine->ExecuteString(0, "i8 = -12.3f;"); if( i8 != - 12 ) fail = true; engine->ExecuteString(0, "i8 = 123; "); if( i8 != 123 ) fail = true; engine->ExecuteString(0, "i8 = -123; "); if( i8 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "i16 = int16(d);"); if( i16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i16 = int16(f);"); if( i16 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i16 = int16(ui);"); if( i16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i16 = int16(ui8);"); if( i16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i16 = int16(ui16);"); if( i16 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i16 = int16(ui64);"); if( i16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i16 = int16(i);"); if( i16 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i16 = int16(i8);"); if( i16 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i16 = int16(i16);"); if( i16 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i16 = int16(i64);"); if( i16 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "i16 = d;"); if( i16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "i16 = f;"); if( i16 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "i16 = ui;"); if( i16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "i16 = ui8;"); if( i16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "i16 = ui16;"); if( i16 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "i16 = ui64;"); if( i16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "i16 = i;"); if( i16 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "i16 = i8;"); if( i16 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "i16 = i16;"); if( i16 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "i16 = i64;"); if( i16 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i16 = 12.3; "); if( i16 != 12 ) fail = true; engine->ExecuteString(0, "i16 = -12.3f;"); if( i16 != - 12 ) fail = true; engine->ExecuteString(0, "i16 = 123; "); if( i16 != 123 ) fail = true; engine->ExecuteString(0, "i16 = -123; "); if( i16 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "ui64 = uint64(d);"); if( ui64 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui64 = uint64(f);"); if( ui64 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "ui64 = uint64(ui);"); if( ui64 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui64 = uint64(ui8);"); if( ui64 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui64 = uint64(ui16);"); if( ui64 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui64 = uint64(ui64);"); if( ui64 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui64 = uint64(i);"); if( ui64 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "ui64 = uint64(i8);"); if( ui64 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "ui64 = uint64(i16);"); if( ui64 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "ui64 = uint64(i64);"); if( ui64 != -123 ) fail = true; d = 12.3; engine->ExecuteString(0, "ui64 = d;"); if( ui64 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui64 = f;"); if( ui64 != - 12 ) fail = true; ui = 123; engine->ExecuteString(0, "ui64 = ui;"); if( ui64 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui64 = ui8;"); if( ui64 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui64 = ui16;"); if( ui64 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui64 = ui64;"); if( ui64 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui64 = i;"); if( ui64 != -123 ) fail = true; i8 = -123; engine->ExecuteString(0, "ui64 = i8;"); if( ui64 != -123 ) fail = true; i16 = -123; engine->ExecuteString(0, "ui64 = i16;"); if( ui64 != -123 ) fail = true; i64 = -123; engine->ExecuteString(0, "ui64 = i64;"); if( ui64 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "ui64 = 12.3; "); if( ui64 != 12 ) fail = true; engine->ExecuteString(0, "ui64 = -12.3f;"); if( ui64 != - 12 ) fail = true; engine->ExecuteString(0, "ui64 = 123; "); if( ui64 != 123 ) fail = true; engine->ExecuteString(0, "ui64 = -123; "); if( ui64 != -123 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "ui = uint(d);"); if( ui != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui = uint(f);"); if( ui != asUINT(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui = uint(ui);"); if( ui != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui = uint(ui8);"); if( ui != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui = uint(ui16);"); if( ui != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui = uint(ui64);"); if( ui != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui = uint(i);"); if( ui != asUINT(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui = uint(i8);"); if( ui != asUINT(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui = uint(i16);"); if( ui != asUINT(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui = uint(i64);"); if( ui != asUINT(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui = d;"); if( ui != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui = f;"); if( ui != asUINT(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui = ui;"); if( ui != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui = ui8;"); if( ui != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui = ui16;"); if( ui != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui = ui64;"); if( ui != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui = i;"); if( ui != asUINT(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui = i8;"); if( ui != asUINT(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui = i16;"); if( ui != asUINT(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui = i64;"); if( ui != asUINT(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "ui = 12.3; "); if( ui != 12 ) fail = true; engine->ExecuteString(0, "ui = -12.3f;"); if( ui != asUINT(-12) ) fail = true; engine->ExecuteString(0, "ui = 123; "); if( ui != 123 ) fail = true; engine->ExecuteString(0, "ui = -123; "); if( ui != asUINT(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "ui8 = uint8(d);"); if( ui8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui8 = uint8(f);"); if( ui8 != asBYTE(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui8 = uint8(ui);"); if( ui8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui8 = uint8(ui8);"); if( ui8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui8 = uint8(ui16);"); if( ui8 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui8 = uint8(ui64);"); if( ui8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui8 = uint8(i);"); if( ui8 != asBYTE(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui8 = uint8(i8);"); if( ui8 != asBYTE(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui8 = uint8(i16);"); if( ui8 != asBYTE(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui8 = uint8(i64);"); if( ui8 != asBYTE(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui8 = d;"); if( ui8 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui8 = f;"); if( ui8 != asBYTE(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui8 = ui;"); if( ui8 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui8 = ui8;"); if( ui8 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui8 = ui16;"); if( ui8 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui8 = ui64;"); if( ui8 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui8 = i;"); if( ui8 != asBYTE(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui8 = i8;"); if( ui8 != asBYTE(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui8 = i16;"); if( ui8 != asBYTE(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui8 = i64;"); if( ui8 != asBYTE(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "ui8 = 12.3; "); if( ui8 != 12 ) fail = true; engine->ExecuteString(0, "ui8 = -12.3f;"); if( ui8 != asBYTE(-12) ) fail = true; // asBYTE(-12.3f) doesn't seem to produce the same result on MSVC and GNUC engine->ExecuteString(0, "ui8 = 123; "); if( ui8 != 123 ) fail = true; engine->ExecuteString(0, "ui8 = -123; "); if( ui8 != asBYTE(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); d = 12.3; engine->ExecuteString(0, "ui16 = uint16(d);"); if( ui16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui16 = uint16(f);"); if( ui16 != asWORD(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui16 = uint16(ui);"); if( ui16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui16 = uint16(ui8);"); if( ui16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui16 = uint16(ui16);"); if( ui16 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui16 = uint16(ui64);"); if( ui16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui16 = uint16(i);"); if( ui16 != asWORD(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui16 = uint16(i8);"); if( ui16 != asWORD(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui16 = uint16(i16);"); if( ui16 != asWORD(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui16 = uint16(i64);"); if( ui16 != asWORD(-123) ) fail = true; d = 12.3; engine->ExecuteString(0, "ui16 = d;"); if( ui16 != 12 ) fail = true; f = -12.3f; engine->ExecuteString(0, "ui16 = f;"); if( ui16 != asWORD(-12) ) fail = true; ui = 123; engine->ExecuteString(0, "ui16 = ui;"); if( ui16 != 123 ) fail = true; ui8 = 123; engine->ExecuteString(0, "ui16 = ui8;"); if( ui16 != 123 ) fail = true; ui16 = 123; engine->ExecuteString(0, "ui16 = ui16;"); if( ui16 != 123 ) fail = true; ui64 = 123; engine->ExecuteString(0, "ui16 = ui64;"); if( ui16 != 123 ) fail = true; i = -123; engine->ExecuteString(0, "ui16 = i;"); if( ui16 != asWORD(-123) ) fail = true; i8 = -123; engine->ExecuteString(0, "ui16 = i8;"); if( ui16 != asWORD(-123) ) fail = true; i16 = -123; engine->ExecuteString(0, "ui16 = i16;"); if( ui16 != asWORD(-123) ) fail = true; i64 = -123; engine->ExecuteString(0, "ui16 = i64;"); if( ui16 != asWORD(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "ui16 = 12.3; "); if( ui16 != 12 ) fail = true; engine->ExecuteString(0, "ui16 = -12.3f;"); if( ui16 != asWORD(-12) ) fail = true; // asWORD(-12.3f) doesn't seem to produce the same result on MSVC and GNUC engine->ExecuteString(0, "ui16 = 123; "); if( ui16 != 123 ) fail = true; engine->ExecuteString(0, "ui16 = -123; "); if( ui16 != asWORD(-123) ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); engine->ExecuteString(0, "TestDouble(d); TestFloat(d); TestInt(d); TestI16(d); TestI8(d); TestUInt(d); TestUI16(d); TestUI8(d);"); engine->ExecuteString(0, "TestDouble(f); TestFloat(f); TestInt(f); TestI16(f); TestI8(f); TestUInt(f); TestUI16(f); TestUI8(f);"); engine->ExecuteString(0, "TestDouble(ui); TestFloat(ui); TestInt(ui); TestI16(ui); TestI8(ui); TestUInt(ui); TestUI16(ui); TestUI8(ui);"); engine->ExecuteString(0, "TestDouble(ui8); TestFloat(ui8); TestInt(ui8); TestI16(ui8); TestI8(ui8); TestUInt(ui8); TestUI16(ui8); TestUI8(ui8);"); engine->ExecuteString(0, "TestDouble(ui16); TestFloat(ui16); TestInt(ui16); TestI16(ui16); TestI8(ui16); TestUInt(ui16); TestUI16(ui16); TestUI8(ui16);"); engine->ExecuteString(0, "TestDouble(ui64); TestFloat(ui64); TestInt(ui64); TestI16(ui64); TestI8(ui64); TestUInt(ui64); TestUI16(ui64); TestUI8(ui64);"); engine->ExecuteString(0, "TestDouble(i); TestFloat(i); TestInt(i); TestI16(i); TestI8(i); TestUInt(i); TestUI16(i); TestUI8(i);"); engine->ExecuteString(0, "TestDouble(i8); TestFloat(i8); TestInt(i8); TestI16(i8); TestI8(i8); TestUInt(i8); TestUI16(i8); TestUI8(i8);"); engine->ExecuteString(0, "TestDouble(i16); TestFloat(i16); TestInt(i16); TestI16(i16); TestI8(i16); TestUInt(i16); TestUI16(i16); TestUI8(i16);"); engine->ExecuteString(0, "TestDouble(i64); TestFloat(i64); TestInt(i64); TestI16(i64); TestI8(i64); TestUInt(i64); TestUI16(i64); TestUI8(i64);"); d = 0; i8 = -22; engine->ExecuteString(0, "d = d + i8"); if( d != -22 ) fail = true; engine->ExecuteString(0, "int[] a(1); a[0] = 0; a[0] == 1"); engine->ExecuteString(0, "ui + i"); engine->ExecuteString(0, "int a = 0, ui = 0; (a+ui)&1;"); // There is no bitwise conversion between uint to float anymore // f = 0; engine->ExecuteString(0, "f = float(0x3f800000)"); if( f != 1 ) fail = true; bout.buffer = ""; engine->SetMessageCallback(asMETHOD(CBufferedOutStream,Callback), &bout, asCALL_THISCALL); engine->ExecuteString(0, "i == ui"); if( bout.buffer != "ExecuteString (1, 3) : Warning : Signed/Unsigned mismatch\n" ) fail = true; bout.buffer = ""; int r; // TODO: PPC: We cannot allow this with PPC // Allow the conversion of a type to another even for reference parameters (C++ doesn't allow this) r = engine->ExecuteString(0, "TestDoubleByRef(d); TestFloatByRef(d); TestIntByRef(d); TestI16ByRef(d); TestI8ByRef(d); TestUIntByRef(d); TestUI16ByRef(d); TestUI8ByRef(d);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(f); TestFloatByRef(f); TestIntByRef(f); TestI16ByRef(f); TestI8ByRef(f); TestUIntByRef(f); TestUI16ByRef(f); TestUI8ByRef(f);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui); TestFloatByRef(ui); TestIntByRef(ui); TestI16ByRef(ui); TestI8ByRef(ui); TestUIntByRef(ui); TestUI16ByRef(ui); TestUI8ByRef(ui);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui8); TestFloatByRef(ui8); TestIntByRef(ui8); TestI16ByRef(ui8); TestI8ByRef(ui8); TestUIntByRef(ui8); TestUI16ByRef(ui8); TestUI8ByRef(ui8);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui16); TestFloatByRef(ui16); TestIntByRef(ui16); TestI16ByRef(ui16); TestI8ByRef(ui16); TestUIntByRef(ui16); TestUI16ByRef(ui16); TestUI8ByRef(ui16);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(ui64); TestFloatByRef(ui64); TestIntByRef(ui64); TestI16ByRef(ui64); TestI8ByRef(ui64); TestUIntByRef(ui64); TestUI16ByRef(ui64); TestUI8ByRef(ui64);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i); TestFloatByRef(i); TestIntByRef(i); TestI16ByRef(i); TestI8ByRef(i); TestUIntByRef(i); TestUI16ByRef(i); TestUI8ByRef(i);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i8); TestFloatByRef(i8); TestIntByRef(i8); TestI16ByRef(i8); TestI8ByRef(i8); TestUIntByRef(i8); TestUI16ByRef(i8); TestUI8ByRef(i8);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i16); TestFloatByRef(i16); TestIntByRef(i16); TestI16ByRef(i16); TestI8ByRef(i16); TestUIntByRef(i16); TestUI16ByRef(i16); TestUI8ByRef(i16);"); if( r < 0 ) fail = true; r = engine->ExecuteString(0, "TestDoubleByRef(i64); TestFloatByRef(i64); TestIntByRef(i64); TestI16ByRef(i64); TestI8ByRef(i64); TestUIntByRef(i64); TestUI16ByRef(i64); TestUI8ByRef(i64);"); if( r < 0 ) fail = true; engine->SetMessageCallback(asMETHOD(COutStream,Callback), &out, asCALL_THISCALL); asIScriptModule *mod = engine->GetModule(0, asGM_ALWAYS_CREATE); mod->AddScriptSection("script", script, strlen(script)); mod->Build(); // This test is to make sure that the float is in fact converted to a double engine->ExecuteString(0, "TestScript();"); // Make sure uint and int can be converted to bits when using the ~ operator engine->ExecuteString(0, "uint x = 0x34; x = ~x;"); engine->ExecuteString(0, "int x = 0x34; x = ~x;"); engine->Release(); if( fail ) printf("%s: failed\n", TESTNAME); // Success return fail; }
/** * @brief 誘導交差点情報設定 */ static UINT16 RT_TBL_GetGuideDir(RT_CROSSINFO_t *crs_p) { INT32 angle; DOUBLE l_real_x; DOUBLE l_real_y; DOUBLE c_x,c_y,i_x,i_y,o_x,o_y; UINT16 dir; UINT16 ilp; UINT16 case_f = 0; UINT32 base_id; INT32 xsft,ysft; INT32 angle_wk; SC_LOG_DebugPrint(SC_TAG_RT, SC_LOG_START); if (NULL == crs_p) { SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] ERROR " HERE); return (ALLF16); } l_real_x = RT_real_x; l_real_y = RT_real_y; // 進入パーセルを中心とした3×3左下パーセル算出 base_id = SC_MESH_SftParcelId(crs_p->link[0].id.parcel_id, -1, -1); // 進入座標取得 i_x = (DOUBLE)(crs_p->link[0].point.pos[ crs_p->link[0].point.vol - 2 ].x + 4096); // 左下パーセルからの相対値 i_x *= l_real_x; // 実長変換 i_y = (DOUBLE)(crs_p->link[0].point.pos[ crs_p->link[0].point.vol - 2 ].y + 4096); // 左下パーセルからの相対値 i_y *= l_real_y; // 実長変換 // 中心座標取得 c_x = (DOUBLE)(crs_p->link[0].point.pos[ crs_p->link[0].point.vol - 1 ].x + 4096); // 左下パーセルからの相対値 c_x *= l_real_x; // 実長変換 c_y = (DOUBLE)(crs_p->link[0].point.pos[ crs_p->link[0].point.vol - 1 ].y + 4096); // 左下パーセルからの相対値 c_y *= l_real_y; // 実長変換 // 退出座標取得 SC_MESH_GetAlterPos(base_id, crs_p->link[1].id.parcel_id, 1, (INT32 *)&xsft, (INT32 *)&ysft); o_x = (DOUBLE)(crs_p->link[1].point.pos[1].x + (4096 * xsft)); // 左下パーセルからの相対値 o_x *= l_real_x; // 実長変換 o_y = (DOUBLE)(crs_p->link[1].point.pos[1].y + (4096 * ysft)); // 左下パーセルからの相対値 o_y *= l_real_y; // 実長変換 // 進入座標と中心座標、もしくは中心座標と退出座標が同一の場合 if ((CompareDouble(i_x, c_x) && CompareDouble(i_y, c_y)) || (CompareDouble(o_x, c_x) && CompareDouble(o_y, c_y))) { return (TURN_EX); // TODO } // 角度計算 angle = RT_LIB_GetCrossAngle(i_x, i_y, c_x, c_y, o_x, o_y); if ((0 > angle) || (360 < angle)) { SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] ERROR " HERE); return (ALLF16); } // 案内方向取得 dir = RT_TURNDIR_TBL[ RT_GET_ANGLE_NO(angle) ]; #if 0 switch(dir){ case TURN_ST: SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] angle = %d (直進)" ,angle);break; case TURN_UT: SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] angle = %d (直戻)" ,angle);break; case TURN_FR: SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] angle = %d (右前)" ,angle);break; case TURN_R: SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] angle = %d (右)" ,angle);break; case TURN_BR: SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] angle = %d (右後)" ,angle);break; case TURN_FL: SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] angle = %d (左前)" ,angle);break; case TURN_L: SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] angle = %d (左)" ,angle);break; case TURN_BL: SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] angle = %d (左後)" ,angle);break; } #endif // 直進以外と判断 if (TURN_ST != dir) { return (dir); } // 以下、直進補正 for (ilp = 2 ; ilp < crs_p->link_vol ; ilp++) { // 歩道とかはスキップ if (SC_MA_ROAD_TYPE_ATHER <= crs_p->link[ilp].road_type) { continue; } // 退出方向=リンク順方向 if (0 == crs_p->link[ilp].id.link_dir) { // 通行不可 if ((0 != crs_p->link[ilp].onway_code) && (1 != crs_p->link[ilp].onway_code)) { continue; } // 退出方向=リンク逆方向 } else { // 通行不可 if ((0 != crs_p->link[ilp].onway_code) && (2 != crs_p->link[ilp].onway_code)) { continue; } } // 退出座標取得 SC_MESH_GetAlterPos(base_id, crs_p->link[ilp].id.parcel_id, 1, (INT32 *)&xsft, (INT32 *)&ysft); o_x = (DOUBLE)(crs_p->link[ilp].point.pos[1].x + (4096 * xsft)); // 左下パーセルからの相対値 o_x *= l_real_x; // 実長変換 o_y = (DOUBLE)(crs_p->link[ilp].point.pos[1].y + (4096 * ysft)); // 左下パーセルからの相対値 o_y *= l_real_y; // 実長変換 // 進入座標と中心座標、もしくは中心座標と退出座標が同一の場合 if ((CompareDouble(i_x, c_x) && CompareDouble(i_y, c_y)) || (CompareDouble(o_x, c_x) && CompareDouble(o_y, c_y))) { continue; // 進入or退出リンク長0の場合は、非経路と判定しない為、スキップ } // 角度計算 angle_wk = RT_LIB_GetCrossAngle(i_x, i_y, c_x, c_y, o_x, o_y); if ((0 > angle_wk) || (360 < angle_wk)) { SC_LOG_ErrorPrint(SC_TAG_RT, "[TBL] ERROR " HERE); return (ALLF16); } // 非経路にも直進あり if (TURN_ST == RT_TURNDIR_TBL[ RT_GET_ANGLE_NO(angle_wk) ]){ // 進入・退出は道路種別・リンク種別ともに一致 if ((crs_p->link[0].road_type == crs_p->link[1].road_type) && (crs_p->link[0].link_kind == crs_p->link[1].link_kind) ) { // 進入・非経路は道路種別かリンク種別が不一致 if ((crs_p->link[0].road_type != crs_p->link[ilp].road_type) || (crs_p->link[0].link_kind != crs_p->link[ilp].link_kind) ) { case_f = 0; // 退出が道なりと判断 } else { case_f = 2; // 道なり方向は角度差で決める } } else { // 進入・非経路は道路種別かリンク種別が不一致 if ((crs_p->link[0].road_type != crs_p->link[ilp].road_type) || (crs_p->link[0].link_kind != crs_p->link[ilp].link_kind) ) { case_f = 2; // 道なり方向は角度差で決める } else { case_f = 1; // 非経路が道なりと判断 } } switch (case_f) { case 0: break; case 1: // 角度同値の場合は変更せず if (angle != angle_wk) { if (angle < angle_wk) { dir = TURN_FR; // 非経路から見て右寄り } else { dir = TURN_FL; // 非経路から見て左寄り } } break; case 2: // 角度同値の場合は変更せず if (angle != angle_wk) { // 非経路の方が、退出より直進 if ((abs(180 - angle)) > (abs(180 - angle_wk))) { // 退出は右寄り if (180 >= angle) { dir = TURN_FR; // 非経路から見て右寄り // 退出は左寄り } else { dir = TURN_FL; // 非経路から見て左寄り } } } break; default: break; } } } SC_LOG_DebugPrint(SC_TAG_RT, SC_LOG_END); return (dir); }