要は点(マウスカーソル)と直線を最短距離で結び、その交点を求めたいという事でしょうか?
であるならマウスカーソルのポイントをP(x0,y0)とします。
まず直線A(m1*x+n1)に直交し、Pを通る直線B(m2*x+n2)の傾きm2を求めます。
m2 = -1 / m1;
BはPを通るので
y0 = m2*x0 + n2→n2 = y0 - m2*x0
これで直線Bが求まりました。
AとBの交点(x1,y1)を求めます。
m1*x1+n1 = m2*x1+n2→x1 = (n2 - n1) / (m1 - m2)
y1 = m1 * x1 + n1
やっつけですがサンプルを作ってみました。(線上の赤い点がマウスカーソルにあわせて移動します)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HPEN red_pen = CreatePen( PS_SOLID , 2 , RGB(255,0,0) );
static POINT last_point;
static POINT point_on_line;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
MoveToEx( hdc , 0 , 50 , NULL );
LineTo( hdc , 640 , 480 + 50 );
SelectObject( hdc , red_pen );
Ellipse( hdc , point_on_line.x - 3 , point_on_line.y -3 , point_on_line.x + 3 , point_on_line.y + 3 );
EndPaint(hWnd, &ps);
break;
case WM_MOUSEMOVE:
{
double x0 = (double)LOWORD(lParam);
double y0 = (double)HIWORD(lParam);
double n1 = 50.0f;
double m1 = 480.0 / 640.0;
double m2 = -1.0 / m1;
double n2 = y0 - m2*x0;
double x1 = (n2 - n1) / (m1 - m2);
double y1 = m1 * x1 + n1;
point_on_line.x = (int)x1;
point_on_line.y = (int)y1;
InvalidateRect( hWnd , NULL , TRUE );
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
「遊び」に関しては
(x0,y0)と(x1,y1)の距離から判定すれば良いと思います。
お礼
わざわざサンプルを作っていただきありがとうございます。 プログラムが下手なのでちょっと挙動がおかしいですが、 それらしいものはできました。とても参考になりました。 ありがとうございました。