;--asファイル読み込み---------------------- #include "e3dhsp3.as" #include "hspmath.as" ;--初期設定------------------------------- title "交点計算・線と線" screen 0, 600, 600 ;--ウィンドウ設定 dim keybuf, 256 ;--キーチェック変数 RGB_Text=255,218,000 ;--文字色 RGB_Back=080,080,080 ;--背景色 centerX=double(ginfo(12)/2) ;--中心位置X centerZ=double(ginfo(13)/2) ;--中心位置Z ;--ボールAの設定 A_RGB=255,127,127 ;--色 A_SIZE=10.0 ;--半径 AX=double(ginfo(12)/2-200) ;--初期位置X AZ=double(ginfo(13)/2-200) ;--初期位置Z ;--ボールBの設定 B_RGB=127,127,255 ;--色 B_SIZE=10.0 ;--半径 BX=double(ginfo(12)/2-200) ;--初期位置X BZ=double(ginfo(13)/2+200) ;--初期位置Z ;--ボールCの設定 C_RGB=127,255,127 ;--色 C_SIZE=10.0 ;--半径 CX=double(ginfo(12)/2+200) ;--初期位置X CZ=double(ginfo(13)/2-200) ;--初期位置Z ;--ボールDの設定 D_RGB=255,255,127 ;--色 D_SIZE=10.0 ;--半径 DX=double(ginfo(12)/2+200) ;--初期位置X DZ=double(ginfo(13)/2+200) ;--初期位置Z ;--交点の大きさ CRS = 5 ;--モジュール-------------------------------- #module LL ;--交点計算・線と線 /* 引数 ax,az (Aの座標) avx,avz (Aから伸びるベクトル) bx,bz (Bの座標) bvx,bvz (Bから伸びるベクトル) 返り値 CRX@crs,CRZ@crs (交点座標) t@crs (交点に到達する倍率) CRS@crs (交点が線分(ラインCD)の間に入っているかを表す数値。CRS@LLが0以下なら入っている) */ #deffunc crsLL double ax, double az, double avx, double avz, double bx, double bz, double bvx, double bvz ;--ラインAB ABX = avx - ax ABZ = avz - az ;--ラインCD CDX = bvx - bx CDZ = bvz - bz ;--ラインCDを時計回りに90度回転させる(法線) EX = -CDZ EZ = CDX ;--法線の正規化 E3DVec3Normalize EX, 0.0, EZ, EX, EY, EZ ;--交点に到達する倍率(t)を求める式 div2 = EX*ABX + EZ*ABZ if div2 { ;--倍率計算 t = -(EX*ax+EZ*az-(bx*EX+bz*EZ))/div2 ;--交点位置計算 CRX = ax + ABX * t CRZ = az + ABZ * t ;--交点が線分(ラインCD)の間に入っているか調べる CRS = (CRX-bx)*(CRX-bvx) + (CRZ-bz)*(CRZ-bvz) } return #global ;--メイン----------------------------------- *main redraw 0 ;--キーチェック E3DGetKeyboardcnt keybuf ;--終了[ESC] if keybuf.VK_ESCAPE : end ;--ボールのドラッグ移動 gosub *ball ;--交点計算 crsLL AX,AZ,BX,BZ, CX,CZ,DX,DZ ;--ライン描画 ;--フォント太字化 font msgothic, 18, font_bold ;--背景塗りつぶし color RGB_Back(0), RGB_Back(1), RGB_Back(2) : boxf ;--ラインAB color B_RGB(0),B_RGB(1),B_RGB(2) : line AX,AZ,BX,BZ ;--ラインCD color D_RGB(0),D_RGB(1),D_RGB(2) : line CX,CZ,DX,DZ ;--交点 if CRS@LL<0 : color 255,000,000 : circle CRX@LL-CRS, CRZ@LL-CRS, CRX@LL+CRS, CRZ@LL+CRS ;--ボールA表示 color A_RGB(0),A_RGB(1),A_RGB(2) circle AX-A_SIZE, AZ-A_SIZE, AX+A_SIZE, AZ+A_SIZE, 0 color 255, 255, 255 : pos AX-20, AZ-20 : mes "A" ;--ボールB表示 color B_RGB(0),B_RGB(1),B_RGB(2) circle BX-B_SIZE, BZ-B_SIZE, BX+B_SIZE, BZ+B_SIZE, 0 color 255, 255, 255 : pos BX-20, BZ-20 : mes "B" ;--ボールC表示 color C_RGB(0),C_RGB(1),C_RGB(2) circle CX-C_SIZE, CZ-C_SIZE, CX+C_SIZE, CZ+C_SIZE, 0 color 255, 255, 255 : pos CX-20, CZ-20 : mes "C" ;--ボールD表示 color D_RGB(0),D_RGB(1),D_RGB(2) circle DX-D_SIZE, DZ-D_SIZE, DX+D_SIZE, DZ+D_SIZE, 0 color 255, 255, 255 : pos DX-20, DZ-20 : mes "D" ;--フォント初期化 sysfont ;--文字表示 color 255, 255, 255 : pos 5, 5 mes "t = "+t@LL redraw 1 wait 1 goto *main ;--サブ------------------------------------------------------------- ;--ボールのドラッグ移動 *ball ;--ボールA if key_lock_B+key_lock_C+key_lock_D=0 { if keybuf.VK_LBUTTON : E3DVec3Length double(mouseX)-AX, 0.0, double(mouseY)-AZ, distance if distance