procedure TFrmMain.Button1Click(Sender: TObject);
begin
i := 1;
Timer1.Enabled := not Timer1.Enabled;
end;
procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
inc(i);
CAR_MOVE(i);
end;
참고로 도로를 따라가게하는 알고리즘을 적어봅니다.
GIS에서 말하는 맵매칭입니다
// 두 지점을 가지고 있는 직선(_p1, _p2)에서 임의의 지점(_pt)과 가장 가까운 곳에 있는 지점(_ptRes)을 구하는 방법입니다.
// Vector 공식입니다.
+ _pt
.
.
+-------------*---------+
_p1 _ptRes _p2
아래에서
factor < 0.0 : _p1의 바깥쪽에 존재합니다.
0.0 <= *factor <= 1.0 : _p1와 _p2사이에 존재합니다.
0.0에 가까우면 _p1에 근접 1.0에 가까우면 _p2에 근접, 0.5면 중간위치
factor > 1.0 : _p2의 바깥쪽에 존재합니다.
---------------------------------------------------------
for VCnt := 1 to pILineString.Count-1 do begin
v_ab_X := pILineString.Point[VCnt+1].X - pILineString.Point[VCnt].X;
V_ab_Y := pILineString.Point[VCnt+1].Y - pILineString.Point[VCnt].Y;
line_len := SQRT(SQR(v_ab_X)+SQR(v_ab_Y));
v_ac_X := XX - pILineString.Point[VCnt].X;
v_ac_Y := YY - pILineString.Point[VCnt].Y;
전역변수 i일때
procedure TFrmMain.Button1Click(Sender: TObject);
begin
i := 1;
Timer1.Enabled := not Timer1.Enabled;
end;
procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
inc(i);
CAR_MOVE(i);
end;
참고로 도로를 따라가게하는 알고리즘을 적어봅니다.
GIS에서 말하는 맵매칭입니다
// 두 지점을 가지고 있는 직선(_p1, _p2)에서 임의의 지점(_pt)과 가장 가까운 곳에 있는 지점(_ptRes)을 구하는 방법입니다.
// Vector 공식입니다.
+ _pt
.
.
+-------------*---------+
_p1 _ptRes _p2
아래에서
factor < 0.0 : _p1의 바깥쪽에 존재합니다.
0.0 <= *factor <= 1.0 : _p1와 _p2사이에 존재합니다.
0.0에 가까우면 _p1에 근접 1.0에 가까우면 _p2에 근접, 0.5면 중간위치
factor > 1.0 : _p2의 바깥쪽에 존재합니다.
---------------------------------------------------------
for VCnt := 1 to pILineString.Count-1 do begin
v_ab_X := pILineString.Point[VCnt+1].X - pILineString.Point[VCnt].X;
V_ab_Y := pILineString.Point[VCnt+1].Y - pILineString.Point[VCnt].Y;
line_len := SQRT(SQR(v_ab_X)+SQR(v_ab_Y));
v_ac_X := XX - pILineString.Point[VCnt].X;
v_ac_Y := YY - pILineString.Point[VCnt].Y;
_factor := ((v_ab_X*v_ac_X) + (v_ab_Y*v_ac_Y)) / (line_len*line_len);
if (_factor > 0)and(_factor < 1)then begin
_ptRes_X := pILineString.Point[VCnt].X + (v_ab_X * _factor);
_ptRes_Y := pILineString.Point[VCnt].Y + (v_ab_Y * _factor);
I_Distance2 := SQRT(SQR(ABS(XX-_ptRes_X))+SQR(ABS(YY-_ptRes_Y)));
//I_Distance2 := SQRT(SQR(ABS(pILineString.Point[VCnt].X-_ptRes_X))+SQR(ABS(pILineString.Point[VCnt].Y-_ptRes_Y)));
//I_Distance2 := I_Distance2-(_factor)*(_factor)*line_len;
if MinDistance > I_Distance2 then begin
MinDistance := I_Distance2;
New_XX := _ptRes_X;
New_YY := _ptRes_Y;
end;
end;
end;
hsr//////////////////////////////////////////