/* * ***************************************************************** * * * * * Copyright (c) Fast Corporation, 1998 * * * * * * All Rights Reserved. Unpublished rights reserved under * * * the copyright laws of the Japan. * * * * * * The software contained on this media is proprietary to * * * and embodies the confidential technology of Fast * * * Corporation. Possession, use, duplication or * * * dissemination of the software and media is authorized only * * * pursuant to a valid written license from Fast Corporation. * * * * * ***************************************************************** */ /* CSC90X ビジョンツールライブラリ 単純多角形に対する点の位置判定 CG_POS.C */ /*[作成者]Satoshi.Masuda */ /* 目的: 関数: 履歴: Ver 1.0 99.03.25 // 初版 注記:m_menu.hをインクルードして下さい。 m_menu.c及びm_note.cをリンクして下さい。 */ /* * Include compiler runtime library */ #include #include /* * Include CSC90X library */ #include "f_stdlib.h" #include "f_time.h" #include "f_gui.h" #include "f_stdio.h" #include "f_graph.h" #include "f_image.h" #include "f_pinf.h" #include "f_video.h" #include "f_system.h" #include "f_cmpgeo.h" /* * Include CSC90X common local */ #include "m_menu.h" /* プロトタイプ */ void main( void ); void main_menu_disp( void ); void disp_help( void ); static int determ_polygon( WPNT2_T [] ); static void display_polygon( WPNT2_T [],int ); static void trial_pos_pnt_to_smpl_plygn( WPNT2_T [], int ); static int restricted_cursor( WPNT2_T *,int,int,int,int ); /* リンク */ extern int message_note( void ); /* * メニュー項目 */ #define LANG_N 2 #define MAIN_MENU_N 4 static const char *str_main_menu[MAIN_MENU_N][LANG_N] = { { " INPUT ", "多角形設定" }, { " EXEC ", " 実 行 " }, { " PROC3 ", " 処理3 " }, { " PROC4 ", " 処理4 " } }; #define INIT_CUR_POS_X 255 #define INIT_CUR_POS_Y 239 #define CURSOR_INDEFINITE 0 /* カーソルのどちらのキーも押下されていない */ #define MAX_VRTX_NUM 256 /* 多角形の頂点の最大数 */ #define MX 15 /* 処理範囲のX方向マージン */ #define MY 40 /* 処理範囲のY方向マージン */ #define VX 45 /* 頂点数表示のx方向位置 */ #define VY 29 /* 頂点数表示のy方向位置 */ #define TX 300 /* 処理時間表示のx方向位置 */ #define TY 5 /* 処理時間表示のy方向位置 */ /* メイン */ void main( void ) { int sts; int xpos; int ypos; int s_xpos; int s_ypos; WPNT2_T *plygn; /* 多角形 */ int vrtx_num = -1; /* 多角形の頂点数 */ /* 初期メッセージ表示 */ if( NORMAL_RETURN != message_note() ) return; /* パラメタ初期化 */ xpos = INIT_CUR_POS_X; ypos = INIT_CUR_POS_Y; s_xpos = INIT_CUR_POS_X; s_ypos = INIT_CUR_POS_Y; /* 入力ビデオ制御 */ Lib_input_video_control( GRAY_PLANE ); /* ビデオ出力表示項目制御 */ Lib_display_control( GRAY_PLANE | LINE_PLANE | CHAR_PLANE ); /* ビデオ表示項目クリア */ Lib_memory_clear( GRAY_PLANE | LINE_PLANE | CHAR_PLANE ); /* カーソル初期化 */ Lib_init_cursor(); /* メインメニューの表示 */ main_menu_disp(); /* マウスカーソルの表示 */ Lib_draw_cursor( INIT_CUR_POS_X, INIT_CUR_POS_Y ); /* メモリの確保 */ if( NULL == ( plygn = ( WPNT2_T * )Lib_mlalloc( sizeof( WPNT2_T )* MAX_VRTX_NUM ) ) ) { /* メモリ不足 */ Lib_display_keyinput( 5, 450, " メモリ不足のため試行できません " ); return; } else { Lib_look_current_position( &xpos, &ypos ); /* カーソル位置取得 */ for (;;) /* メニュー制御 */ { sts = Lib_see_current_position( &xpos, &ypos ); /* マウス位置読みとり */ if ( s_xpos != xpos || s_ypos != ypos ) { /* マウス表示位置移動 */ Lib_move_cursor( xpos, ypos ); s_xpos = xpos; s_ypos = ypos; } /* 処理振り分け */ if( CURSOR_EXECUTE == sts ) { if ( xpos > MENU_1_XS && xpos < MENU_1_XE && ypos > MENU_1_YS && ypos < MENU_1_YE ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); vrtx_num = determ_polygon( plygn ); /* 多角形を決める */ main_menu_disp(); } else if ( xpos > MENU_2_XS && xpos < MENU_2_XE && ypos > MENU_2_YS && ypos < MENU_2_YE ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); display_polygon( plygn, vrtx_num ); /* 多角形の再描画 */ if( PLYGN_SIMPLE == Lib_cg_smpl_plygn_check(plygn, vrtx_num ) ) trial_pos_pnt_to_smpl_plygn( plygn, vrtx_num ); else Lib_display_message(50,50,"ERROR","単純多角形ではありません"); Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); main_menu_disp(); } else if ( xpos > MENU_H_XS && xpos < MENU_H_XE && ypos > MENU_H_YS && ypos < MENU_H_YE ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); disp_help(); /* ヘルプ */ main_menu_disp(); } else if ( xpos > MENU_E_XS && xpos < MENU_E_XE && ypos > MENU_E_YS && ypos < MENU_E_YE ) { break; /* 終了 */ } Lib_look_current_position( &xpos, &ypos ); /* カーソル位置取得 */ } } /* メモリの解放 */ Lib_lfree( ( char * )plygn ); } } /* 多角形を設定 */ static int determ_polygon( WPNT2_T plygn[] /* 多角形 */ ) { int key_stts; /* カーソルのキー押下状況 */ int vrtx_num; /* 頂点の数 */ char str[ 64 ]; /* 頂点の数を表示 */ int sx, sy, ex, ey; /* 頂点の取りうる範囲 */ WPNT2_T pnt; /* 点=カーソル位置 */ /* 頂点の数の初期化 */ vrtx_num = 0; /* 頂点の取りうる範囲 */ sx = MX; sy = MY; ex = Lib_get_fx_size( ) - MX - 1; ey = Lib_get_fy_size( ) - MY - 1; /* 操作の説明 */ Lib_chrdisp( 1, 1, " 頂点の登録→実行キー、終了→取消キー " ); /* カーソル位置の初期化 */ pnt.x = ( sx + ex + 1 )/ 2; pnt.y = ( sy + ey + 1 )/ 2; for(;;) { /* 最初の点を決める */ if( CURSOR_EXECUTE == restricted_cursor( &pnt, sx, sy, ex, ey ) ) { /* 最初の頂点の登録 */ plygn[ vrtx_num ] = pnt; Lib_drawcircle( pnt.x, pnt.y, 1 ); Lib_drawcircle( pnt.x, pnt.y, 2 ); vrtx_num ++; /* 頂点の数を表示 */ Lib_sprintf( str, "Vertex Num = %4d", vrtx_num ); Lib_chrdisp( VX, VY, str ); break; } } for(;;) { /* 取消キーが押されたら終了 */ if( CURSOR_CANCEL == ( key_stts = restricted_cursor( &pnt, sx, sy, ex, ey ) ) ) { /* 最後の一辺を書いて終了 */ Lib_drawline( plygn[ 0 ].x, plygn[ 0 ].y, plygn[ vrtx_num - 1 ].x, plygn[ vrtx_num - 1 ].y ); break; } /* 実行キーが押されたら、その時のカーソル位置を頂点の位置として登録 */ else if( CURSOR_EXECUTE == key_stts ) { plygn[ vrtx_num ] = pnt; Lib_drawcircle( pnt.x, pnt.y, 1 ); Lib_drawcircle( pnt.x, pnt.y, 2 ); Lib_drawline( plygn[ vrtx_num ].x, plygn[ vrtx_num ].y, plygn[ vrtx_num - 1 ].x, plygn[ vrtx_num - 1 ].y ); vrtx_num ++; /* 頂点の数を表示 */ Lib_sprintf( str, "Vertex Num = %4d", vrtx_num ); Lib_chrdisp( VX, VY, str ); /* 頂点の数が最大数に達したら登録を終了する */ if( MAX_VRTX_NUM == vrtx_num ) { Lib_display_keyinput( 5, 450, " これ以上頂点を登録することはできません " ); break; } } } /* 操作の説明の消去 */ Lib_chrdisp( 1, 1, " " ); /* 頂点の数を返す */ return( vrtx_num ); } /***** 制限付カーソル(カーソルの動ける範囲を限定) *****/ static int restricted_cursor( WPNT2_T *pnt, /* カーソルの位置座標 */ int sx, int sy, int ex, int ey /* カーソルの動ける範囲 */ ) { int key_stts; /* キー押下状況 */ int x, y; /* カーソルの位置 */ static int x_old=-1, y_old=-1; /* 前回のカーソル位置 */ /* キー押下状況の初期化 */ key_stts = CURSOR_INDEFINITE; /* カーソル位置の初期化 */ x = pnt->x; y = pnt->y; /* カーソルの位置を取得 */ key_stts = Lib_see_current_position( &x, &y ); /* カーソルの動きの制限 */ if( x < sx ) x = sx; if( y < sy ) y = sy; if( ex < x ) x = ex; if( ey < y ) y = ey; /* カーソルの移動 */ if( x_old != x || y_old != y ) { Lib_move_cursor( x, y ); x_old = x; y_old = y; } if( 0 == Lib_get_cursor_mode() ) /* カーソルは消去中? */ Lib_draw_cursor( x, y ); /* カーソルの描画 */ /* カーソルの位置 */ pnt->x = x; pnt->y = y; /* 返値;キー押下状態 */ return( key_stts ); } /***** Lib_cg_pos_pnt_to_smpl_plygn の試行 *****/ static void trial_pos_pnt_to_smpl_plygn( WPNT2_T plygn[ ], /* 単純多角形 */ int vrtx_num /* 頂点数 */ ) { WPNT2_T pnt; /* 位置判定する点 */ WPNT2_T old_pnt; /* 前の点 */ int sx, sy, ex, ey; /* 点の動く範囲 */ int position; /* 多角形に対する点の位置 */ /* 試行の説明 */ Lib_chrdisp( 1, 1, "試行を終了→取消キー" ); /* 点の動く範囲 */ sx = MX; sy = MY; ex = Lib_get_fx_size() - MX - 1; ey = Lib_get_fy_size() - MY - 1; /* 点=カーソルの位置の初期化(適当) */ pnt.x = 256; pnt.y = 240; old_pnt.x = 255; old_pnt.y = 240; for(;;) { /* キャンセルキーが押されたら終了 */ if( CURSOR_CANCEL == restricted_cursor( &pnt, sx, sy, ex, ey ) ) break; /* 点が変わっていたら内部判定を実行 */ if( pnt.x != old_pnt.x || pnt.y != old_pnt.y ) { /* 位置判定 */ position = Lib_cg_pos_pnt_to_smpl_plygn( pnt, plygn, vrtx_num ); /* 位置の表示 */ if( INNER_PNT == position ) Lib_display_comment( TX, TY, " INNER_PNT " ); else if( OUTER_PNT == position ) Lib_display_comment( TX, TY, " OUTER_PNT " ); else if( BOUNDARY_PNT == position ) Lib_display_comment( TX, TY, " BOUNDARY_PNT " ); old_pnt = pnt; } } } /***** 多角形を表示 *****/ static void display_polygon( WPNT2_T plygn[ ], /* 多角形 */ int vrtx_num /* 頂点数 */ ) { int sx, sy, ex, ey; /* 多角形の辺 */ char str[ 64 ]; /* 頂点数表示文字列 */ int i; /* 多角形の描画 */ ex = plygn[ vrtx_num - 1 ].x; ey = plygn[ vrtx_num - 1 ].y; for( i = 0 ; i < vrtx_num ; i ++ ) { /* 辺 */ sx = ex; sy = ey; ex = plygn[ i ].x; ey = plygn[ i ].y; /* 頂点をすこし大き目の点で描画 */ Lib_drawcircle( sx, sy, 1 ); Lib_drawcircle( sx, sy, 2 ); /* 辺の描画 */ Lib_drawline( sx, sy, ex, ey ); } /* 頂点数の表示文字列 */ Lib_sprintf( str, "Vertex Num = %4d", vrtx_num ); Lib_chrdisp( VX, VY, str ); } /* * メインメニュー表示 */ static void main_menu_disp( void ) { int iLanguage; /* 日本語/英語表示文字列切替情報取得 */ iLanguage = Lib_get_disp_language(); /* 整列キー表示 -> ( m_menu.c ) */ SUB_menu_disp4he( (char *)str_main_menu[0][iLanguage], (char *)str_main_menu[1][iLanguage], (char *)NULL, (char *)NULL ); } /* * ヘルプ表示 */ static void disp_help( void ) { int fx_size, fy_size; fx_size = Lib_get_fx_size(); fy_size = Lib_get_fy_size(); Lib_view( 0, 0, fx_size-1, fy_size-1, GRAPH_ERAS ); #ifdef __CSC902__ Lib_chrdisp( 10, 8, "【機能\概要】 CG_POS.EXE " ); #elif defined __CSC903__ Lib_chrdisp( 10, 8, "【機能\概要】 CG_POS.903 " ); #else Lib_chrdisp( 10, 8, "【機能\概要】 CG_POS.BIN " ); #endif Lib_chrdisp( 9, 10, "与えられた単純多角形に対して質問点(=判定したい点)が" ); Lib_chrdisp( 9, 11, "どの位置にあるかどうかを判定します。"); Lib_chrdisp( 9, 12, "作成できる単純多角形は256角形までです。" ); Lib_chrdisp( 9, 14, "INNER_PNT :点が多角形の内部にある(境界上は含まない)" ); Lib_chrdisp( 9, 15, "OUTER_PNT :点が多角形の外部にある(境界上は含まない)" ); Lib_chrdisp( 9, 16, "BOUNDARY_PNT :点が多角形の辺(境界)上にある" ); Lib_display_keyinput( 400, 300, "確 認" ); Lib_memory_clear( CHAR_PLANE ); Lib_view( 0, 0, fx_size-1, fy_size-1, GRAPH_DRAW ); }