Q&A

  • 모의주행을 표현하려합니다.
지도상에서 차량이 모의주행하는것을 표현하려 합니다.

예를 들어

차량이 이동한 좌표 100개를 1초에 한개씩 점을 찍는다고 했을때

Timer 를 어떻게 써야하는지 감을 잘 못잡겠습니다.

좌표100개는 배열에 저장되어있는 상태구요..
배열에 있는 값을 1초마다 불러 디스플레이하는 함수에다 넣어주면 되는데...

Timer의 시작시점, OnTimer, 끝낼 지점이 궁금합니다.
1  COMMENTS
  • Profile
    홍성락 2003.01.18 07:26
    전역변수를 사용해보세요
    전역변수 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//////////////////////////////////////////